pax_global_header00006660000000000000000000000064146057570520014525gustar00rootroot0000000000000052 comment=e4c8bd947b6524bb2fd93c3598e48818acf00307 flask-peewee-3.0.6/000077500000000000000000000000001460575705200141035ustar00rootroot00000000000000flask-peewee-3.0.6/.github/000077500000000000000000000000001460575705200154435ustar00rootroot00000000000000flask-peewee-3.0.6/.github/workflows/000077500000000000000000000000001460575705200175005ustar00rootroot00000000000000flask-peewee-3.0.6/.github/workflows/tests.yaml000066400000000000000000000007401460575705200215270ustar00rootroot00000000000000name: Tests on: [push] jobs: tests: name: ${{ matrix.python-version }} runs-on: ubuntu-latest strategy: fail-fast: false matrix: python-version: [3.7, "3.10"] steps: - uses: actions/checkout@v2 - uses: actions/setup-python@v2 with: python-version: ${{ matrix.python-version }} - name: pip deps run: pip install peewee flask wtforms wtf-peewee - name: runtests run: python runtests.py flask-peewee-3.0.6/.readthedocs.yaml000066400000000000000000000001471460575705200173340ustar00rootroot00000000000000version: 2 build: os: ubuntu-22.04 tools: python: "3.11" sphinx: configuration: docs/conf.py flask-peewee-3.0.6/LICENSE000066400000000000000000000020421460575705200151060ustar00rootroot00000000000000Copyright (c) 2011 Charles Leifer 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. flask-peewee-3.0.6/MANIFEST.in000066400000000000000000000002131460575705200156350ustar00rootroot00000000000000include LICENSE include README.rst recursive-include docs * recursive-include example * recursive-include flask_peewee * prune docs/_build flask-peewee-3.0.6/README.rst000066400000000000000000000060511460575705200155740ustar00rootroot00000000000000This package is in maintenance-only mode! ========================================= I'm sorry to announce that flask-peewee will now be in maintenance-only mode. This decision is motivated by a number of factors: * `Flask-Admin `_ provides a superior admin interface and has support for peewee models. * `Flask-Security `_ and `Flask-Login `_ both provide authentication functionality, and work well with Peewee. * Most importantly, though, I do not find myself wanting to work on flask-peewee. I plan on rewriting the ``Database`` and ``REST API`` portions of flask-peewee and repackaging them as a new library, but flask-peewee as it stands currently will be in maintenance-only mode. flask-peewee ============ provides a layer of integration between the `flask `_ web framework and the `peewee orm `_. batteries included: * admin interface * authentication * rest api requirements: * `flask `_ * `peewee `_ * `wtforms `_ * `wtf-peewee `_ * python 2.5 or greater check out the `documentation `_. admin interface --------------- influenced heavily by the `django `_ admin, provides easy create/edit/delete functionality for your project's models. .. image:: http://i.imgur.com/EtzdO.jpg rest api -------- influenced by `tastypie `_, provides a way to expose a RESTful interface for your project's models. :: curl localhost:5000/api/user/ { "meta": { "model": "user", "next": "", "page": 1, "previous": "" }, "objects": [ { "username": "admin", "admin": true, "email": "", "join_date": "2011-09-16 18:34:49", "active": true, "id": 1 }, { "username": "coleifer", "admin": false, "email": "coleifer@gmail.com", "join_date": "2011-09-16 18:35:56", "active": true, "id": 2 } ] } installing ---------- I recommend installing in a virtualenv. to get started:: # create a new virtualenv virtualenv --no-site-packages project cd project/ source bin/activate # install this project (will install dependencies as well) pip install flask-peewee example app ----------- the project ships with an example app, which is a silly twitter clone. to start the example app, ``cd`` into the "example" directory and execute the ``run_example.py`` script:: cd example/ python run_example.py if you would like to test out the admin area, log in as "admin/admin" and navigate to: http://127.0.0.1:5000/admin/ you can check out the REST api at the following url: http://127.0.0.1:5000/api/message/ flask-peewee-3.0.6/docs/000077500000000000000000000000001460575705200150335ustar00rootroot00000000000000flask-peewee-3.0.6/docs/Makefile000066400000000000000000000110061460575705200164710ustar00rootroot00000000000000# 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-peewee.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/flask-peewee.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-peewee" @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/flask-peewee" @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-peewee-3.0.6/docs/_static/000077500000000000000000000000001460575705200164615ustar00rootroot00000000000000flask-peewee-3.0.6/docs/_static/peewee.jpg000066400000000000000000000271501460575705200204420ustar00rootroot00000000000000JFIF``C    #%$""!&+7/&)4)!"0A149;>>>%.DIC;C  ;("(;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;(" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?7|$g>•O#Ҙsϣ r3(X@r{t4I91=47 uCq nH"j$dpW< i c~P}Ȥ"B/_ {wۀ*K|V%Fp;j;ɭ"6F1 9!y'<)NGA1r0F,sPs_4s Q9,Uy89iqOj@!$1J Lyk߅rw5mclbMyj0rSQn.͹8S'4͓p~5fY$٦y-Ý?Z9v_ ݜxcZqvǨ#BH8j ycB}T[4YUw_ُݒ,bhA w^4:]>HuxgdHFe5(U}`qmpRK҇Q{{o87$γr 4`/4)iv cp@a^ ¶sӌzJN*ᖛqspW FXcjD zPe#JRYO9#SR>##+;9qnە@, ȗ|<8Tɞц +v_G>h _$R^i,%+ɇ4ўq{"&]{E)XT1*KՉR)wڼ°$d쬍'v:indu/ TXXuޜpO3*&F8 XqW'MhG('BƭFli=:3ˍpv[163Y1S2}*lAbr>\'rLFg*裌W@3=M0qr69R`l>9k(${Q`:oe &㯽W{s"q?Lm? R=pæ5[Hx#!ޠm ~au1bH##y>.TpJvOck;K 5/'}yp~$T7v~!aK>YHOz ڻ(-C :$2|g5TI$9.0ki#=OZp$ Bvqg¬J+Wvy{C&;rqdctk< rncJw[Iwl~^{MGs *?j&lCՒQX>?94|jpLӥRXЯcc=jŽȸS-M.pR\֚"ŏ}Pҫ&<=S2ͷ,p=4aʰ cޱ.teHɁ?εXlHQ#2S`bHHP۱$#,phǥ!anzzT^ ԃ85o|=y$sR'gɬ?k i 6ZP,Ey{%bQW)")k˹''nƱgzI\NJԳ38Tn˔1jK)W޹S$sv%m(=֙ \Sy C1ژ;Tq؊x gE("$q;wi(Ӗw݀WOs=xҋ BG׶N*bA?( x'ShUk%9m?,6gqRj}E7Me`B썱݄/x+ė6icPY\nӭy3C3,l q^g RY|5um\IE1XuֺiIY)7{eZ:Mܬ(2X T⻟ѯe_ڤxCSF5kp"<`1sfD /^*)28ҸԬVqmipσqyq3s^} # 8l5?a#}I$~eZ&&*/8)~ZxF;;$x&bv7.٭ٰ%Cչk~<7 :{c~ػ۩jcڪY]nCSXw[C2r|x?cJo ܌s2+/yr m >o\ kK_B- *@0qڲ!re'麮Gxߕesl]pje?4ָDPĎ:\5C ozk]QֵVYȽ@$?k֭HȎ5;wڵeu2m%$**hl鍬uFr>8<ӌm8Ssj7$p1Tlvy$zvC? ?ۮ*̪ޘ\ |1ZpW= NZ\d[v6~0Cڝ< n02քHs>01ڞFFI֚F1"g;RO=:p7};q~ B6.\L=lғ$ C%so$d;*&GW?gxfmIaY&kG:N`P)TZi Eӎiˡ/˅Gݮ,㶈e5[mcUA$bmr(gh* [s*'Fjݔݞ+TEU\Os&s;P*}^iZqiGn>Cz:> )jǟŸp:Ktsڱ2<,VĺPy{V(N1ߨKRTaT]4nd~I?J1 GSZ:.itڜeaHߊI_a]s36)Y< se,? -uZH_ ƹߋb.׉'${NA+KóO'KٹP%82ȹ,[27s9y^J;[^kP7AXε25MaJqێ+&G,ܓK#,yU?+ ZBW__~lhLnZ9n)RͬmnVZ! \zQX9;O=ym 81|H'gh* dz,Z}= `|Vi#/#5}؞k1KroJjʻHۃtSMŇbyІ@ydd`S)c;6:d_Ii4{?G\ǴI>O-_GbNGcG'$Nua)>칣09A^=T+=vFz{zvcp=3X!@zԭΣQc9c*R6S(eG@^3vmፖ6=9Qn!Қ|<e?#կQHj ~sWJ9C|{S(sIGzոy@w[1tc%pAnKR]ە;e7q݁=4o!?(֞7Gi2;VP: ep#Z(ܒ8L$lMJn}dJs̍NhCƒ+!${Vkg<GPN=(N”y&3u[6&F#Mh=3XnY]cirCN8{w x“*&Eݸ${U`x֖f,AVT rLG(Y~XڔyE"NP)qXbb:oDiV'?\J|d @JgX)kq8${W%s`VvIs^ կ&t |,If(~Sq'$9մ6NK#,{K}vIzS<@=xHh\\C~UAsgjGv-0=ZosqKA9Ur9Unn+m pNF+H129O89 iץ[.,r}R6G&N1ʑ`G'*Ұ qКtSֹLK6f T>"BW+[=Е0O]EIpdl'ZۘO~+ȣ+G)ڠQKk$"@ S85= n#'r;3Cڝ 8rE™ 8!H8Mi.)$5=ADZ5Aw+n#l|ǞOQFpA-$5>jpnI8$zաڥ֨Xvb1]TMi{>fc!mմ2K46$}+ p8HAfP*(l`+- EKI=*94_|-t&EG Nj̯ځX܎Ɲt%߷(X^ b'cs]%Gu+P]]Ɠ;Om#g'5oͬo&1ymk^}eb`=V..lH0)Zfn[͸E G0e/<3gqA4hԅy$'%+wO.fA; $\FJM+!I'oaaەS!՝WP G.zUky6qVՙ`(H#>5夐NW?x5=tے=G ha@tMTSҥ@H=h` gZ2ŲҞ |0 m$`мlGqY m 9+e9RRS.r` <q6nۗT4kj$% 9#T/bflȷmI[ϋ?:ɸ8&gKҴǟ->7ID*˕e=sJ.,>hӡw|u=+&@SC[9Y .yϭ ’ԩ [I|jt[j)'*zsֹ-O0q+Ga֪NǨޤZ.>lf[hFHZܵVaz'WcG/^lLX|?RYus8*WqfJ/d˷AZ(桹Jsֺmn.m#%qt8 "@T͜ԣ^6[h+-BۓWYw."1HÑJj̺R#94sPC)ç#'gsPp?&̉ьd`Ҟ>n }(=~x$PQ]lE@&ymtCܑ1O~NAMGccE" r*ͱcV-y^08䊟h+ǩ",5z++)<]n`|=jxfSEmVʸjo|1's61[;oM8+1=oWh k#y>f5=1K]X}4Eas4jPS /sfoۆVk&fێFLJgw:DP6'kG4%ʐ# 0ݩq]K m]n;݇*dݘP1 _SEC<(ܣ' [ZΉv3 >f|_ұMk 4SRF:baޕPd* Š3@@+\k| ZAk, ǭ`G,L:`22zjv!#!9#t-dj{B8\~SVU.RRvPI}jxÇTnCKCZ-sQx>PWEH\ZΑE$d]jAa)?,dYݷLvj:=MA9D*Fx5%60UC `pw|~5QcH03`F*t2v%5hy2\Jf,aӓ]f(P!~|ϭr:/dـ$ ۬IkQ!_L66uLŤ]wړU MڡpA ;/}wM Hߵ ,xU۷ y<'qq 6,W5k_I#>G}A#1hh[C7$'"[m5A*E929TcWӅߕm)6~mpgKִEpp©M\Cƈ>h9#1F TKi+,`K!zb|Y QbNE%`zWV0rЏJo_۴Ypq94qyxlQ]e2U47 a|ϸ,3Zv[UV|Kem0VZO8짊"BCGklkՌ O~ֻT-jGk& 3iwJ$ q+EVivv(ٵQ)v y:Eq^-#I6=ܒh!dUXnJ_i{Ң9t-EΟ lu"ӭsz]ȵ>plgškoݏ=%`SKɽy= u3${,L*]0;>x R)Ppx4j_Fz˓u-}#|o#:j{븏~2o)f &G+IG .X!b !\mbRO"Zv3DoXzܿA!9=k|Ł$q\ Lٟ@OZ:DB#y0OJ ʪyҡ#n=GR UZ% odnhr@'}64[OI |n#~T5%PAcϭ^h#ݸeF)ZՐҥh;2"HqO,Hzm_hPW9#'>#I ѡIz1'ޤhYB<'jƮ@1 3*D`I&F3 J dhFyJ( Vt{of5Sߎ#fSc6z|(2/ǜSersp1-ϚGXj`{EsKsѦflask-peewee-3.0.6/docs/_themes/000077500000000000000000000000001460575705200164575ustar00rootroot00000000000000flask-peewee-3.0.6/docs/_themes/flask/000077500000000000000000000000001460575705200175575ustar00rootroot00000000000000flask-peewee-3.0.6/docs/_themes/flask/layout.html000066400000000000000000000013561460575705200217670ustar00rootroot00000000000000{%- extends "basic/layout.html" %} {%- block extrahead %} {{ super() }} {% if theme_touch_icon %} {% endif %} {% endblock %} {%- block relbar2 %}{% endblock %} {% block header %} {{ super() }} {% if pagename == 'index' %}
{% endif %} {% endblock %} {%- block footer %} {% if pagename == 'index' %}
{% endif %} {%- endblock %} flask-peewee-3.0.6/docs/_themes/flask/relations.html000066400000000000000000000011161460575705200224440ustar00rootroot00000000000000

Related Topics

flask-peewee-3.0.6/docs/_themes/flask/static/000077500000000000000000000000001460575705200210465ustar00rootroot00000000000000flask-peewee-3.0.6/docs/_themes/flask/static/flasky.css_t000066400000000000000000000144441460575705200234030ustar00rootroot00000000000000/* * 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; } {% 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 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-peewee-3.0.6/docs/_themes/flask/static/small_flask.css000066400000000000000000000017201460575705200240500ustar00rootroot00000000000000/* * 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-peewee-3.0.6/docs/_themes/flask/theme.conf000066400000000000000000000002441460575705200215300ustar00rootroot00000000000000[theme] inherit = basic stylesheet = flasky.css pygments_style = flask_theme_support.FlaskyStyle [options] index_logo = '' index_logo_height = 120px touch_icon = flask-peewee-3.0.6/docs/admin.rst000066400000000000000000000243341460575705200166630ustar00rootroot00000000000000.. _admin-interface: Admin Interface =============== Many web applications ship with an "admin area", where priveleged users can view and modify content. By introspecting your application's models, flask-peewee can provide you with straightforward, easily-extensible forms for managing your application content. Here's a screen-shot of the admin dashboard: .. image:: fp-admin.jpg Getting started --------------- To get started with the admin, there are just a couple steps: 1. Instantiate an :py:class:`Auth` backend for your project -- this component is responsible for providing the security for the admin area .. code-block:: python from flask import Flask from flask_peewee.auth import Auth from flask_peewee.db import Database app = Flask(__name__) db = Database(app) # needed for authentication auth = Auth(app, db) 2. Instantiate an :py:class:`Admin` object .. code-block:: python # continued from above... from flask_peewee.admin import Admin admin = Admin(app, auth) 3. Register any :py:class:`ModelAdmin` or :py:class:`AdminPanel` objects you would like to expose via the admin .. code-block:: python # continuing... assuming "Blog" and "Entry" models admin.register(Blog) # register "Blog" with vanilla ModelAdmin admin.register(Entry, EntryAdmin) # register "Entry" with a custom ModelAdmin subclass # assume we have an "AdminPanel" called "NotePanel" admin.register_panel('Notes', NotePanel) 4. Call :py:meth:`Admin.setup()`, which registers the admin blueprint and configures the urls .. code-block:: python # after all models and panels are registered, configure the urls admin.setup() .. note:: For a complete example, check the :ref:`example` which ships with the project. Customizing how models are displayed ------------------------------------ We'll use the "Message" model taken from the `example app `_, which looks like this: .. code-block:: python class Message(db.Model): user = ForeignKeyField(User) content = TextField() pub_date = DateTimeField(default=datetime.datetime.now) def __unicode__(self): return '%s: %s' % (self.user, self.content) If we were to simply register this model with the admin, it would look something like this: .. code-block:: python admin = Admin(app, auth) admin.register(Message) admin.setup() .. image:: fp-message-admin.jpg A quick way to improve the appearance of this view is to specify which columns to display. To start customizing how the ``Message`` model is displayed in the admin, we'll subclass :py:class:`ModelAdmin`. .. code-block:: python from flask_peewee.admin import ModelAdmin class MessageAdmin(ModelAdmin): columns = ('user', 'content', 'pub_date',) admin.register(Message, MessageAdmin) admin.setup() Now the admin shows all the columns and they can be clicked to sort the data: .. image:: fp-message-admin-2.jpg Suppose privacy is a big concern, and under no circumstances should a user be able to see another user's messages -- even in the admin. This can be done by overriding the :py:meth:`~ModelAdmin.get_query` method: .. code-block:: python def get_query(self): return self.model.select().where(self.model.user == g.user) Now a user will only be able to see and edit their own messages. Overriding Admin Templates ^^^^^^^^^^^^^^^^^^^^^^^^^^ Use the :py:meth:`ModelAdmin.get_template_overrides` method to override templates for an individual ``Model``: .. code-block:: python class MessageAdmin(ModelAdmin): columns = ('user', 'content', 'pub_date',) def get_template_overrides(self): # override the edit template with a custom one return {'edit': 'messages/admin/edit.html'} admin.register(Message, MessageAdmin) This instructs the admin to use a custom template for the edit page in the Message admin. That template is stored in the application's templates. It might look something like this: .. code-block:: jinja {% extends "admin/models/edit.html" %} {# override the default edit template #} {# override any blocks here #} There are five templates that can be overridden: * index * add * edit * delete * export Nicer display for Foreign Key fields ------------------------------------ If you have a model that foreign keys to another, by default the related model instances are displayed in a

{% endblock %} A panel can provide as many urls and views as you like. These views will all be protected by the same authentication as other parts of the admin area. Handling File Uploads --------------------- Flask and wtforms both provide support for handling file uploads (on the server and generating form fields). Peewee, however, does not have a "file field" -- generally I store a path to a file on disk and thus use a ``CharField`` for the storage. Here's a very simple example of a "photo" model and a ``ModelAdmin`` that enables file uploads. .. code-block:: models.py # models.py import datetime import os from flask import Markup from peewee import * from werkzeug import secure_filename from app import app, db class Photo(db.Model): image = CharField() def __unicode__(self): return self.image def save_image(self, file_obj): self.image = secure_filename(file_obj.filename) full_path = os.path.join(app.config['MEDIA_ROOT'], self.image) file_obj.save(full_path) self.save() def url(self): return os.path.join(app.config['MEDIA_URL'], self.image) def thumb(self): return Markup('' % self.url()) .. code-block:: python # admin.py from flask import request from flask_peewee.admin import Admin, ModelAdmin from wtforms.fields import FileField, HiddenField from wtforms.form import Form from app import app, db from auth import auth from models import Photo admin = Admin(app, auth) class PhotoAdmin(ModelAdmin): columns = ['image', 'thumb'] def get_form(self, adding=False): class PhotoForm(Form): image = HiddenField() image_file = FileField(u'Image file') return PhotoForm def save_model(self, instance, form, adding=False): instance = super(PhotoAdmin, self).save_model(instance, form, adding) if 'image_file' in request.files: file = request.files['image_file'] instance.save_image(file) return instance admin.register(Photo, PhotoAdmin) flask-peewee-3.0.6/docs/api.rst000066400000000000000000001165151460575705200163470ustar00rootroot00000000000000.. _api: API === Admin ----- .. py:class:: Admin(app, auth[, blueprint_factory[, template_helper[, prefix]]]) Class used to expose an admin area at a certain url in your application. The Admin object implements a flask blueprint and acts as the central registry for models and panels you wish to expose in the admin. The Admin object coordinates the registration of models and panels and provides a method for ensuring a user has permission to access the admin area. The Admin object requires an :py:class:`Auth` instance when being instantiated, which in turn requires a Flask app and a py:class:`Database` wrapper. Here is an example of how you might instantiate an Admin object: .. code-block:: python from flask import Flask from flask_peewee.admin import Admin from flask_peewee.auth import Auth from flask_peewee.db import Database app = Flask(__name__) db = Database(app) # needed for authentication auth = Auth(app, db) # instantiate the Admin object for our project admin = Admin(app, auth) :param app: flask application to bind admin to :param auth: :py:class:`Auth` instance which will provide authentication :param blueprint_factory: an object that will create the ``BluePrint`` used by the admin :param template_helper: a subclass of :py:class:`AdminTemplateHelper` that provides helpers and context to used by the admin templates :param prefix: url to bind admin to, defaults to ``/admin`` .. py:method:: register(model[, admin_class=ModelAdmin]) Register a model to expose in the admin area. A :py:class:`ModelAdmin` subclass can be provided along with the model, allowing for customization of the model's display and behavior. Example usage: .. code-block:: python # will use the default ModelAdmin subclass to display model admin.register(BlogModel) class EntryAdmin(ModelAdmin): columns = ('title', 'blog', 'pub_date',) admin.register(EntryModel, EntryAdmin) .. warning:: All models must be registered before calling :py:meth:`~Admin.setup` :param model: peewee model to expose via the admin :param admin_class: :py:class:`ModelAdmin` or subclass to use with given model .. py:method:: register_panel(title, panel) Register a :py:class:`AdminPanel` subclass for display in the admin dashboard. Example usage: .. code-block:: python class HelloWorldPanel(AdminPanel): template_name = 'admin/panels/hello.html' def get_context(self): return { 'message': 'Hello world', } admin.register_panel('Hello world', HelloWorldPanel) .. warning:: All panels must be registered before calling :py:meth:`~Admin.setup` :param title: identifier for panel, example might be "Site Stats" :param panel: subclass of :py:class:`AdminPanel` to display .. py:method:: setup() Configures urls for models and panels, then registers blueprint with the Flask application. Use this method when you have finished registering all the models and panels with the admin object, but before starting the WSGI application. For a sample implementation, check out ``example/main.py`` in the example application supplied with flask-peewee. .. code-block:: python # register all models, etc admin.register(...) # finish up initialization of the admin object admin.setup() if __name__ == '__main__': # run the WSGI application app.run() .. note:: call ``setup()`` **after** registering your models and panels .. py:method:: check_user_permission(user) Check whether the given user has permission to access to the admin area. The default implementation simply checks whether the ``admin`` field is checked, but you can provide your own logic. This method simply controls access to the admin area as a whole. In the event the user is **not** permitted to access the admin (this function returns ``False``), they will receive a HTTP Response Forbidden (403). Default implementation: .. code-block:: python def check_user_permission(self, user): return user.admin :param user: the currently logged-in user, exposed by the :py:class:`Auth` instance :rtype: Boolean .. py:method:: auth_required(func) Decorator that ensures the requesting user has permission. The implementation first checks whether the requesting user is logged in, and if not redirects to the login view. If the user *is* logged in, it calls :py:meth:`~Admin.check_user_permission`. Only if this call returns ``True`` is the actual view function called. .. py:method:: get_urls() Get a tuple of 2-tuples mapping urls to view functions that will be exposed by the admin. The default implementation looks like this: .. code-block:: python def get_urls(self): return ( ('/', self.auth_required(self.index)), ) This method provides an extension point for providing any additional "global" urls you would like to expose. .. note:: Remember to decorate any additional urls you might add with :py:meth:`~Admin.auth_required` to ensure they are not accessible by unauthenticated users. Exposing Models with the ModelAdmin ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. py:class:: ModelAdmin Class that determines how a peewee ``Model`` is exposed in the admin area. Provides a way of encapsulating model-specific configuration and behaviors. Provided when registering a model with the :py:class:`Admin` instance (see :py:meth:`Admin.register`). .. py:attribute:: columns List or tuple of columns should be displayed in the list index. By default if no columns are specified the ``Model``'s ``__unicode__()`` will be used. .. note:: Valid values for columns are the following: * field on a model * attribute on a model instance * callable on a model instance (called with no parameters) If a column is a model field, it will be sortable. .. code-block:: python class EntryAdmin(ModelAdmin): columns = ['title', 'pub_date', 'blog'] .. py:attribute:: filter_exclude Exclude certain fields from being exposed as filters. Related fields can be excluded using "__" notation, e.g. ``user__password`` .. py:attribute:: filter_fields Only allow filtering on the given fields .. py:attribute:: exclude A list of field names to exclude from the "add" and "edit" forms .. py:attribute:: fields Only display the given fields on the "add" and "edit" form .. py:attribute:: paginate_by = 20 Number of records to display on index pages .. py:attribute:: filter_paginate_by = 15 Default pagination when filtering in a modal dialog .. py:attribute:: delete_collect_objects = True Collect and display a list of "dependencies" when deleting .. py:attribute:: delete_recursive = True Delete "dependencies" recursively .. py:method:: get_query() Determines the list of objects that will be exposed in the admin. By default this will be all objects, but you can use this method to further restrict the query. This method is called within the context of a request, so you can access the ``Flask.request`` object or use the :py:class:`Auth` instance to determine the currently-logged-in user. Here's an example showing how the query is restricted based on whether the given user is a "super user" or not: .. code-block:: python class UserAdmin(ModelAdmin): def get_query(): # ask the auth system for the currently logged-in user current_user = self.auth.get_logged_in_user() # if they are not a superuser, only show them their own # account in the admin if not current_user.is_superuser: return User.select().where(User.id==current_user.id) # otherwise, show them all users return User.select() :rtype: A ``SelectQuery`` that represents the list of objects to expose .. py:method:: get_object(pk) This method retrieves the object matching the given primary key. The implementation uses :py:meth:`~ModelAdmin.get_query` to retrieve the base list of objects, then queries within that for the given primary key. :rtype: The model instance with the given pk, raising a ``DoesNotExist`` in the event the model instance does not exist. .. py:method:: get_form([adding=False]) Provides a useful extension point in the event you want to define custom fields or custom validation behavior. :param boolean adding: indicates whether adding a new instance or editing existing :rtype: A `wtf-peewee `_ Form subclass that will be used when adding or editing model instances in the admin. .. py:method:: get_add_form() Allows you to specify a different form when adding new instances versus editing existing instances. The default implementation simply calls :py:meth:`~ModelAdmin.get_form`. .. py:method:: get_edit_form() Allows you to specify a different form when editing existing instances versus adding new instances. The default implementation simply calls :py:meth:`~ModelAdmin.get_form`. .. py:method:: get_filter_form() Provide a special form for use when filtering the list of objects in the model admin's index/export views. This form is slightly different in that it is tailored for use when filtering the list of models. :rtype: A special Form instance (:py:class:`FilterForm`) that will be used when filtering the list of objects in the index view. .. py:method:: save_model(instance, form, adding=False) Method responsible for persisting changes to the database. Called by both the add and the edit views. Here is an example from the default ``auth.User`` :py:class:`ModelAdmin`, in which the password is displayed as a sha1, but if the user is adding or edits the existing password, it re-hashes: .. code-block:: python def save_model(self, instance, form, adding=False): orig_password = instance.password user = super(UserAdmin, self).save_model(instance, form, adding) if orig_password != form.password.data: user.set_password(form.password.data) user.save() return user :param instance: an unsaved model instance :param form: a validated form instance :param adding: boolean to indicate whether we are adding a new instance or saving an existing .. py:method:: get_template_overrides() Hook for specifying template overrides. Should return a dictionary containing view names as keys and template names as values. Possible choices for keys are: * index * add * edit * delete * export .. code-block:: python class UserModelAdmin(ModelAdmin): def get_template_overrides(self): return {'index': 'users/admin/index_override.html'} .. py:method:: get_urls() Useful as a hook for extending :py:class:`ModelAdmin` functionality with additional urls. .. note:: It is not necessary to decorate the views specified by this method since the :py:class:`Admin` instance will handle this during registration and setup. :rtype: tuple of 2-tuples consisting of a mapping between url and view .. py:method:: get_url_name(name) Since urls are namespaced, this function provides an easy way to get full urls to views provided by this ModelAdmin .. py:method:: process_filters(query) Applies any filters specified by the user to the given query, returning metadata about the filters. Returns a 4-tuple containing: * special ``Form`` instance containing fields for filtering * filtered query * a list containing the currently selected filters * a tree-structure containing the fields available for filtering (:py:class:`FieldTreeNode`) :rtype: A tuple as described above Extending admin functionality using AdminPanel ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. py:class:: AdminPanel Class that provides a simple interface for providing arbitrary extensions to the admin. These are displayed as "panels" on the admin dashboard with a customizable template. They may additionally, however, define any views and urls. These views will automatically be protected by the same authentication used throughout the admin area. Some example use-cases for AdminPanels might be: * Display some at-a-glance functionality in the dashboard, like stats on new user signups. * Provide a set of views that should only be visible to site administrators, for example a mailing-list app. * Control global site settings, turn on and off features, etc. .. py:attribute:: template_name What template to use to render the panel in the admin dashboard, defaults to ``'admin/panels/default.html'``. .. py:method:: get_urls() Useful as a hook for extending :py:class:`AdminPanel` functionality with custom urls and views. .. note:: It is not necessary to decorate the views specified by this method since the :py:class:`Admin` instance will handle this during registration and setup. :rtype: Returns a tuple of 2-tuples mapping url to view .. py:method:: get_url_name(name) Since urls are namespaced, this function provides an easy way to get full urls to views provided by this panel :param name: string representation of the view function whose url you want :rtype: String representing url .. code-block:: html {{ url_for(panel.get_url_name('create')) }} .. py:method:: get_template_name() Return the template used to render this panel in the dashboard. By default simply returns the template stored under :py:attr:`AdminPanel.template_name`. .. py:method:: get_context() Return the context to be used when rendering the dashboard template. :rtype: Dictionary .. py:method:: render() Render the panel template with the context -- this is what gets displayed in the admin dashboard. Auth ---- .. py:class:: Auth(app, db[, user_model=None[, prefix='/accounts']], db_table='user') The class that provides methods for authenticating users and tracking users across requests. It also provides a model for persisting users to the database, though this can be customized. The auth framework is used by the :py:class:`Admin` and can also be integrated with the :py:class:`RestAPI`. Here is an example of how to use the Auth framework: .. code-block:: python from flask import Flask from flask_peewee.auth import Auth from flask_peewee.db import Database app = Flask(__name__) db = Database(app) # needed for authentication auth = Auth(app, db) # mark a view as requiring login @app.route('/private/') @auth.login_required def private_timeline(): # get the currently-logged-in user user = auth.get_logged_in_user() Unlike the :py:class:`Admin` or the :py:class:`RestAPI`, there is no explicit ``setup()`` method call when using the Auth system. Creation of the auth blueprint and registration with the Flask app happen automatically during instantiation. .. note:: A context processor is automatically registered that provides the currently logged-in user across all templates, available as "user". If no user is logged in, the value of this will be ``None``. .. note:: A pre-request handler is automatically registered which attempts to retrieve the current logged-in user and store it on the global flask variable ``g``. :param app: flask application to bind admin to :param db: :py:class:`Database` database wrapper for flask app :param user_model: ``User`` model to use :param prefix: url to bind authentication views to, defaults to /accounts/ :param db_table: Create db table using db_table name. ``user`` is reserved keyword in postgres. .. py:attribute:: default_next_url = 'homepage' The url to redirect to upon successful login in the event a ``?next=`` is not provided. .. py:method:: get_logged_in_user() .. note:: Since this method relies on the session storage to track users across requests, this method must be called while within a ``RequestContext``. :rtype: returns the currently logged-in ``User``, or ``None`` if session is anonymous .. py:method:: login_required(func) Function decorator that ensures a view is only accessible by authenticated users. If the user is not authed they are redirected to the login view. .. note:: this decorator should be applied closest to the original view function .. code-block:: python @app.route('/private/') @auth.login_required def private(): # this view is only accessible by logged-in users return render_template('private.html') :param func: a view function to be marked as login-required :rtype: if the user is logged in, return the view as normal, otherwise returns a redirect to the login page .. py:method:: get_user_model() :rtype: Peewee model to use for persisting user data and authentication .. py:method:: get_model_admin([model_admin=None]) Provide a :py:class:`ModelAdmin` class suitable for use with the User model. Specifically addresses the need to re-hash passwords when changing them via the admin. The default implementation includes an override of the :py:meth:`ModelAdmin.save_model` method to intelligently hash passwords: .. code-block:: python class UserAdmin(model_admin): columns = ['username', 'email', 'active', 'admin'] def save_model(self, instance, form, adding=False): orig_password = instance.password user = super(UserAdmin, self).save_model(instance, form, adding) if orig_password != form.password.data: user.set_password(form.password.data) user.save() return user :param model_admin: subclass of :py:class:`ModelAdmin` to use as the base class :rtype: a subclass of :py:class:`ModelAdmin` suitable for use with the ``User`` model .. py:method:: get_urls() A mapping of url to view. The default implementation provides views for login and logout only, but you might extend this to add registration and password change views. Default implementation: .. code-block:: python def get_urls(self): return ( ('/logout/', self.logout), ('/login/', self.login), ) :rtype: a tuple of 2-tuples mapping url to view function. .. py:method:: get_login_form() :rtype: a ``wtforms.Form`` subclass to use for retrieving any user info required for login .. py:method:: authenticate(username, password) Given the ``username`` and ``password``, retrieve the user with the matching credentials if they exist. No exceptions should be raised by this method. :rtype: ``User`` model if successful, otherwise ``False`` .. py:method:: login_user(user) Mark the given user as "logged-in". In the default implementation, this entails storing data in the ``Session`` to indicate the successful login. :param user: ``User`` instance .. py:method:: logout_user(user) Mark the requesting user as logged-out :param user: ``User`` instance The BaseUser mixin ^^^^^^^^^^^^^^^^^^ .. py:class:: BaseUser() Provides default implementations for password hashing and validation. The auth framework requires two methods be implemented by the ``User`` model. A default implementation of these methods is provided by the ``BaseUser`` mixin. .. py:method:: set_password(password) Encrypts the given password and stores the encrypted version on the model. This method is useful when registering a new user and storing the password, or modifying the password when a user elects to change. .. py:method:: check_password(password) Verifies if the given plaintext password matches the encrypted version stored on the model. This method on the User model is called specifically by the :py:meth:`Auth.authenticate` method. :rtype: Boolean Database -------- .. py:class:: Database(app) The database wrapper provides integration between the peewee ORM and flask. It reads database configuration information from the flask app configuration and manages connections across requests. The db wrapper also provides a ``Model`` subclass which is configured to work with the database specified by the application's config. To configure the database specify a database engine and name: .. code-block:: python DATABASE = { 'name': 'example.db', 'engine': 'peewee.SqliteDatabase', } Here is an example of how you might use the database wrapper: .. code-block:: python # instantiate the db wrapper db = Database(app) # start creating models class Blog(db.Model): # this model will automatically work with the database specified # in the application's config. :param app: flask application to bind admin to .. py:attribute:: Model Model subclass that works with the database specified by the app's config REST API -------- .. py:class:: RestAPI(app[, prefix='/api'[, default_auth=None[, name='api']]]) The :py:class:`RestAPI` acts as a container for the various :py:class:`RestResource` objects. By default it binds all resources to ``/api//``. Much like the :py:class:`Admin`, it is a centralized registry of resources. Example of creating a ``RestAPI`` instance for a flask app: .. code-block:: python from flask_peewee.rest import RestAPI from app import app # our project's Flask app # instantiate our api wrapper api = RestAPI(app) # register a model with the API api.register(SomeModel) # configure URLs api.setup() .. note:: Like the flask admin, the ``RestAPI`` has a ``setup()`` method which must be called after all resources have been registered. :param app: flask application to bind API to :param prefix: url to serve REST API from :param default_auth: default :py:class:`Authentication` type to use with registered resources :param name: the name for the API blueprint .. py:method:: register(model[, provider=RestResource[, auth=None[, allowed_methods=None]]]) Register a model to expose via the API. :param model: ``Model`` to expose via API :param provider: subclass of :py:class:`RestResource` to use for this model :param auth: authentication type to use for this resource, falling back to :py:attr:`RestAPI.default_auth` :param allowed_methods: ``list`` of HTTP verbs to allow, defaults to ``['GET', 'POST', 'PUT', 'DELETE']`` .. py:method:: setup() Register the API ``BluePrint`` and configure urls. .. warning:: This must be called **after** registering your resources. RESTful Resources and their subclasses ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. py:class:: RestResource(rest_api, model, authentication[, allowed_methods=None]) Class that determines how a peewee ``Model`` is exposed by the Rest API. Provides a way of encapsulating model-specific configuration and behaviors. Provided when registering a model with the :py:class:`RestAPI` instance (see :py:meth:`RestAPI.register`). Should not be instantiated directly in most cases. Instead should be "registered" with a ``RestAPI`` instance. Example usage: .. code-block:: python # instantiate our api wrapper, passing in a reference to the Flask app api = RestAPI(app) # create a RestResource subclass class UserResource(RestResource): exclude = ('password', 'email',) # assume we have a "User" model, register it with the custom resource api.register(User, UserResource) .. py:attribute:: paginate_by = 20 Determines how many results to return for a given API query. .. note:: *Fewer* results can be requested by specifying a ``limit``, but ``paginate_by`` is the upper bound. .. py:attribute:: fields = None A list or tuple of fields to expose when serializing .. py:attribute:: exclude = None A list or tuple of fields to **not** expose when serializing .. py:attribute:: filter_exclude A list of fields that **cannot** be used to filter API results .. py:attribute:: filter_fields A list of fields that can be used to filter the API results .. py:attribute:: filter_recursive = True Allow filtering on related resources .. py:attribute:: include_resources A mapping of field name to resource class for handling of foreign-keys. When provided, foreign keys will be "nested". .. code-block:: python class UserResource(RestResource): exclude = ('password', 'email') class MessageResource(RestResource): include_resources = {'user': UserResource} # 'user' is a foreign key field .. code-block:: javascript /* messages without "include_resources" */ { "content": "flask and peewee, together at last!", "pub_date": "2011-09-16 18:36:15", "id": 1, "user": 2 }, /* messages with "include_resources = {'user': UserResource} */ { "content": "flask and peewee, together at last!", "pub_date": "2011-09-16 18:36:15", "id": 1, "user": { "username": "coleifer", "active": true, "join_date": "2011-09-16 18:35:56", "admin": false, "id": 2 } } .. py:attribute:: delete_recursive = True Recursively delete dependencies .. py:method:: get_query() Returns the list of objects to be exposed by the API. Provides an easy hook for restricting objects: .. code-block:: python class UserResource(RestResource): def get_query(self): # only return "active" users return self.model.select().where(active=True) :rtype: a ``SelectQuery`` containing the model instances to expose .. py:method:: prepare_data(obj, data) This method provides a hook for modifying outgoing data. The default implementation no-ops, but you could do any kind of munging here. The data returned by this method is passed to the serializer before being returned as a json response. :param obj: the object being serialized :param data: the dictionary representation of a model returned by the ``Serializer`` :rtype: a dictionary of data to hand off .. py:method:: save_object(instance, raw_data) Persist the instance to the database. The raw data supplied by the request is also available, but at the time this method is called the instance has already been updated and populated with the incoming data. :param instance: ``Model`` instance that has already been updated with the incoming ``raw_data`` :param raw_data: data provided in the request :rtype: a saved instance .. py:method:: api_list() A view that dispatches based on the HTTP verb to either: * GET: :py:meth:`~RestResource.object_list` * POST: :py:meth:`~RestResource.create` :rtype: ``Response`` .. py:method:: api_detail(pk) A view that dispatches based on the HTTP verb to either: * GET: :py:meth:`~RestResource.object_detail` * PUT: :py:meth:`~RestResource.edit` * DELETE: :py:meth:`~RestResource.delete` :rtype: ``Response`` .. py:method:: object_list() Returns a serialized list of ``Model`` instances. These objects may be filtered, ordered, and/or paginated. :rtype: ``Response`` .. py:method:: object_detail() Returns a serialized ``Model`` instance. :rtype: ``Response`` .. py:method:: create() Creates a new ``Model`` instance based on the deserialized POST body. :rtype: ``Response`` containing serialized new object .. py:method:: edit() Edits an existing ``Model`` instance, updating it with the deserialized PUT body. :rtype: ``Response`` containing serialized edited object .. py:method:: delete() Deletes an existing ``Model`` instance from the database. :rtype: ``Response`` indicating number of objects deleted, i.e. ``{'deleted': 1}`` .. py:method:: get_api_name() :rtype: URL-friendly name to expose this resource as, defaults to the model's name .. py:method:: check_get([obj=None]) A hook for pre-authorizing a GET request. By default returns ``True``. :rtype: Boolean indicating whether to allow the request to continue .. py:method:: check_post() A hook for pre-authorizing a POST request. By default returns ``True``. :rtype: Boolean indicating whether to allow the request to continue .. py:method:: check_put(obj) A hook for pre-authorizing a PUT request. By default returns ``True``. :rtype: Boolean indicating whether to allow the request to continue .. py:method:: check_delete(obj) A hook for pre-authorizing a DELETE request. By default returns ``True``. :rtype: Boolean indicating whether to allow the request to continue .. py:class:: RestrictOwnerResource(RestResource) This subclass of :py:class:`RestResource` allows only the "owner" of an object to make changes via the API. It works by verifying that the authenticated user matches the "owner" of the model instance, which is specified by setting :py:attr:`~RestrictOwnerResource.owner_field`. Additionally, it sets the "owner" to the authenticated user whenever saving or creating new instances. .. py:attribute:: owner_field = 'user' Field on the model to use to verify ownership of the given instance. .. py:method:: validate_owner(user, obj) :param user: an authenticated ``User`` instance :param obj: the ``Model`` instance being accessed via the API :rtype: Boolean indicating whether the user can modify the object .. py:method:: set_owner(obj, user) Mark the object as being owned by the provided user. The default implementation simply calls ``setattr``. :param obj: the ``Model`` instance being accessed via the API :param user: an authenticated ``User`` instance Authenticating requests to the API ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. py:class:: Authentication([protected_methods=None]) Not to be confused with the ``auth.Authentication`` class, this class provides a single method, ``authorize``, which is used to determine whether to allow a given request to the API. :param protected_methods: A list or tuple of HTTP verbs to require auth for .. py:method:: authorize() This single method is called per-API-request. :rtype: Boolean indicating whether to allow the given request through or not .. py:class:: UserAuthentication(auth[, protected_methods=None]) Authenticates API requests by requiring the requesting user be a registered ``auth.User``. Credentials are supplied using HTTP basic auth. Example usage: .. code-block:: python from auth import auth # import the Auth object used by our project from flask_peewee.rest import RestAPI, RestResource, UserAuthentication # create an instance of UserAuthentication user_auth = UserAuthentication(auth) # instantiate our api wrapper, specifying user_auth as the default api = RestAPI(app, default_auth=user_auth) # create a special resource for users that excludes email and password class UserResource(RestResource): exclude = ('password', 'email',) # register our models so they are exposed via /api// api.register(User, UserResource) # specify the UserResource # configure the urls api.setup() :param auth: an :ref:`authentication` instance :param protected_methods: A list or tuple of HTTP verbs to require auth for .. py:method:: authorize() Verifies, using HTTP Basic auth, that the username and password match a valid ``auth.User`` model before allowing the request to continue. :rtype: Boolean indicating whether to allow the given request through or not .. py:class:: AdminAuthentication(auth[, protected_methods=None]) Subclass of the :py:class:`UserAuthentication` that further restricts which users are allowed through. The default implementation checks whether the requesting user is an "admin" by checking whether the admin attribute is set to ``True``. Example usage: .. code-block:: python Authenticates API requests by requiring the requesting user be a registered ``auth.User``. Credentials are supplied using HTTP basic auth. Example usage: .. code-block:: python from auth import auth # import the Auth object used by our project from flask_peewee.rest import RestAPI, RestResource, UserAuthentication, AdminAuthentication # create an instance of UserAuthentication and AdminAuthentication user_auth = UserAuthentication(auth) admin_auth = AdminAuthentication(auth) # instantiate our api wrapper, specifying user_auth as the default api = RestAPI(app, default_auth=user_auth) # create a special resource for users that excludes email and password class UserResource(RestResource): exclude = ('password', 'email',) # register our models so they are exposed via /api// api.register(SomeModel) # specify the UserResource and require the requesting user be an admin api.register(User, UserResource, auth=admin_auth) # configure the urls api.setup() .. py:method:: verify_user(user) Verifies whether the requesting user is an administrator :param user: the ``auth.User`` instance of the requesting user :rtype: Boolean indicating whether the user is an administrator .. py:class:: APIKeyAuthentication(model, protected_methods=None) Subclass that allows you to provide an API Key model to authenticate requests with. .. note:: Must provide an API key model with at least the following two fields: * key * secret .. code-block:: python # example API key model class APIKey(db.Model): key = CharField() secret = CharField() user = ForeignKeyField(User) # instantiating the auth api_key_auth = APIKeyAuthentication(model=APIKey) :param model: a :py:class:`Database.Model` subclass to persist API keys. :param protected_methods: A list or tuple of HTTP verbs to require auth for Utilities --------- .. py:function:: get_object_or_404(query_or_model, *query) Provides a handy way of getting an object or 404ing if not found, useful for urls that match based on ID. :param query_or_model: a query or model to filter using the given expressions :param query: a list of query expressions .. code-block:: python @app.route('/blog//') def blog_detail(title): blog = get_object_or_404(Blog.select().where(Blog.active==True), Blog.title==title) return render_template('blog/detail.html', blog=blog) .. py:function:: object_list(template_name, qr[, var_name='object_list'[, **kwargs]]) Wraps the given query and handles pagination automatically. Pagination defaults to ``20`` but can be changed by passing in ``paginate_by=XX``. :param template_name: template to render :param qr: a select query :param var_name: the template variable name to use for the paginated query :param kwargs: arbitrary context to pass in to the template .. code-block:: python @app.route('/blog/') def blog_list(): active = Blog.select().where(Blog.active==True) return object_list('blog/index.html', active) .. code-block:: html <!-- template --> {% for blog in object_list %} {# render the blog here #} {% endfor %} {% if page > 1 %} <a href="./?page={{ page - 1 }}">Prev</a> {% endif %} {% if page < pagination.get_pages() %} <a href="./?page={{ page + 1 }}">Next</a> {% endif %} .. py:function:: get_next() :rtype: a URL suitable for redirecting to .. py:function:: slugify(s) Use a regular expression to make arbitrary string ``s`` URL-friendly :param s: any string to be slugified :rtype: url-friendly version of string ``s`` .. py:class:: PaginatedQuery(query_or_model, paginate_by) A wrapper around a query (or model class) that handles pagination. .. py:attribute:: page_var = 'page' The URL variable used to store the current page Example: .. code-block:: python query = Blog.select().where(Blog.active==True) pq = PaginatedQuery(query) # assume url was /?page=3 obj_list = pq.get_list() # returns 3rd page of results pq.get_page() # returns "3" pq.get_pages() # returns total objects / objects-per-page .. py:method:: get_list() :rtype: a list of objects for the request page .. py:method:: get_page() :rtype: an integer representing the currently requested page .. py:method:: get_pages() :rtype: the number of pages in the entire result set �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������flask-peewee-3.0.6/docs/auth.rst��������������������������������������������������������������������0000664�0000000�0000000�00000013120�14605757052�0016523�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. _authentication: Authentication ============== The :py:class:`Authentication` class provides a means of authenticating users of the site. It is designed to work out-of-the-box with a simple ``User`` model, but can be heavily customized. The :py:class:`Auth` system is comprised of a single class which is responsible for coordinating incoming requests to your project with known users. It provides the following: * views for login and logout * model to store user data (or you can provide your own) * mechanism for identifying users across requests (uses session storage) All of these pieces can be customized, but the default out-of-box implementation aims to provide a good starting place. The auth system is also designed to work closely with the :ref:`admin-interface`. Getting started --------------- In order to provide a method for users to authenticate with your site, instantiate an :py:class:`Auth` backend for your project: .. code-block:: python from flask import Flask from flask_peewee.auth import Auth from flask_peewee.db import Database app = Flask(__name__) db = Database(app) # needed for authentication auth = Auth(app, db) .. note:: ``user`` is reserverd keyword in Postgres. Pass db_table to Auth to override db table. Marking areas of the site as login required ------------------------------------------- If you want to mark specific areas of your site as requiring auth, you can decorate views using the :py:meth:`Auth.login_required` decorator: .. code-block:: python @app.route('/private/') @auth.login_required def private_timeline(): user = auth.get_logged_in_user() # ... display the private timeline for the logged-in user If the request comes from someone who has not logged-in with the site, they are redirected to the :py:meth:`Auth.login` view, which allows the user to authenticate. After successfully logging-in, they will be redirected to the page they requested initially. Retrieving the current user --------------------------- Whenever in a `request context <http://flask.pocoo.org/docs/reqcontext/>`_, the currently logged-in user is available by calling :py:meth:`Auth.get_logged_in_user`, which will return ``None`` if the requesting user is not logged in. The auth system also registers a pre-request hook that stores the currently logged-in user in the special flask variable ``g``. Accessing the user in the templates ----------------------------------- The auth system registers a template context processor which makes the logged-in user available in any template: .. code-block:: html {% if user %} <p>Hello {{ user.username }}</p> {% else %} <p>Please <a href="{{ url_for('auth.login') }}?next={{ request.path }}">log in</a></p> {% endif %} Using a custom "User" model --------------------------- It is easy to use your own model for the ``User``, though depending on the amount of changes it may be necessary to override methods in both the :py:class:`Auth` and :py:class:`Admin` classes. Unless you want to override the default behavior of the :py:class:`Auth` class' mechanism for actually authenticating users (which you may want to do if relying on a 3rd-party for auth) -- you will want to be sure your ``User`` model implements two methods: * ``set_password(password)`` -- takes a raw password and stores an encrypted version on model * ``check_password(password)`` -- returns whether or not the supplied password matches the one stored on the model instance .. note:: The :py:class:`BaseUser` mixin provides default implementations of these two methods. Here's a simple example of extending the auth system to use a custom user model: .. code-block:: python from flask_peewee.auth import BaseUser # <-- implements set_password and check_password app = Flask(__name__) db = Database(app) # create our custom user model. note that we're mixing in BaseUser in order to # use the default auth methods it implements, "set_password" and "check_password" class User(db.Model, BaseUser): username = CharField() password = CharField() email = CharField() # ... our custom fields ... is_superuser = BooleanField() # create a modeladmin for it class UserAdmin(ModelAdmin): columns = ('username', 'email', 'is_superuser',) # Make sure the user's password is hashed, after it's been changed in # the admin interface. If we don't do this, the password will be saved # in clear text inside the database and login will be impossible. def save_model(self, instance, form, adding=False): orig_password = instance.password user = super(UserAdmin, self).save_model(instance, form, adding) if orig_password != form.password.data: user.set_password(form.password.data) user.save() return user # subclass Auth so we can return our custom classes class CustomAuth(Auth): def get_user_model(self): return User def get_model_admin(self): return UserAdmin # instantiate the auth auth = CustomAuth(app, db) Here's how you might integrate the custom auth with the admin area of your site: .. code-block:: python # subclass Admin to check for whether the user is a superuser class CustomAdmin(Admin): def check_user_permission(self, user): return user.is_superuser # instantiate the admin admin = CustomAdmin(app, auth) admin.register(User, UserAdmin) admin.setup() ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������flask-peewee-3.0.6/docs/conf.py���������������������������������������������������������������������0000664�0000000�0000000�00000015355�14605757052�0016343�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # # flask-peewee documentation build configuration file, created by # sphinx-quickstart on Tue Sep 20 13:19:30 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.insert(0, os.path.abspath('.')) # -- 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 = [] # 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-peewee' copyright = u'2011, charles leifer' # 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.6.7' # The full version, including alpha/beta/rc tags. release = '0.6.7' # 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 --------------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. html_theme = 'flask' html_theme_options = { 'index_logo': 'peewee.jpg', } # Add any paths that contain custom themes here, relative to this directory. html_theme_path = ['_themes'] # The name for this set of Sphinx documents. If None, it defaults to # "<project> v<release> 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 <link> 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-peeweedoc' # -- 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-peewee.tex', u'flask-peewee Documentation', u'charles leifer', '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-peewee', u'flask-peewee Documentation', [u'charles leifer'], 1) ] �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������flask-peewee-3.0.6/docs/database.rst����������������������������������������������������������������0000664�0000000�0000000�00000003441�14605757052�0017333�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. _database: Database Wrapper ================ The Peewee database wrapper provides a thin layer of integration between flask apps and the peewee orm. The database wrapper is important because it ensures that a database connection is created for every incoming request, and closed upon request completion. It also provides a subclass of ``Model`` which works with the database specified in your app's configuration. Most features of ``flask-peewee`` require a database wrapper, so you very likely always create one. The database wrapper reads its configuration from the Flask application. The configuration requires only two arguments, but any additional arguments will be passed to the database driver when connecting: `name` The name of the database to connect to (or filename if using sqlite3) `engine` The database driver to use, must be a subclass of ``peewee.Database``. .. code-block:: python from flask import Flask from peewee import * from flask_peewee.db import Database DATABASE = { 'name': 'example.db', 'engine': 'peewee.SqliteDatabase', } app = Flask(__name__) app.config.from_object(__name__) # load database configuration from this module # instantiate the db wrapper db = Database(app) # start creating models class Blog(db.Model): name = CharField() # .. etc Other examples -------------- To connect to MySQL using authentication: .. code-block:: python DATABASE = { 'name': 'my_database', 'engine': 'peewee.MySQLDatabase', 'user': 'db_user', 'passwd': 'secret password', } If using a multi-threaded WSGI server: .. code-block:: python DATABASE = { 'name': 'foo.db', 'engine': 'peewee.SqliteDatabase', 'threadlocals': True, } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������flask-peewee-3.0.6/docs/example.rst�����������������������������������������������������������������0000664�0000000�0000000�00000000046�14605757052�0017220�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. _example: Example App =========== ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������flask-peewee-3.0.6/docs/fp-admin-btn-form.png�������������������������������������������������������0000664�0000000�0000000�00000055770�14605757052�0020774�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR�������:s�� �IDATx^w)K7i"W(RTDv ((b犢(_P" H/ ?oi|<>ww9oOd!� � b,i{#� �Sn@�@�WL] T@�@`=� � +J � �L@�@�\!@0uE7P @�@�)� � +*� � @0@�@�p�@%@�@�:TӟAEof1cF~Nd~(O=Tw}r%ĭf+#n� @LK*%}-ZP/'|LԱnLnd֬YԾ}{yVUB#n� @LG-Z ?O&jd+Iƞڵk .h%T^=.Fn nG\P)@�$ 5yrW{'=4K1B^~չkKu qa@�R&s0-R8pl@ǎ/Ԙ{W&Nh~u #)_XP믿|9/}߬Y33fL\A0 # � 2i6m|k֬)Ǐ/Ԙ?_֭[g~<4e /^XtVٲeC;v~HFb4fB @�@ 1=zo!I/˹kӅQfذaltG-[f *HƍO4Wt뢫P.~̝;W.{1}ᇛez /C={ҵmŋJ*IӦMfMyӧرc?ԢFr)u]gi0k$wK/$#GsM|AyL kW^aԾϜ9Sl"UTc=Vv*u @>z_iNjYjU9o2eʘu?ywek^K+R+V!m۶#zZҤI 9�@�L `z]w X4x馯:3| _s=[s9Gy晰T×qƠ+W'|RtuwmРA;_24@Ӑu;yyyσ=P /ȵ^װZg THsM>ha0kS7.hZe%GG s~aٷo_k?o 2DuW6-O`qf0vr_D� @: LիE覣HKtѓ.~MGj׮m ruJGm m۶-p_'TY|N8ᄸ1yB)T=tZo:uքkjvwDh1֠o~ :h{þV*QG.6}[^{޾9 %K *5ܻ[:u)?!� 1GyDU&={4Q|?0�aD7Ȗ^]z饲f!:O.ZjɆ 5J'st|,Z\9s1{ѢE4ٷxqUW… b0j7e7o^`dP>[o5)/Y,CHriˋ/X>kO=W_7uEZv1LjoРX-C_wpBK:z7 z/z:Fnơ\^3gq @�L9{yꩧ޽{Q }?6ߋ7/n]MӧPh|W|? tgW9aE:kQI&ph:Y |VV9:oVt҄FAC-iǩu6vWX\X\Qk;t4^F}coWCDk7o9tA]'\0ySO2u @�L9>rI's_:]v믿M7dYY:eʔuoki�rH>Б;s BGR7oۯD:-e*6]/בh]dmg}fٷDko߾Cիgho#:y8Lt'k{g?7 :$XeՐh4ۧSMVӯImmP.Шp$1 �@Thc믿|4njjG쯖rذaT4iXt^ft+2GƺZGtz#`J}.4ѽ`5>䫯틝 u徵i$ǁ7S_Nё}]et[Gs-1FD&7c@�Y `j*z H]Lf:z>j999Mjǻ.]ڜ_)P@GzM'9asdMBmv;Μ"amd(\kѶi5^ZXc_Ɂ^ik o#O?dNuo(#,3i �.s0}뭷DixGLt 3j�) TCGSXaQ.QƝ;w-Ji#[eh D*Cc]Mëd 9u~ry|bp2^DŽ~qj �] `ԏMWkpMZ KM]}Akj<ZL1]q!`ʕ mєhާ_}T__ޢEse`zYgɦM|atGp dlvxz\}:] 4I wL6+'RSC�@ ]bqߩo %C>UΝ; rKEx)L6}Է~e")qO~D_etYj,P1#yj^pU:i} XĘu[2Y:u>}$<XLA�@ u1,zݎ6mȠnF4G.utQWM\VOO<Qh__eem:њ?GuzǾ}7kѮg ֦v]vWU p wj}ɡC;HQ`}Sk}:NcOV'�@�\%s0-TtŹ5jze͡ А +uU_sY<(^?3] zjH6} %z ^H}]Q~t.:v싛?B /.HGXwU?@߁i}A`pw.~Ep֦oҺ`x뙬w(>/ҕ~_| 8P%Sg? �9jNֿ/Q:4hhx V;Y0h_?II_O#e :g2?(w~?>E"X)Pt U}\;DGt5H{#:VZ*GЕɜxp6Dz\!� v>GG2AT_7imTZh~l}4:HrJm))}+@Mݴ:>2tOeA]t>ו֦I5t` w֦abx1b˾:>?>6~G}Q~8u#� . 7ijԨt;Q?V :(_l}+۷kȵQ9}giQsUVYՅI8G?TêֿM6f�/2_u^=M.hs.#lsfe:hM(_%Wz=CӾ}9s9_YW?I?KG6h "1jsǹR  � 8_3)?a[!� �"@0MQ]] ?]~P}54*"� ip[ VX᫩.ҏЩ^?(} >^gC�@�E`=*5xFU^\('fEz=C�@�!@0b[!*ܦ  @pdz@�p�-=A=t7o{Cu@?ĠI&rǛo`4LA�@� L]%T@��ԛN@�@� L]%T@��ԛN@�@� L]%T@��ԛN@�@� L]%T@��ԛN@�@� L]%T@��ԛN@�@� L]%T@��ԛN@�@� L]%T@��ԛN@�@� L]%T@�@t � �I8&6\@�@Sv= G�@�%@0uWP@�@Sv= G�@�%@0uWP@�@Sv= G�@�%@0uWP@�@Sv= G�@�%@0uWP@�@Sv= G�@�%@0uWP@�@Sv= G�@�%@0uWP@�@Sv= G�@�%@0uWP@�@Sv= G�@�%@0uWP@�@Sv= G�@�%(ܹSn*999jA�@�H{innlذAW.ŊK�@�@�w DL׬YC(uWQ@�@ "K,FeTi  � { j� �xZ` � {ӆ @�@ ՝4@�H_i5G�@�2JQ0mРAF5 � �G`Ꞿ& � ~� �GQ0_~5/>pVsɒ17VLD-;6 / ) knݺU&M$]vYD:ҷ}5Jgfy 2fn9侱纝RLq_uyS_@�%`wW{_>YERyni&ӹsJNNt!6wYZ&tj,K9g_2ga= hi Mb:+dmVs\LF@�H STVVrŸ%cʄ`:ai׮ԨQ#" m2BiuDU9/Q6~Z4`#SFt{r �Q 8 Ջ"zReoTé~>m.1GgO)9E[WH^^Z >PY-mcղmyGaut/eRMb/Wvɵd\޸{\=~.yrU nϞ=K.]DM"ٴoh)W_&wJ56o-a۞rQ+v)F;<.b5ԾP>] }Ԑ[~8T]"iwVBuZU֯_9 AVl[> eI9@�/46##'Ԓ$c#w}Z<2 gԓmn{1Ys_0Ӯ<}J]j6svg־}״,U__]>[E^<6#05\J&cGf.@sR)[ ڨb tM3q9Gtɒ%j*9餓"@tEfPL_Knjڼ@ݍ6Z婓ju eʧUrXr]rۤ2r&GDhmP}hY/^\UtZ@nnӧ֓~a(H1 �xAUT\>/YRGSxTmquJR[ ƚQX {eJ<iƖf6{c1\*dgNcaȒBE\0Z2Աk4Zeʊa)S#GZaeɖ=F8#&6G=ZȂn-1w5ԾP>!o!gUHEkl0C}ޭJBa(H1 �xAUTw6!Gf-K{E:#SWF&ҮFBVy"_#nM-rkk3U[#1%XK-[2{{tl\cJΝEDYm\-WڏSBZ[rӊ {l;(r /{KjP}$ Lµ �xEQ0[n.%@hmo30GD]FN[VU)%-+p%eV#eۿׯBj-.rH;c悃S�#3:T>BYqS~Ư/h,gJcn!oY֮]+gϖ;:w2Fk|Sq-m^#܂`B45ӕMZiNG3GBUCd#Qs0 �,`넕2Fr^&qWM1w緫y}1֐)/_,!W_ mB*]ynVZDVI>sdvfu߭#FӧKٲee@fËo;X[wbakKȨyE[[dJ&q\C Ww~9͡grdM>Pu xXF>[}a,.Hi(pf? �^Hj0؋ˊ>m]ƢUXYrN놽XX4x?#s@.if,9.X{~Z_W_}~Cx-VW_GLu5YgeS'kv˂-a�eI eҬrIu^CiZ!\C eo\eh-uϗHKblB [e-242 n#� GNl%J(t.<B,R9R.ү@tU)ղ̰`^c,}m-v*eu}=-*G0w8E\Z7'[6yV,PvhvZ(+o_leKbl{?Cuu> gG�@ I ^-Ϫc.#M]/K1F??9\1Ʉ^  � &Z؃|RȕcloSj ɘxi= @di %i:E�a՞ �NN8@�@ aӄR0 � GVWgC�@�@ xR � @TӨ8 @�@ +VHʕ͗ѳ!� � o]dӦMRB)Z4,@�@�@T/E_�� �IDATsNٺu� � )(b� � @\@�@�GSG\� � (id)@�@�#� �$J`(YE�@�p$@0u � � &Jr@�@� Lqq0 � @\@�@�GSG\� � (id)@�@�#� �$J`(YE�@�p$@0u � � &Jr@�@� Lqq0 � @\@�@�GSG\@֭[e׮]9 ђ%KJҥB 6H@ [8 X heʔbŊűdo>پ}_[Qj�xT`юزeJj< a)^TXѓ [n@֬Y#իWH?_^j׮@eF�p*@0u*d%KqВ蛀Av�$J`(YE2 \|R5�Գ]Oý,@(#z ^{!0)4a7#�1LcTU`J0M{z#@f L3iSi �n W  L|Q< �4*6NB =d�4S{v!B`J0 Fv#GՔ[U.6oFGuz68oqnC2yv='4 /YOj)..Gא3wTv"re|C&B^"_% /NU`[0Du\^u6^~A/ܧX_Ǣ?Ծ/Er~1 � $</5K]IE}ܜ_Nٰ;h艮I9[p#\:5$7^լȓ?v$3_,][^b^lؕ+.;`G8K6&'PMx vNn7ވ-A<@�I P[*,*}W_]䱟֦}0yNJ($m~9d캣 1˄j{3Y|Ski:lL)|Sx#P`MY'A<@Y �L0|_2Ⱦ͛ IkG7F1Z:.b[qK$//OZU+%/Q_NW6_ۿY)ESȵU1g>cnyxI]o&Km yA=f&zwQ^n#/Q/eC?]S߭Rŋȃgr#ϟ^OOXs ϿA^@eضW4hym|se3iP>[f#m ?:ed=r@}X" ~HYC0j|aLxuh=9 {m%Mbf;6OT.=Z]5sb>m($Ln۶M,\wuꫯzo1ѣ7N6n(~uQfo.իWKNQ`B($ LFvvC9Viv\2׽U/n#UJ[s?7ȳFx-0ףm5#n{@`@ k(+!8zzW˥URfPk5_XV/u\j@oFKF mԩ4\Bn#g,yʯц5+}.hӮ@]t;GBQZnlS՜kck}e{bșO49#Wol@eHdϦJ5<뗌09w5TҜM]Ymb|CA6 N,9DU&\p2ysLC\Գ>[*={ 4H}]iÆ z',o|wH:c@�4HZ0}j:Yb;r-mR*9hX"Yh>n&Y¡ŲVc:quJicB.FkϺ/ϖF8ֹKƯ U~4x,Z1ue vn6%gʳW7]w;)2.7HC߷ CU0q.r1::=E=rF9XdFuG*c6[arTu𹲶O\F}[CQ{ȡƾ72p:SOIʕeҧO믿.*ߓz7#eʔ)Th \c@� $-j(mkekl34\@0-oG-{iP_cRڛrUsio,->}\? fX4hYTC̑½uK׷?qg~5@m1h cՎ}F8.e\'w@UκѺ_Wo+?3VePsj0;ĸ?A"~k_p)cĹ@tgDL +K?t=iq-5z;9zO;+zke,G]tѣGKbd߾}gl0+wޑ"E*?\5pr E�p&`:j(\R#h 3FXq Dc4P\9ZxoFЙad}Dܘxpu+Jʟ3htNf{cž<YκZyǽ.a=7 Q7 ?_Bs;~2o|8K} LCA_auĩ.c>zpiq|PGLu.b߈*cTG%ڲhWf#S{v1Ҭ[(Xm($c=&UV5+Tˆ w<ʏf\@EI :g䉓=ƼA_:ե9t4iҭ(4V_j,U4c&F(xm.ZaRAikجRinouTckEM+O֘PĜίc̣fdo:_�N]Nؽ<l62֩:lPPOh߶[O ڭO%)" ө׶i(K Xyo>{2XxpM͘W;My S_ѫu2Md0>|.]Z:w,#G' :9tP߻L#11b_IG5@�$5蛎Rꢥ&*v`snU6VZ5ig*;ԾNY%;GĺU#W}EV+GV]ٺr\G~\C*Nh(??oY#\Mys0zӁ:UGSgwkeX.B%}ǬΓ4߆pz\}Ni(_]ӌu\ҷ:-0K_$tU=/o`s=A㏃ӍiIQ/3WP6VQ V{lGXi [we_b\{ׁg̘aK" ֪k5\#C {ϱG/  � $<F\#3Bh+#Ht:>:1 WG_ _5xTuevs< fO/2#ݞ:کfGih- 0F.h9 L?{VZ#>w|c2N@�.`/ot1+FSPmH`ۙ-Ɏ'ciӦɨQdҼys3VN6-E�#`be"ᄂF �{� i2�4 :*"o)4!� C2H3)4nY� zi&v) n@b�D%@0Ho)4`j�*@0Ԟ] L�Q`^N$X`J0M-F @TSEƆ�!P\9VZf4&VرC֯_ٜ� i".N � �XS@�@�WL] T@�@`=� � +J � �L@�@�\!@0uE7P @�@�)� � +*� � @0@�@�p�@%@�@� � �  � �{�@�@SWt@�@� r � �B`n � �S@�@�WL] T@�@`=� � +J � �L@�@�\!@0uE7P @�@�)� � +*� � @0@�@�p�@%@�@� � �pL;tQg̘8,X8 _~{a˲ر4kL7o.vz衅Ν?L<YOYp|Wρ � �pu0ҥ,^X" =8 /[姟~IJE�@�:#wG:f͚uVoXbC'r-[V6nh<mVB�@�M c>/_#8§oI=D[ D� �C )tΝk_-X}rI'I+=t]nfի*Ç7SO1͕#GeݺuRjU9s̲J(Q>O?T/_.yyyҤIK /I&ɇ~( ,իW/)]t2rСڵK:,;E0;iS<n,@�@� $<oQ̙Sn'p |\r%r˛o_o>Ν; p.+W򨣎!CH"E}<s'W]uttW|MGy߮M7$3g,pgi`Nx@�@ ^QPl~OHJ`պuk6m;SSg-7o6W)SƼ駟.ʕ3G=hU=CdٲeܹsEGb/b:G}TN=Tѷ=VZg9:Nؾ}u]r狆_^ysNw}cY|yڵSuёT{0uҦxX� �8Hx0ٳL>]~袋|½>*˸{eĉϛL"wqgy&`0꫏6lU@pذaO<Dٽ{wܽ{q'YYYr-?=#]v 86Eb1 � @" qeϥF6xLd0pک˳>+cǎ5֟1U]lJMG'Ǎg~} 7 %K4fgg8}ϪcUSg;^G]׬Yj6%&L@�@ c9Ft7g/tҥ<Fƌc?P0yH>ئKu*n8I.>+:q  gxyG}uϞ=?9iS$7 � �Hx0Ft[֯_D`S5bJsxj T׹S">Mb~|i&sѣ 8 Zڵk t~a&:u2GH_7M"i7 � �Hx0ӧ(GC_. z x1­R:sРAunݺɬY ͉]C^KG.~㬹&LjժMi^Wi_)Ҷs � @ƒ,]#<ce}T+5lz#:6W:>k Lu.ҹtr:9ՠdsT5<x9TqvZ皪f:UԲm۶ᅴ_^6Eb1 � @"*cM}~6>owp'T0GV(RB]?.Z|omVZ :U_fi֗#vݴ>`<%'[ tjz~`Q)\@�H@ƒV\_y/w|w󨣑PT_aLW|OOnuUmۤTR@-4]4bs-I_ԸqUЏ5OΦMJ׮]6ڷHӹ'S_W/_zb],kmz~7ߘuQ뮻'w63f? � 4 XD) @�H�4 +Z([uNuUQXnMX(@��4Π*N?8@?@ VN5jTP!Y: � @Ә SSAՅRڭ+VsLWnmOҷ !� �$@0Mޢ � @ L3si � Nt-� �d�4;!� �$@0Mޢ � @ L3si � Nt-� �d@t@@�@�R-q0MuE> � @f L3i � 6S7wC幹zc&rIYk5E�H�4؎/Epl x<)'L nnՍ`> @I{˓gT*,$]`tr.�xM`'G%@0^@�H�4LO9%Xtb}vErNJdS޷o+WNʖ-S`G�(@0uۍ(F~7V껭2>ϫ5th{y`mBhڵf͚ h i*C]`d}v�\`.@`P^qRn 4;!�. snOև`n @)FL.:q[O<83coˮ94p�m)NqV P��mD p[x>܇wZ�X`(tyzě>fj@ w�m@}L)7 @ )@yIzě>fj@ w�#wy7+䋹ˏ6G~K<i%9rXQ`һj!�-@0u[HN)]T*SRJ-Eq1emdog8}GLB�T`T#˓,o%Jɖ.7 UJ]r!d%$+%#܇~{Q@ -n6A9pxn.QVVmu[\K=;dAcHrܯ� \`,g>6B-��IDAT ߿_=IJT# ԑ=[6ȾΐE&tH8@ 8bƥ(A`:`Hq!ve!7ʾg*� 4iҨ#4p0`4%� Su,4p0`<m @r5i`zL&Q_E7GD{^+0":@�$z3C2cƌBs7𘋟nK\0{dmS[@�2L`%1%#pLzh0}`WS C�H;ۺ`8vLٲJ$wH ET/{>MKEu%ohG04rsu8x"4)U1[�quFƻVEri0}`  �d�m}`=#K7GaJرC~a>}L2>o?\ƌ7YQ~OgePd\_dzV]+c{+U~cfIV`|{.I~=EJʈnjbrŠIɚʾc4r 8ԯ]จ 4%FdA �+@0u[׺ s1ҿKDC!CO?5{9⋥aÆ2~xYlLn9ӥRJq5F0-X-*W,O_S=0Ϭ ˲]%e %uq5$`:r5ұyy 29~u$8~ސ)ybL_%FdA �+@0u[׺ [K.ҦM)YO7CjbdҵkW7n/N8Q*WQfӛSd.)~`sdݖ><R|~޶OU*.K:ܷ/RY~>)f<^3S6ڟFV9_[Yq @ Lֵ v|fNNs9n89s�K˖-}{yԩ`j*Jϳ[K%$`;*.ْ+{^:Ʒ/R8.` {<3pھqah0}`!�d�m]`z뭷JϞ=}AS?|q+R@cϞ=2a:t|W> }XDr ݜԕ+se❲xr㹳$w~0]h+9dJRFYپ}y/Aqf }_fL u�@� {LgΜiOj׮-˗/~ZnFѹuYz!zB(kT'N:sL5<#F%4^,nFNKk6xr$g~0}zm?И2Ӥiu}qf0 }_fLGL:q� @F Lֽ /R^}UYnԬYSw.:w%K|I3uVyGdڴiҠAk]`#_t剋HْEeuF0)?V(UT޻SJRhۗLg;/moL:q� @F LֽInkruLÕLGL]/T@ ӤrGp1i!$3t44!� Su.4p0t m @r5i`=i � S.4p0"_n [ӱӰN� Su/4`0vy_yVsH=`RhѸSA܇1q2 @tw `01|ve~:#9%gO-/ú7#& �T`궎!ݹҠdٜ[NX)ZٻC**Gt2K"E/+grS@�" FD鞽/f$Ku#֖m=6Ph@%@� L=bS}~)QWP܇r@ n.A@jn>L-#!q&B@�B Lv#ެ7V#�)  ]@f}H�4@0u[PS`ʍ� i C^@f}H�4:0b=� *i]*7}~ @)�FLԇS@�T LS%ψ䩏]S@�LS7}~ @)�廭@�R%@0MG{?>V Q\9)[jO}2EE6ޜXx~VvmYfe @�H�4桯۪H})@0fj@ djGr-i$Ji й$ 1:`>  � &ZiSb$i  a:o jǎ}? d lm>o}˖,~J8A�<(@0MN_n]ޚ5kҠ7ݻ{!JXZjRJVG,Ɓ �ipLE++V(ŊK^FWEI5nZ�$\`p/@0YlIR$+]xi|)@ _`wT?MJѢE .g . �d�4 :ј[) *Ξ=[Z~=?!lt 5A�Z`Ҷm[w"�xP`NO&Lӱר3 �μ8:EsY@�(@0M"6^`g"� .t)ʤo&*TkV:ws UVuM9*,^~ؿ1I, zG{^e>k{mq}�d�4MzQã޽{)"{f0bjg!&M =9^DLgԨQ1#kh֭dz6G�E`&=sIʕnxΜ9?9rdLС̘1#2xm0}gd1#k0w#E"T) @0M^K矗 q^^[n||߾}{yᇥ|uUG˓O>)zsk©~&;}ts~]Lē6G4K~mG={4?W^}.GuT-Z ˗/7?eꫯO><Vѣ7Nt;rmfN믿뮓W_}tH?!Һi2DϟoVG˖-먍zmkO[7ߔݻwuڴi2h {^z[-[ ;wC̙3O~mҤ:JߋQ>[n_Wnxꩧ|+Vڵ˼ΝkǼ@� L8モŋO?- 4 /PkӒn__Kxԩr=H^|f?~9o߾ˉ'`zYgr֬YˑG)\p5a+vɏ?(q}rUWTjժ7y4ҺH릏kժ%vOd޽/EZNS=r;ۏ+7~h3fcذaҺuk?P諫c1� w5xjۭ?N^u3 k'L 6l0B=|z˼f:uk֬k&D( it '`-Ydk uI~@9qDs:|(͛k׮(u^ēi0հ /&4�GQPuܷoB#Vz^kёM Gׯ7G]#\PuR#F=M V"-'P0 l?3:syRDpM751ZBͭ} B~|k8?>y'D?<`B=T0Ցޗ^z1ק:j͆� PP`&wL}\٨Q#_srrdʔ)ұcGg{9ʧ4(kQQ{ZNnn:P)'Nرc}S̅G.]jkp ?T0 UN.]df~#{ nE#p3GzTƍ] Q*Z*i&sK17,/9!]&C͵Mv!�L_*U*IGP5PX+=\ySGR5d>CSrvRN<Sh�e< M6C=Tj֬ihir4i8Wt\UM6uj(̑GݜPAMw^pm:?^B\OyO,TXd]ji+��#i{:'M_N:$?GKZ㏛ C."3C :GOZ2Ǚ:u2j@}#Fp\N<iLuڂ]h žۈC>|.]ڜj L5֭[7T"}TG3ua.PAվOuGk9GC8>*0H(s}`sd4ЦsWls|m?nZ5Tt'l �itGd]Ixb3Du^KQBtB(i�Gy\kQrI`/:MBj844~\bF1ZWh\g!(Zo :- \pBsvʕ#Po7V5eu exu4ԾCy ӂmn>V35?@�i(GaQu!gOSU@ 1ͨL3oS2WNO`C�H�4u\ف�::UEk_6@� LSgϕL`q( �i*@0MӎZ ^qڋ� E{= L0MN �8 :LSU@�H�4\+jit� @LӦ]Q#�xC`~NVLӾ i� �aa8 S7u@�@ Rzq@�\,@0uqP  �d�48#ZH0͈n � r�4-J"� �4&>NN�4Y\@� LSgϕL`q( �i*@0MӎZ ^qڋ� E{= L0MN �8 :LSU@�H�4\+jit� @LӦ]Q#�xC`~NVLӾ i� �aa8 S7u@�@ Rzq@�\,@0uqP  �d�48#ZH0͈n � r�4-J"� �4&>NN�4Y\@� LSgϕL`q( �i*@0MӎZ ^qڋ� E{= L0MN �8 :LSU@�H�4\+jit� @LӦ]Q#�xC`~NVLӾ i� �aa8 S7u@�@ Rzq@�\,@0uqP  �d�48#ZH0͈n � r�4-J"� �4&>NN�4Y\@� LSgϕL`q( �i*@0MӎZ ^qڋ� E{= L0MN �8 :LSU@�H�4\+jit� @LӦ]Q#�xC`~NVLӾ i� �aa8 S7u@�@ Rzq@�\,@0uqP  �d�48#ZH0͈n � r�4-J"� �4&>NN�4Y\@� LSgϕL`q( �i*@0MӎZ ^qڋ� E{= L0MN �8 :LSU@�H�4\+jit� @LӦ]Q#�xC`~NVLӾ i� �aa8 S7u@�@ Rzq@�\,@0uqP  �d�48#ZH0͈n � r�4-J"� �4&>NN�4Y\@� LSgϕL`q( �i*@0MӎZ ^qڋ� E{= L0MN �8 :LSU@�H�4\+jit� @LӦ]Q#�xC`~NVLӾ i� �aa8 S7u@�@ Rzq@�\,@0uqP  �d�48#ZH0͈n � r�4-J"� �4&>NN�4Y\@� LSgϕL`q( �i*@0MӎZ ^qڋ� E{= L0MN �8 :LSU@�H*7����IENDB`��������flask-peewee-3.0.6/docs/fp-admin-btn.png������������������������������������������������������������0000664�0000000�0000000�00000056226�14605757052�0020030�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR��k������>m�� �IDATx^xOz�@ EDT@RDDX>EQPT **{͙ass;C9 (@�@�@�@�@�@�LE �bTc@�@�@�@�@�@@XCC������X3a$�����XC������(%4̤ll?)22TB+ J � � � � `@)v)(88p8|JOO';@�@�@�@�@�lGXKMM<]AP UZ\ � � � � E%ڑ#Gf͚XQ"py-99ԩ' -����Yk{DV!@TjGA�@�@�@�@55 5U����?XxWBB`�����ĚC <����X3Y`eds@�@�@�@�@O +k&s@�@�@�@�@d LV!XY3Y����5?ʚ����05UVLV!0@�@�@�@�D#b={ҕW^Y;-\^{5?snذ{>|8͞=6mDԾ}{4hUZ^z%իm۶L{R-ڝF=E okL75iOkNNh]+S!MzUpE9GqQ!Hi��[?|#}z5J_l?U<Q9<,YU-L?фV -T-$K%M˥m&-y"Ox1GwA4n8*6̙34~x:p�-XMO>$ 6}KK.2㯿vM>,۷ON&L(QkE5#C(%31Ě1Kg}{=<ԮL7��@y b:?;QL (6Y,dM>0թB#:,`:]P\Pki\xM|Db<<yTyXcVR%޽{=/4ꫯ,/vAsΕ+g!33JĢuԴiSu)v(=.v߆H]`eJy2\qꃊQ )��ճNw3<JsY=k{-yIʤgWbuM MflI֣G9Hۇ. vS֦+U*a#S_0DI<C_ 7|&OL'N,.ף>J= wyGjՊFA[QXXHՓ-Zp{mΝ4gڿLԹsgy_zz:tah֬Ylq>jժE7xc%0zhymѢEL4O=%q2kʓ@zʧfN>dbk0t@d}-ß)?eѐ*Rc1,)Տ Y-ti(u*fx|; kQp3.;jC} I_i$V65' 螅{ۯ975jA7K<t Je6��A퀟ucytgs_ 5.PT̡jIb^O:vt;ֆDK51_6Ѿ/Z*|1ِF|N-1sȮ}*[FД b՜OeN/U-G?=MUC1W .R87J<< Wcb]ƍӮ](4i">C>Xn]ȑ#rÝw)N׮]p7on3K;vO>̙3cyszlq<AŗxNn| V zsw7NیƄю9\8k |iֆbM#@#:҄i\܉s(epԢz8}m?-㇋%"v5荿DG۟8z4E,st$#Afl=XH\~)Yja2:?UtC@wcr&ͺ`j4HX$9IӺ+}okVb# qA�@�@@_g4硫ygC)ְ z3 c~G~9$[C{�T4Zk#[uHR[]S4V,<r](u˗7aŸGhVJ<Hp£bocǎO3f̠ի,X9LBAAArUꩧSaHHp ԬY3 +OwuW =f{xWec{R|FFFtY)lBƫ> j ƝtXd;=vqL@SɛPo,kZÝv+H Yp`7/2w?'ם^G2vhXb;+O|"ʵ2QrUR |NX7^Ik&JQ߽-jZxsR\;8-)��#|=0*\+=K[o\SH[Ott׻ix <C bn5t= gk'F+ϞnwRxp�=$eu+=%%Mxum(u9.tcֽV<o 5j=_,xeN:% )TJ+hXbBs?<5vu\d ݻWLdZ+m2_ӲűR'aCFFw}">3<!H>1{q2$P)D\*-Ś54|E9\yU7+glmwL PC(�`bo+v WMv7+'N7Js#DUFfHGx=n kG@�@�@)WpavbCtp /y/YyneH+j7{|A\Il=Qh5Қ۾MgP,unՍV<^yfע]ZZxTqǎK111R0)+kbEK+VKwBupvOalҤ lْ"իg,)%%Ex)آ=x`}y+W.e6Lv7?,O4+xem+Xaӕ e'k@s'E_)~f!uͱ<Zb+ Byv&]'OwХuhչ6<_H5[~ԓV2^<!v{[=0\Yc?k{GŊ wO i��5ygZN /U {s|/=!$ 5)?|ƉN"u/A̕v m#W712B{X}GrY>}$Xcխ[=k˗//>aM^|Ŵfyȧ~*к.,�>_-dXJyJ%ָtkZ8V!Cxzx-Ѕ^(WPi;ޯ{^ymbU .J=aQ+D| ƻkSŚ5wG= 2jRsg8X rxbQz8+2^{pG3+{V],:@f1\A4So nݪF pWЉ/97K'�TP?Cyg];[C?mqv�@l)Q#SZY-bO̪x__-̼5#m< mb|0rqP5rdڵiȑ_ >ޣR@@\!袋^[zuԣG)ؔ34Ȥ$y )Z8V6{8Gʏbo۶MakPS\$#੩twnknfyĊm5ψ.1ʍ)Yrߕ<G9kijur޷5OwZtN [(6|sB\X;K}։,:ׁ*(l414HUMEoSZq}c,9D,'O"},N^QȐ H_#@~ � �ĚPk^Ntnj畭os&'f+[l/QI]vGFbt zF+9Xy~ŇA?7'4kFf^Df,_~eeWP�f kFB|0cl ���/ ^"Sojw5jw^}ղdAkef LQ 0@�@�@�lCb+bN`e ֭#ޓTs^|Eٳ'o߾,Y@9nX3G= ��� ۋ5UV֬Vc@�@�@�@�C�b;\˜*ZF����5U'Ě*����@ l!LV!0@�@�@�@�D�bO!L����@Bf 9 � � � � 'k~59 � � � � `2k&B`�����Ěceda����@ B&3bsJNNXFiA�@�@�@�@HLL,EX|P|�����0 5T ����� @�@�@�@�@�@ LX)0 @�@�@�@�@� @�@�@�@�@�@ LX)0 @�@�@�@�@� @�@�@�@�@�@ LX)0 @�@�@�@�@� @�@�@�@�@�@ LX)0 @�@�@�@�@� @�@�@�@�@�@ LX)0 @�@�@�@�@� @�@�@�@�@�@ LX)0 @�@�@�@�@� @�@�@�@�@�@ LX)0 @�@�@�@�@� @�@�@�@�@�@ LX)0 @�@�@�@�@�,Φ<�����0 )ktI:{,ț=l����� Iu?00bbbbW222(88 *dAA�@�@�@�@�MZAASTTb-55UP5o����X{JUjR,JdxU @�@�@�@�@�@xu=k֬^EFFJI������B233!ּ�����1kx!6������ĚO0#�����0F�b/�����X fd � � � � �@ � � � � � k>L@�@�@�@�@�@5c@�@�@�@�@�|B�b' �����#�fb�����O@32�����c ֌Bl����� 5`F& � � � � � `�Ě1^  � � � � �>!WVXP@'Nٶ'.K& .޷P@P$222ĉ#ؓ@TTRDDrgR@VV!p9իW@˗��(?Bz$qK tD $pib4uoKMA7ys7v67AիTJX);-RϜoNѱcǨApͼeF 6o>U;Ҟ={(..Vjve񙒒BlF �d睥oMQ9W-*\LmVl r?E٧hר(<K_͛9gX+,,ٍ)"4 3jD BHVDئU4ο%8pB=fwFe ir{>uhgnijJ{�pMu#SHXfO@#);;z5LSojP<s&54񇩚AgOL+SBT~mRU[RN,SZ>k֬-Z'΂]-PYA�@YazLZ cC(<;>خxly7L~kbڞ{ZW)q< R]Xqsvb;}~{ٯ[6mZ{/7  � `6~a%UŊ* [Nj ~9M3MЏj8m#}Ě+˶kڵrK~kÏA�@Xr ,F 8_Zu9}-+֚|2bb'u%ڶmlLֆ  LU#0@�|K@g!|K&X{Xs&w!ZZᱬlj6oĚjskmڴ\&&Kiƍk& �$ 3kdnXTZu9ڶ~QM d!֚ĚmFq%Znm<1ܱi&5�obi!* 2+(eQlc*1 ,A%?VD'<uHŚ]M3Mm{eZ_ZBq`='55U~ 8WbUVqW\A񇎘%>gm޼bp �)ƖMT;z%EzJNl> /:Zi,ʿOȮT9.{ʓw Vbbȼ4I'5Ag?n8}Oϙ&6чj[ 2Y|k-/LfTMMXkٲW@]y啴b iK=t-[ �n��b2\xJlᲯ.p&>k/e\+}qsVys_@}?KQw{ʓw vkkFM<Zj78dddiϗDW ٓ{C{z7ކOE5ba?#>T| qE#GERe_Rɠ4h1yM\}КHqPY[ˋ5U7C-Z_JK.l2s%^"֔SiI?OC\�)3.OѪWPW'Z%AV;\1RUB]׸VkkIe0l(΅K9A5DUGV(Dei@$/O#':)I-*[h,Kw&QsZp:µ17CO^.3;~F4D)\K|WVf+kK5&e.^FP8O>xb=V)UW]E{==gX[wk/Cbwi{a?֪ ]7&RpXŎO>M;Щuki+/Q�y3}֝"X2Lzw}YywĈqoRRR}4eʔbFGa}Ν4gڿLԹsgYWMSN%~_\�� �IDAT=TҹKFZ|9]}% ost,+ּys37BQQQ4tP޽۸^{59P�u;vXzwe{BCCi„ F=rٔ}QOرc%1z۶mkz@!�ؔkk/Ȫ5EGiļ8=RspR'2{ Mߞ8MMYIqk]O6&K{s*Q3Nbv5ѧI?3m>A#gi5eеͪүNfCmQӊW5'foUϤNf֒eQtj% :r`J<gysl]@JZt5wkokzM<WDX9… 粯*ԡC9_9G kР5JQrpu28|JOy==gX[ۧ'ņ7 :C?VEɔOTT{@7)_(A|ut&Vtys5N)?#dP/XWl֭K,9B ĝ0 ߗ{!%ƌC};{>bF3kYvmiʕ+iϞ=4dDEƥu%֚5k=Cw]~d)yĉe]u]4i$9E7,Eիiܹ2 ҸqhҥŅX[8^o� HkQeNC;Rril-H ‹ى>;F~u^TT˥ߊ-Fw}hB1ԉG&;7:Шki?xzW=jX#i595E-+ulQӊ7G%Zz0xnn[6i^Ѵ/3XBSԥ"%ǂ1C嚞i pR2I!ڤbMI=amѣr"yW^԰aCZh۷O{8tڕFM{sӧ93Wѥ^J/<s&nɐXkgruŜԿ{qʤM?{PMB(R<r?k.}yT(*6Lcևt4u;%qZG!xS'' >\6SOIƁ.GI<iwu:X?4^Vf ֪p%MPonxp9xv{TzuJNNo]^+}UR>s+W@2>u<7Hx � `?R1&z&dc74}W {;EՉvȥ D39qZ"vshvauu~T&̤;Ɣy~=ܑLэb-iFJg )6:VMC^QlVϵ&/o̼r*itᤝtt>5B{Ʒ-q:quz~v7Q|FbLWKg6X;obe; *yϳ &ϽnO%yb}<_R^|\Moob_hdeek%<O$& O-q>-v;$v1 71%ܫL `vp,Xc!>FŁ}rNtVzz|w^'ekQ;%Uk\USXkMy~Kv_w۟~I ]"ł);41OXcw[5h � `CR2 riztS'!,\sz{Ğ)(ljʥ` *̧7/1k,kt6%uµmL_ nD4y"ZUWFɞԞBο/1ۢ/wr +~Qp_ޛ)rj Pʣ)W:]=?˛l5j,*-ΛXl<= ٳg]<8ݺu+`lϳgi":>3'5ykݧw*9B0ŞSz _hy+PɡaiC.if[Ld_} 8v/ڗ&\:!#i-6i*i豁㤈eЋLb>q#q &qcByΙI>)מ}Y'5_+kTNE jWCrk ru> R+"Zy�Q)KDg3k꟝ݧdkzH!�ؓk#S+-#DƒhtjT8ŏP4Z칕57<Q G(1&~JHiWMᕪ# 3Ezp\#X<!jmq`;x%5}j5eRbMX<YtZLcت0kVzA;Nm:V!`XRZ7h^FD9 EϟX効߼Ƌ3gΤ?\5W)"`FV<=gX[գ!)i_tC(~ղ4 ڱg/uy5ZcWyCa1l٫75ٛv):LߊD$k,\R& UgK/$eښ5kGWM"N)x#$v^bVV-i>)[kl[|||5vdH\F+}'O,6:'񉔊5g̘!W*y?.W5a<bM)�{bAb.!X&.-wn5)"=k8My?Ԏ׍>n"y64G=>0y\ z5Պ4:hl݅ki۞#tu螮-ϹA ;MOAz_ژۑڼU;#% F @tGSOya].;9)H48/-fZ;iŚy3|Q#=jwoS=^zCo['�g+"spusjT')L~k+oN*WRqY𬙔0kѩwQ-Z e}9JTAb/OGR厝([2o‹-NNqi_"V.25^UN$F)lq$[nsPD-'" Qq|?7Plz/, 9ݴii|:KJ%&ub?Wxŕ/&V~Sć+ f&.W5abM)�{bmk '-]:a+S%"V>ќ>wG8{WZ4t:?/.JOc7.+ᒆQ4Ԫvt;s}37tmhq,K[0"lQӊWUmH[h)4g;%Dٶ E,rJq6u#Ɍi ǜ\l$ou3]=SwJ5&ks)pKn{i,l^ ]A[^g]|8/,/|ks&?oJ5 5] vekFwЌm\WbOx)^qNoXp+~|?px|oe1s:{"!B�')ֆkF'}?nuDgvIZe慢0`6X;ozE:r<T kCrVSS|y3Meڕ?4+0CG}؇5#yx*.XM �# P/YB v!4 Fnﺐ ê_0`",fkFMzJ's*C8-y8]Oϙ&֖fV]Y,4H=L5#|וX_o anu5GV � `2R X@.Ě55w;К͝.&Wa~ifyL~k^יjԷJ+%yŚUxTD;]5>Ѯkv\ @�tbmŚX.-:oobkXlĚrJfVBٵrQ.�A@BE?`DGrRd AifyL~k+z@sMRȏM|Xut%1:uR1`k98k|z7-ɓ vor< � � ( 0!bimܖ:oƜobmϤt|BFLo:ָ%>XI+O?pĕC<cTBzz<Fhv\@�tg݈T.D i4 J5Λ1gXL23i魽(*;"TTfmg YRHddV։'O#ISzu=%,=th˃) kkǕC{V @�<KoYy|_/|9ٜm䞡흫(*Ž&oΙ"K8_L~>Rn3mیmќ:]DnKBhu5I **bccK5.ҞY>|N:%?2nEV"۽A�@�Pu9{hôfQ}7#V#ЩQumS.BK̝8o/bM=U>HgV̓Tvst&n;>eJ{K^/)�5j!ؖ5gXSIi|H+ fsؤe#N4宭@7{ >�-;>|Kna䮼ey@�@�@�@�@�@ ^(����% @Y`4���� @ٽQ>�����KXdh�����X{ | � � � � �$�fj � � � � �v'�fF@�@�@�@�@�,I�b͒A�@�@�@�@�N�b5�����X�Ě% F�����؝�Ěk����$5KV����;50 � � � � `Ik6  � � � � `wkva@�@�@�@�@ ,Ym0@�@�@�@�@ ^(����% @Y`4���� @ٽQ>�����KXdh�����X{ | � � � � �$�fj � � � � �v'[8q) LP>�����;kyyyTZR5++rrr(44F������;\ mƺɓ,aM����^_LLSUbeM1233Sr�����g H ;k5������%�f�����@�2������ ֌C|�����5@F � � � � � `�ĚQb � � � � �> �@�@�@�@�@�X3J A�@�@�@�@�@ |�Y�����QkF!>������Ě # �����0J�b(1�����Xdd � � � � �F @% � � � � � k>,@�@�@�@�@�@(5@�@�@�@�@�|@�b�����%�f�����@�2������ ֌C|�����Rb-//N8A999TPP�����T,AAAFիW/!X%''UT7[5ٳj%cKT0& NY�ktJKKxXKII!N:+yykD`ܴW}4#>j:BxٳWb-)))** ҴUg@�E�㦽QթJċeGk%8z@g~ #�{iDiG�}~ujj{%V@T6206k.�i֚] PD�}-_ Eb@qh �^!q+X(x�P"! Ct0g � &qM�}cg \~*4?G �%qӲU+ R&,&Ě +&a@z ~�_k@5 =G�bs,9@�@x!6�#?�ڂ `@8R$ `s7m^( Z -[�5Vy ǀf޺e �$qӜ@ @ypL X(2@`,> ^'>u5`^]#>ѩ8e&`d@Ķg~?LLJw4FO\R*/�TzM9Px$.i֍ (&<H+2u!4&^:njTEW~v ڡ(@AyEs҅sW4V5"h4jA!1~Im@:vWr x:=D@�,O@︩Z4aU=g|5w.ekdvn-۟Nӂ֌Е'N]QYZJJ >}Ξ=IDD ΆW^VV&Ѽ Ζ1ePNwFx:=w:@ wt#JXn q1gy6'SO$&U1xTP[j]xE%(UVڷPt5l2i҃.9:QAPR4rZ+BV饫Ppᠤ}st<+V̪Y5=LgӑRJ!N?[HOv>xƒip4:yQt咾Mhd]-n9jo֍�qt4#jO@2mLx zqjNz%RldJqX]yk%am={Rs聟Ъ#g(Uu 4ufXGݻWbbJI4… _~~kfnrh}h_Z.u_.a7d)„`1•uJ<HeT/<^ƑoGY'N$4+ovz$tlO_X˗ kGU ]v:i[7z�.$ �wT?2+%u WQ=1V_rU2,8/B&GbzҏѨ jҭͪц,`VJ{?P$p7IfXGΝ;J*B,Ak_wzz;[8`R+4qS1q8F;?cMK<(#ChF:?Ԏ‚%@*Sep][8L<sC?ﱎū,oB 'l'룖Llnv_I1B��EIDAT+QMq ٭P�;n:0RU*KxiL^DXqձo»r#ĸ*o>l$WJX}$l;EKI ~ /㜉5wcjkz( x\ZpsW 6?`zZ+A.w«_[S&qS4}tZ<rSftOQWVH#ᡥezz4euTs7H2HZ1wEtwCjK @z~K.~q\goOq5L(sd]^WΦI�>jeu貏9SXlZFL@ora9 x\k˖-3XSDX,O.|yOs>YB4}.$rR S I#H+gNV<l\Yw@{C^ _ 4+kfo 2nzj!BlJ 2A0Z7G@�@@qS_, FZSwy3*!V˝X['n| hCs{^VL~q"=qޱF@o5ݰ<.((ȵk矦kω_!$ͦBv4}xkp, 6Pqp+x?p\j[3f]Ic 7%;�)¾G7l<A ^ؒ`{YPYGvKUTqZrjn'F٭P�;nkglJVs*ƈ=fͫG?big,88ifKit,O- WpM@oC4R@f7JOog㷒6cbX]C|<z\|Nj7[,"ZFi!}ܓuyJJ_@3yx/ܕ*Jdͮ Rb,4Jx+O6Um3Z7#t5:D�7>ow?)wtS͉p␑g"k|/&_O݅ˣޑ*N/Ҵ6DFb40}lvX۶mB斢+n|+hРA~}`}@^0nګ>Q@_ZDk;v 6P֭)<<>OKKo/ټ9�؋�M{'Jc?SȣbOZh,̜X۷S1 hlާ g@�E�㦽QթUJQƅfTxM�oCg6aqW[@�@lF=ʊK�}ֽKq_3D ��͊U(Zb1Ě]jDfʀ) � q#+0 \~.:Ě+c@cL �$qӛt6�h"X+7ܥA��#q/_@5qXC[8 hGA�lN�+ų<QWe �f٪3[7 @0n^`[�!65ocQ+E(‡AG �q< �؜�MW0gy裖B@Xl a8�����X@bbb) EPʊ.>>ޢ+iClSVf`Y `4k.(">/ Eߦb@iŢX �^#qkh0x�G0"2X+4ܢM�Z�#q/_@5qXC[8 hGA�lN�+ų<QWe �f٪3[7 @0n^`W7r~jZ ֬U_KT0& NY�Ě8_ h6\ @+0nz+@J$d�ĚA`�4@�0n= ~lĚkOeÀ'@0nZ`x!>ZA*ڄńX3aX$ hVA k7}M1ffUC�bM%1D�!\  �q�M}Ԍ6iĚ5Vc0u8�iJI "`>jFh<O�bL&o1m T g]v\RZ+]eǏS5emTQё/G gܿ?更yf ѣrtz`Kh̘1TZbYYYԿꫯJ׺D#33~mdW]uTJ,l;w.t)jڴ)=ԨQ#C8qB( .bɪjժmڵx69H!{^a.z([s;W\Q=T|4#B\&GB蓛wh]PO٧+3DrK�b-"6j)#M=Akiٲe`U!s7?KYRi#r&A@=;狼i֬Ytiz>T6l={>C CYh=쳴jժb!uMmV.уj׮M,,X@֭Yp端JԷo_){裏>2?L\s uM޷xb?iĉ裏J>ʋD_|nj4Sz(T9{NJpYN-:M.>HPO`[wlĚ*Wo@VHB:^DFZU9mrx7"MwtXr-d)Xh4nXF9|0QҐ!ChرĂQh]S秕G>}믿.ζ|ʹtREw'eWtE 0 H~/Lv˖-Rd2OgbmӦM4o<z]tq|K@o-˜=+֘ ЙQ݂sxn3DMk)))MyrY||ߪEog;)[DgSthtE-e;|{AZs,^\| {i슣2RhP� ]rXާ^v\vm]88kho0]dI1駟iӦyroo_|EܹӜ5護ޢ]vQJ8]=zhaƍG۶m#G҄ JTmiiiv~cݡCiKtt[2qnǏɓ'SFFF >j[/_.ݰaC۷wZS:udhQ|衇djΜ9ҭK$$$g}&twH֭Ku駟:Gv˱fر,TTٺ8㦺<w}˱W&n.\(oYztt6j]S秕 7 +#""-'O޽{ӊ+֌<y%lԩQOpΈ#{re gZhQ'x D,%*% 5k明;SV/}Tq7U1++I#bm;S@-9D̠Q4{=(!>4[{ݣbO.Rpl;{vBNogk7g0>vXR4!4S k}d 6]u!dٸ X8S⭆X޾辥K rd+oUx9 W^ytݩu.eՏNhYyW(..N"]tԂGbMmoX馛tFlem>|棎PxOX0c : < ٳg\l+nJFi=={,ԠAoYtlw[u^zQe{}C,@<[JNN7T%KcwZyKέJqN1+ybG 8/5Ogar_9\RR1MW,6G@oճg<Rg_y#cyL|vʡ WՖi-}Gv,bbbJQ7[(((oFGԶ-Jom*d fn?lDu+޴\j>{{ vT32}Q⾤ZRLxP(֔;?8'O]5~md&uw n^R8eM'|nF,vGq6^M0>,R&8k8PN.w۶mU`V,4նp;믿'J(^U~E]$-۵ p. W<VlzM/I~/P)ִt~x'r;t6s_0>Nպ{ʕy8*{6mXs^߳gOC8N1-p:ӧO/f[t*v0WQwKn tv2)GR2|ݴuPRsUFMkYQg|?8X"BCCD箻 )pY$K΢)R)'͍Pkur wl|ޱӺ:G+_@#S]5~+Ǚp}ǎsN:r&ĚV:<Y_ĝY%S-ڮ%lx'W7FX>+<i=wޡ͛;m-,y8(45+-Wح'KAȫ|_~SxgAv`\JrZ-Gq1q{GU|+(Q^}_Cq\%87᧞z@t@~+c_&ir5|PBб 5۪b}rMopƹ,O@o##}!֢y*JsseъokƟ'35>b˂=tQ\]_U -R<m&RBt(:ĚJŘ;QN][l)Hvsi� V:, f̘!]!W]J)#ogPg<$eOt/<''~'zY"V6kMд}oۯRY͚5\!5l*"5>"P2_;x5W }or7vg*Z}O57{x^XcNe9^2*xeJ`Oq|9[n.*78{Ɣ%! zĚyA:06lL.<8uzqZq_Cb'fO.j~!% 8hCϫQ0]ZKB2c 5U;yZddeʔ)RR.믿.^΋'zX}`l>emr�SWv[kZqjic(޿کS'9"=kjQŜ'W7n'|HnY< ZȆ O-<i9s} (_7y?)/:P6{|A«̼w{)ʚ#<%u]']ydq׺sS.+Q溪t&M$_ =ݥǴJgsYћy>VXG<5gGXvN䞵TZޯ{2hsO+kȾ9x\1*vrxe].־G#2 A",&NA$N (Tqog79)BJ^Q 3 +zXSN!=}%]ȈXcYl)I5vd{HؽQtN§x.ՓnF oi1<S$vo< Zqd'pr9c|8m IzM~+̝#ޣuȶx0GyĚV|v,\ܫv=΁Y`EFFjvLOCNm+&j G9qkɶC@OU+ #E{VNk}dv8\)kR->A^ XӊhV\JHbpul?#c}�L#l.y]j $)vְV@I7"@GhkњyT5~Ǿ漹1.vG@>u0>cPDWQٽWz `U7Zs0c5M=kFn?g ?ӝаO9`"> `4s6 2c5Mh+'Q 3g4=(Zg|1ϧMEi#�{iDiG�}~ujyTqY^gb]Xi@mpl& }@nl[<v#>jNy<.^tt6{1r�O~GWV)ĚUjBvb@PeT�Sij �(@ŀfE@�B�W"QQDB @ `@s1@�@@M�&�k{8 J@gI週#�{iDiG�}~ujR_9"?fariڈ*c3F �"q^؏�*%JJJk5uVVZ\.Dg~#�{iDiG�}~ujYff&HGPbe-//?N!!!ruj@g~́#�{iDiG�}~ujHoSgddPjj*;^%FlN?xm.����� 5j\$+%֬R8  � � � � �v&�fE@�@�@�@�@�,K�bͲUA�@�@�@�@�L�bε�����X�Ěe�����ؙ�Ěke����,5V ����3JgWv=r����IENDB`��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������flask-peewee-3.0.6/docs/fp-admin-filter.png���������������������������������������������������������0000664�0000000�0000000�00000123654�14605757052�0020532�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR��p������� �IDATx^xU''tR]+vް+^v^P }_+XX@z]B/!<fl%\$;of7sLR)BA�@�@�y$\̟#*� � �X8.@�@�@ Npqr& � � @@�@�@�D�''j"� � �8@�@�@ Npqr& � � @@�@�@�D�''j"� � �8@�@�@ Npqr& � �,[ܠAρj5"� � @ Qu@�@�Yu9Z@�@�c^Ipe]~ǞT!W~ &wqx6뺊zD !� �Ĝ@.33S~'INNpp%%%rAIAA.N}WhȐ!2y ;ׯ@XG` � @ yڵk5k}>zJb,$`V\) Ȓd̘1ҤIyXGDP � @L D$tM2x ?NS_zkF9眈TF6� � !ZjɎ;C<#?Oýo~\^8BB{>#믿ܹsgyBzpad# � �q rݻf͚ѣ++V~\�WFU7o~-Ԯ]ۺ>zزe}o>=J � �ĉ@K.#GNT/,wOի裏^ NtB#Fcm6gMh"_^=͕8P'OWOeڴiuپ}^zY޽{oC2efRSSw)/W믿dԨQV`VM,w&ng}V|MϢz/=#<ea /P⊀s?i$ٰa4jHg9UV2Ǐٸqc9/lN'̘1C}5}gHJJJz:i&'Re˖Y:qgCX@X�@�@ aBpr5-:]<P}vm={:J}r8 )5kDoذ<CVV.nv7iVeZ+ۙw((--~k~Z=ܨ5 h5x= ^{YJإe˖gܬn멧y.=}]y']{ / ^{5yDPY+�_p V psX@�@ 1Bpwy,_\t -+Q%:iiѢ㯡aP{@#PƳ>O>ۖ?* MYMjƍ5_^.ȳliLQ￞5,iheW^ 7Vz+Ժ*:;+z5, ذ{뭷)▟@�@�\ �w}INN\~G|뭷<\:̙35hi]9D{CN:$YbgO͛K^^['O'zBt.W^y5N:֤Zsz^!Y"3<S̙cmVn>@ :|Oĉ=ҥK& Zog/ͫʷ`kKU}hϨwg]'݃c?xϹޢWmV,Yb>~__!:tS77NKz z-aÆ+O@]GbN*wuWw]4R@�@�P9),,c*4ho8:Ʌ67]uUΒ^x{ ~g7oVO6umhX;v MNvyWk=zX:}} VM $!z.]~}kvJzj`vٹO{w5_ו^gG_إjx0eӧ[E'fq(}ޏp=m0Y@�@�9=rZ4 U߫o߾2aK-am<kc.7R_s6pFE_vرYҞc9{ !֯_y]{ݔHl#~4|h]t?l%v Y5\{E[nmzNIo-Ciu<c֗Eßu{�*MÔhXt^Fn v/\>NiET|  � @ t Ξ"xXC^2 ":DLgQs #an׮]&4h.zߓKmd+ڃDb֡z:ˠ茔C)} Ή\t}һ}[k;rusNo<D% tJ9щE;DvuICnu{+nݺUX'Yq9ATL@WvLګfy^e@�@�!r{tH hZ-D{a7F=IWΦu6Lu݂սiau{7e m>>!x:w}vWr tb4tr:LPEpMu{my/Sw=lof 1v\e=(;\@�@�#r{7DKFmΈ q[iP :A9a`w{ tvB?h֭[}nJ =64jȭlz_t8wѐa/ΉU=cnϟxv]Vw{}>P2-#� �$@NMֹsgKBgFWɞ BMZt:gC{Ƞ3g?P9Tn aPK.) :!6*/MC>Oޭjڵk{t�7p@YnZ:KeA3ʪpJgl&GLE7D%PWe=ZnBSe}>@qkr � �'rӇgZ~mOPi/-:RgIԢ3%z>C-7Y}]$u>H.xnl{믿^΢=:F׫w΀ WuR{>P$}gzgWG , � @ >sMî;X=MZi tio/_zߛki#hR8we߯6RY{R!SC]c:,鑟oCY&.b ŏ<g1_ "vq>Zό>'OMHu[<. = � �ĩ@N{K7nlΰhf;,R{|GnhkщE3/jo>pYiuQᚕ=M{4LEpN}rzz>K\-}NnHl裏}]뮻NZli=\48')eǍ':u8M =v:TQ[IgKw^� @׶NbE׺*st~oګC#Lzxby'*5Jv3$1Fm/u@�@�9i8IKr7{NlE| aLq)x>qDʧR{ HlC{)آLg94׶rsseU8tAyBymZ_{ �8٫l;u&Jו@em#1].@�@�_ �ӾkϘ3郹O;4P{w+WN)=^a 6̚_Ѻs˜Mwkr>ڻ.:iԙ*8z?M&j$25ECre?yY:>zx?Jȹ==:V<pPRu@�@�x9y?K{ ۷h>*_C~M=vwI{tNp3P:ͳ'Q߼yA{}giZ_U6pǫ$Ϸj{m4 :: OT_@]4Pj@ۤǠ4lϹp]+ȵz|v=+7>{,ұcGѡ2i$~J-[$''zVy'm۶ 8DMV$ @vxС � � p5RgSCC � � @ bj/N:yw7/Rϯ9{e UC�@�@� pAEsqsɒ%]4~s3?>S#nF  � �$�.ϩmiҤ5<  � �$�.ϩN#PcZ@�@�@ pqp>7r]ӉKtVN}Xzdfդ-N&UD�@�@ \x� � �DS�Mm� � �!@ U@�@�@�h ࢩ;@�@�@�0pa* � � M\4 � � �. <VE�@�@�)@6B�@�@� Ǫ � � @4pf_ � � @0X@�@��. @�@�C�"� � � ES}!� � �acU@�@�@ Y� � � `4hP!`C@�@�@ 6pq � � P�@�@�@� y � � @@\@"@�@�@�bC�Z � � �pX�@�@� \lj� � � $b@�@�@ 6pq � � P�@�@�@� y � � @@\@"@�@�@�bC�Z � � �pX�@�@� \lj� � � $b@�@�@ 6pq � � PUۺulܸQ n@�@�@�BȐ Hfff$//O4i")))Ղ@�@�@� ի%''GRSS+,0X@�@�@�!E H#S� � � P`…K ( � � @5 {@�@�@@X]vnr � � �a ,Z(!0Y@�@�B�"� � �)Vk۶mu֝}#� � �5J`š$ըkE�@�@�j U ` � � [\6mrOL.ZIޱmNBަnޕnkaBƍeرr'֞oϑkșTX y9]m@�@�@ 6,Yp\-<* gP<M!.ܴiӤ@c,K:%W'{Y_P"}8_mj]퀅@�@�@59{ɒeg $^a$Bꫯo߾ҴiSWz܄Zr=<YSCm%Ε$ !� � a֭[|diON5 qD2_niL]S uӒ?4wtF9k)--3CZ6=y\6wիe;f&dX3UC^*,"-#hy_]t\1CukYȄ屃[ȥ.po.~&naƅы䯳;yV\yY:l^":dl#[KZ:\g8xZ[ wT6>Y@�@�$tЇPF:n~sܷs9cyoZ~j<=\'G>Nny 0]<9䛅^vN6 a-׮1KL;GF\+y_]4<=7ڵ4H+.7Lv6umPnl29]_v Kfת|e2. &_d{Ly}6ܟϕcn9Yr^r%uuq},� � @ �*V/[$I擻zx^Wi$-u3Ӥzb`9{4̻,%Y2nzG2=h]^Zl-LY5umb7iQ֋2<;Yl)#~gG4keh^# 6l7!\1vx^9V;:Kf *ɦso^߻ss?#f JԤ Y@�@�"N޽<yL+IPTӳ6~VI5I:Hߦ� /oY/wflwSe=`c5?=wnڃOfBf;E}]_;vQFɩ*)))/Cm*~o͖Yv&jT?\ܮznCk|N_]\< "� � PC pZ )} ו'|6ou_ۖkv~u dr`ҹQt{uzu%L_+w[./)I޶gJک_C{fzLm{ެޘ#K.-ۦx/Y\iS7Mn*#gW8V_p+W)SG?Epڃ|]iBw_t2$'xtvxKP,� � @ V24wuTiE2ix;ΠrL,kM^!ߞArMM?.7>;i*'t+_."g^ ~eɃfBM at57[hͼ6⽿~Z%&?]~7EKj׮-ݺGYgY'7s@ #kׯq\dKtyk:3r\\˿{7ƭWxcg9@�@�j@8':>WFe|392bf~&r qvW( B}nN5,>9fJVrYV`n;NP2[>7$/if'm% p:Lqa1Cf]M)|}Sq jxtn!oN:+ӟ rdfVΖrޘE, � �5A �ײe썡 $$vxkժeM'3ZIJ{}纺m{9+8~벺-d'>+j=t[vtְÝdV6K uX%ǻ�� �IDATr\G+ǥܴ<`,lw]Y: � �5M` '4|mF̒W42fWMѡ?Y-9v@�@�-@?*GmrKeŖ"LJ4#*f' � �$@XE >(pW9@�@�p/bŊЇPC$ � � �.\AG�@�@�$Vk޼yn@�@�@�V\J � � =\ � � @nɒ%ҰaC@�@�@�())M6IeN*5eݺuR^=INNښu@�@�@ hx۸qՉUA"`5njmSr � � @ dddH $33 pU[E� � � F�Fe@�@�@� I  � � %A�@�@�b@�'* � � �npnX@�@�\ � � � Qb@�@�@ p1p � � F�Fe@�@�@� I  � � %A�@�@�b@�'* � � �npnX@�@�\ � � � Qb@�@�@ p1p � � F�Fe@�@�@�pJKKeƍ/1PįBFFdeeIz$)))#D�@�@�ܒ%K -)))7 ͛ڴi � �Ľ@�a)**?x<<IMMc3 � �DP `[b4i҄)[zh"X@�@�P `[`&!q\QS@�@�R�W6.Bl@�@�8 $I � �DA�pwA W@�@�H \G\$� � @pQ@wpY@�@� y$I � �DA�pwA W@�@�H \G\$� � @,|2h 9*/"GG}4 X2e|rWk&ӦMӧ\xR~}y㎓^zTH17ʱ'O(t>IL[UB:]IWeSjk4NMM@� Dɜ rg N忳{ 6˟nL/O$y^l9I,K,X(G}8Gf]3F/Zip* pv]w%ٞCزe 6L,Y"~aZt6}뭷e]&r衇Z;OdrwˢE䥗^~8JE2y$+U䳓;Xy<3YJ �+CceiI*;Ңv\կ+]"?/,#&ś CZۈi4>G8B${*4i]y䑞:~WqF>͙3Gz-ͻ%\"s9G:wT[H~k̻t1UƟMZݫC*&l @ j?[},==o3plG"}Z/w[._^8tzy<yXk2<?ùr>ֵU4ƑG8g]_0EzJ.=XoFEoiy=zJ233uOkҺukkXbn6w\y7eֶ:,9蠃6o,O<,_\N99rx_]6m*G}%M_õ^k6fYz\pAw#Bvȣ曗[Z.{f[ tjƿŞ ^> }S|D[yU|ӣߦع Eo:I%͇gtudm]e2ov9|̻tׇPЈ! ~Gs=ʀvuK3DIyM]գu/>M'v0=)VmyZߒl,<4H^<5mL2vX @ ~p޲* mkWx-=+5֣JMj%˴a?[\S:&cO,mLJ]^&.%ڹiVf{oP{T\;Q6^#'S}sci-/HYIr릭ԿYU﶑ӎ BuQN =Q;vyYA'흳oa =lٲOb JgaXaޓgy&k]w <Xkw} jZFaA toݧxP{dv</}}DB^7MC7ap%)E:7L9ˀfod=� llj޴Ke5�5o}S]7G>|kp.ص& X5ʐ7 +LwMލ?5&05;m.Ϛ.]90p\^@|nz44=3!Stkq] ! 㝺:_F]v\e>;7Ȑ LJɄU ߧti 9& "� F o^7ᅦ-us,lWGxAk`z2lD/µ=qˬEm5 < WS_jd>|PK+89q>:>9ɜr @>'OMXV!=*vis Tl4*p~r饗/,5zN'�yg%99꽺瞳LtxbjjuQҥKIO/kz Z\\,gy'=ki_]OoҬr/ر 3f̐zM{J^`K$q3=bųߝ-7zki뼲azkKS=kǣo49?$ڽ8IKd+t7 L_'kn+}LcV<lO= gyI?<7_lm^Eןk/t4N{z:MV^Uv/[{;Vf Ww+&g. �Dlծoi0vYmWgxzdN^2Nd\`^E7_hV}X7AdŰmSkHCǨ _#+)Ir |m%йoOQ:XzN0XrU}]TyvM7YL@hѢ\p!.)))VO tt8{ך%k:Lo ZhPCi\Z:ÝxO?ڎ˻lݺU.bq̔:>Dә'u)ryafԒɿpUhrK|'{{Rgmnׯv4wNLǗZ߬>= 8s{]K A#�7 ԡ M^Lvc7cag{#b } ޯ~wr[@�Tn{|+`&)6D7f󥰶r <{m[͸~mqmsۊm/96~ʧej4?E!Z{>m'fYӎ"vmҰaC+D9{GL7_Pƍ'F":Ke쏝:uݻKfDT:{4H֭[W157u=dԩS<uiџzk`KNCYVOWcVR9]ʼ3ֱK:mLp\^>NЄ2 f[K}sd2~gO\nXmp8WMe[fzմWspwsoߒl_"S.am Lϥke?G �6kWW/PPC֛>_;&49kݴ6$Jζ6;]fB{so64璞V/_ӎ!*No[x≖3i 8p3r^{Ʉ  M}k^t)4X^=kvL%rرj@袋N=Y6Ҭkz("�IK6%VW6wMOa:ƋyڅMuyQ˃2l&m<d~wf3Գ:v̐PK ~j%#̸t3V\8S:3JƦ Ԓ+z,' PC+`x=׮p7<QNVͳߞ6_"_#>^N3s}Q6EWWvZ 9ܣm˹=7CԵny]s-ӎk"*n͚5փu pl8{͛СCUgTT,]T=3k cBfBrJk6 Y.>UyϚ5˺'C›=R\a9쳃. p}:ۣwhz~wn!tvF95ou5yr^ަ7vBhL%C6Pvo\vtoΔ?Mڣyn}gL23GnR6+ib,יY(ul>jsjٰT] 3=&Df^4 ZtFF/fܿUmy8Pq G!�@n? p+@iLLz߽]磣m�6ݴyB9Ĵ}Ľff쳳M̵xc* prч3QÚ|00R} GV =B� � MtأϜ^9=҅Rt7סCϟ?ߺoG eB -&V"i � @�ϓӞ[&0C!C)&MO2h ӧO( +b<P @�@ QjdG\1� � @5[%E!� � 88u88IT@�@�(ࢀ.p > � �!@HD@�@��. � #� � 8888IT@�@�(ࢀ.p > � �!@HD@�@�@�'999Q %eYz5@ � � Prss+m�W|8T@�@�@ p1}z � � K�Հ� � �ĉ�.NND�@�@�p\ � � @DQM@�@�@�5� � �ĉ�.NND�@�@�p\ � � @DQM@�@�@�5� � �ĉ�.NND�@�@�p\ � � @DQM@�@�@�5� � �ĉ�.NND�@�@�p\ � � @DQM@�@�@u۶mHQQj � � �HMM T֭[';v쐤$kC#\_6� � �H]ZjՒ V8yۺuHrr2F^N4 � �T)..J{ 6X)0--Vg#� � @UXXheWV^m%?} � � �TH&Mಲq@�@�@�G pU@�@�@�p@�@�@ *0@�@�@ |\l@�@��.*@�@�_�![@�@�@�"@ 3;A�@�@� o@�@�@�N@�@�@�p@�@�@ *0@�@�@ |\l@�@��.*@�@�_�![@�@�@�"sD}/2kFTBIݥa='IRrrغu]VΖ̬� f_۶mKLG>jըQ#U5X@ ^KJ_V33֕#ȵ6䤄o7Ue'܎BY~UҨ^=I]G$%%ʗV+.dÖ-VZZvIkAEc\\-MJjjjkҬY3_~Il^^bz [?%k!>nr+5I2=%#nʶORګcdLK|keBR.kծ-RgowEۄ%KX U[̞ULߠڴi٦^ׯ )ev56hР@�пuWY$/,陲DNA2 2S _kWG;-hLӊzi`юuʯհ7AOU9s/n'0a֭g#z=+:.C)ûXn[ ,\Taq"ЪNdli;'r*>1J̽o ;S1C'ca翛7KI^8\|DN9sH>}"̤Is/st  Pso]~9՜jO y}=mDo7ESn9KSA}T5Stx\}޽{zգ^ɓ'ࢮ@� Xno"uG~l16M*Dm7ESnY6uzw.?j�׫WRO2�U�$&%!hbKvS>1fy pѿ {t}={aUIݧNJY6�DW pwࢫ {�@�H}b*:in p]?/.A>SB9 _nv es δip }98)V! ܶQ$oHNGz![2AM'J/C7]Xf~sp>b*Dm7ESn6upv|ᇕ6l`=�ףGb)8b_Dυ>[s9Մ￿믮Wقk֬ƍCC^ON ‹E@�Xmco(>=NƬ̊!>On5!.J%ke9MC37)=ͣ{v8 g!Uع*`Mq,{n*m˄Vt'ܴN&7ryn~nȐ!2rȰߓ5q\]s}ҵkW9E?6M|M<Knq\ /"mZyƌ@H�ān !gR ǿ<^(SYOψ�� �IDAT&�Crw.Y(cfmBdz넳*i7igϐӲuV5j̟?_ްk"�7 pY'{6nunySio%upVh\4sԖm1ˮپ]vK_\~_\ btÇvjw衇_i}8.G Ǘ3;<Ah~Z=UY<F*6 +|kUkm {Kw_e*ԄmE6,I5srMK){k�w�rI$%] '/Ǩm;j15S~keQ"~H&;󨫆Dj%[/۟dG:q[Zu,.#DZo;%3,pc+)}]<U9}6>%<y?37=V1m7yll33_}ZL(mH}b*M:\ϿworZOx_Hx1iԼyLYnޟ}oC]OG<􀴨dXbګ\X p}yH.??_^xѱm|UWIG)0zJV\)g}<쳞aܹsŋ[:묳䠃WHbC{9o nW^yԮ͕L.?\�~' pڣuAM\pkI=pE-zNy8qrmIvvu(Ak9݆6/i޼zVϟ}2zUUf͚E*\�DQ p7"YcVG75Y` J;K&Ȥ%g)ͬWt}YwkW9|߲p{m阹Et{lv:'X'`L_U'66[J^to9K}qZ9w_9cW][E{=˂5r Mc4.Z)G/׿7Y^9{`_,9w63şKP\0&gާ8mCrڵkW;*ԶR>19qdoJ\nYsOg˶ム$M"/Z6\@)\Tvl1o޲^m,J&sW]v䋐o!ڳӲeKрb '-t:˫jd+뮓K߾}u}]HlޯpJmk~7Y`\tE.Dcg/7=Z_K.04͛7O.nzBϟw wo^ƌ#-/ p/ n'= 믿.>#U*g&U.E�(`MvtrY}dK dNv霓.c/˕w.%e>Os x\g٠P|fz\tmY{f2}ѿ?2ok#7^]N5o##,'o%Z:=`zLy,9y\] o ]l7=z;br/[[.MOnz՗h.=M6ʢ y<yĖ2dߦb~Ϳ[qŨ)$ok3su n5Ɋ.vݣUo<>@ȵ^+饗6_PJnTx1AcN?aٲ-_z_֘NuJO,ӓȷ' dI;,t<UJ6tE\_PMhWi~gB+Dݴi~VpӢaIC4E&9]\\,gyz8qӞuo44]S_z p:TmU?#&Mz4Lj9\/]vaNS?|-8Sߗ4kC`2g\U]@ V.�7MtT'9]rqWs%e>O:7U-Y2.'kIהv+)G\._^R-_1C+)^Q 3_L欖Ӵ,t})Q*9u3d'Jxir&-EúOΕ囊}TY0Wuܮڷne3f.A p+8&ܗ9'MoYRU't t{ēBm+ESo32ݾ^Uְ-2 ݿsrzaյ\,^vwlϾZjRx~ܑ֏m�B8 W崁E_{wu _:DNXpCzszPLmפb'_\Nf}E?|?6L>w|fz=֏?hrz^Eoo#@J�ľ "!~^*2zR4f+}C %EKeS{HuXkz-ihYQKS]|0iury8wS;E;.[JvAw ZZ<GSw}A_X\*Mޟ .g4V㱷hEOkTI"unܹ]7oF-c[6]Џ+Wvfbz:H;E4i;&PIIy睢3Dj{Jo[IBi+ESOrv&f7'?χ/Lz^.Zy􍛤y\ìl8i}E2:=J=XeP֚ O57۴Ln_E{.z?ܣ>j]:eU=w[g@gi֬sιO8?nz+%!sy|m\VgOҞ1-|ɞILthUhak9ݮ~HP8*JsyQ V>I]/ݳt6C dsϽҢR|?i5kY^P(ܷ{g\ג5 k߳WHn&rK}K6ۮ\2j7fǷwo= &4f_#-? L\R`nl:RmmY8mG_qN^#K=ҳs]۹ k_~\]ܶ6=H  6c3_l룜>#M妽L[)m pTXᶛe6.l]7G._yY|5У2k-^&,7 /]/+Ϸ?y4 i{!8XľN<`Z5iĚB{ⴧbgqfK/=!N#[oY2nn_< N֪U+=p:,TUR* p釅ޛ֨Q#1zu Sûy-<{Һuko&]_Cr `=oW~鵨S"|uz_\Q P V}T\<6hl"Em#K-m[6?2sz-]#]Ƕ?X$/y2nrqe^meM$^h-/Gf-X!CM}|JSO{{np+q|9~r +m/2B<?lڰV PV{:u`܆˟KQvYvmHn+`~=m%}|=]J[)m p} p6�w^aZ>r8@kn7JfVvȆ+{FVr:ۤN~R`&2YR`flw/mڿzB p}kBV : MZ zϙ7Xjb >ܺ?NNrb.kc_C�]zE-ڳ[d@ZueQ pfcE?d%>ՕևpGWVgLj2C=zGgmkMkӦAPg? NoC&!b@ �w pY'1I63<NLټ`2[J{KK=|?sBTPN_KtW۳Mqnx]O̽gKg3!G,O&ͅv^;9[]oBr$&.-WH\ \$mŹ2W=Z6DvH2TF]ٿ]7_fmjM{bsnr{0mhUgb:j4ۍt]rVrsnTH h,R ~<-.+ln~ʹ돔 ba=ihO< :{=ta Zmg7ǪfH  V] HJ_1r(!Sɷw+=+1Đ*8&m8=m)$P{HRVmiC֫F5m p84n@ss'2>W$ "Ts_煮D"sU, V Hp~^s*eo&wח;>)ĎCFT pɶR>1~6kA޹PftsVtڶm݊88QT ` n>ל2aq\KNh h{bKvS>1~< i?.3Uљ,*pQ+eK,!qQ � ` #C$.QMnT68\7k+D#K.%qQ � ` L <I.Im&^1%j)m p?Jl/<!Jqpt"\8'%.rs~ݺuC$C`4 P3͕Ɇz5\VC^^KnOLO>&k-yqS9:Vr\TҦ72LG7>XVP6ol=4qƼ7(@�8пuWH/I)q~4T?ZIrYܹDm7UE'f5]z~=8.ȗL3g-%<ȏGKjVV}ڵkEgIb>VMgpFbOl2Q�L|~0kg8+z �'߶n+W.sbSv nK,]c H 2%;sףTm p3MCoGdՄ?%o欘suf֧tsw>[�))-999›n˗/[FE�ߠAvx~TWoby2vr0Ub~ɀ-s%=-\9MU�lj|U>*Rק6@ude-R`;+`\Ҽ_Z#�o]yx-UU'=8V.\$zr<|!Qz_Z#�#ߺqǽj $ڵxC=1B=C�@�@�]�gC�@�@� %̩@@�@�@ p~9>@�@�H\œJ@�@�]�gC�@�@� %̩@@�@�@ p~9>@�@�H\œJ@�@�]�gC�@�@� %̩@@�@�@ p~9>@�@�H\œJ@�@�]�gC�@�@� %̩@@�@�@ p~9>@�@�H\œJ@�@�]�gC�@�@� %̩@@�@�@ p~9>@�@�H\œJ@�@�]�gC�@�@� %̩@@�@�@  pk׮ IJJJt'@�@�v pEEEҠA uI*5_ m&۷oj?*� � �$@aaKfffNݺu$%%D\8>@�@�^ 64{쁳+oiW@�@�@ V[VV p[C�@�@�V�#� � �$@&xv� � �+@ V@�@�@�j U<E�@�@� + � � @5  "� � � cy@�@�@pn@�@�@�`p< � � PMjg � � @`X@�@�&\5[@�@�@ X\b,� � �T�- � � �.X1G�@�@�I�WM@�@�V�#� � �$@&xv� � �+@ V@�@�@�jpdڵ}v)))[@�@�@ q%==]5j$h�mիgm0ʂ $777ު=O!�q(go4\5{m޼Y6n(Z4 pyyyjѢE r+p'[C�Fe�Y]ځci֬YnʕRn]Ύ[SXspw�5[ޚ}9 𞋾yMأvXBڶm|[x}1ƪ3{W|G_\k}][{Lc x<k]x??x$W+hQ'g E@txE׻&�GZ! @@ w ^vG#Er- q e;QA#~urv��(נpQ@:9;D�p\DYNkp_|E"�8,@{'5hw8\/w>ТN@��Qe;.;hQ'g �k�( މ2x EKzduIsiTt݄u|˝,nKu49keR'VX`e@& ~6+#n' 3]7ҹZIҹa<rp+9C=Wc!bQ{.Nb[�Gms:Hƙ2rrTn]Na%eد+3-@J@uRyxJVZ_:>וeN(]WP"g}@_Y>jj|bb( }EJ*AdӦMcǎJ233UVQ'uƢ.ƭ]V37l%vn-FFJDz{ [ޟc:S^zlY[f=M vn2#=>Xf Ty6~xc=$;;[JKKI'N H>0DT}c p͗k.IVR"[^<f D(iIrvF-$ boNeͶbwVdz"eTqst@V\KN*;J֟SHFJ-ҫ aTş�� �IDATۿ9e۾$~:?/l#Ga9!;~|^UM@ Vm-Mf(v/jZཎo 3r%'+Ҫ{5|z䚿/i`v%2~),).2CZy! \0dY $QI&XOZ^^n/5lX%4WDF-~zTϊcຌ&soYE &~NW j+4!}}(GPܦ4-0U3YOLmfNdJiO3Zrr~VrM>`h-Gsӡ~̻tJ!nϗU1%G�\ uZC}Ur W`tWͱ_}tsM ƾ*=KDN@&ߜ)m}ы// xyQ{.ͳZ �7w\W6g\ZZ|'rgGT}c2hDfidLیӿo9J-`݋SeBYsuoIO%uSEz3,R[tǻ/'ЄC{[稩9]..ԿNZ?>Ѻ)d4ݞ/۫ cD�p=I}3qqfZ{N p٬s,-HefDEe{{E? M �b|8k|p5BC/* p>Qxpc#�=p))�_l~/6=揄3#7$ oG\/|H6Ztl+o <)fE^p2UϥQu{ufl.SJg7Ys ùhؐ3Ww`Ri dDA%)OŜŀ9t(3Q"$HX@9WkMowuNW#0W2 � 0{MΒy` 68`l.稭Msa{l9Kn<d96MssrI0sɥΧL+]t1bD 8WH,uvqjV(notgskV(|@;979?af,i t@ȅ'5-/1impDi霋kt}'Z_Q间cyHk^"&3!q^-HalgMg+Ƣܰ9帷gyԐOw۬Yt}P͹X%Ȧx5ɜg >-a>3uV)S&=;pcǎXwsmTGnpί=RjB:䭗Eu*HIer}װy2x2uFMrsu*8j 9M#u91 g &/+aqWpr󍸻3ps\ugʹauaMzȔIH 1ck\*EʝS3k{ZA|6O.ٷ< sw7[t>#w%' .xd\;:o'clHiK<e>wVƍ >qInݬևi*#>&ʔ򻳛 kQ,v\:|v)׸,"U PޝRg s\tu/^Uq^ZXb5P"7ALnp evBߩ+ĢCr֗O/A$@vL>Sc2 tz}f{&VE&o:N7{Yc=KὙ[(3u5.ONXDs;i%L\H>}l޼YFe˖B>/0fѣGrH)v$1r/"@>N$@I؛4>BE >Wx|TK n̙2i$iժ/_Pf |j`rgZ.v, {z* @ pw g)p}jС @ZjI.]^*++t&pU xg`<.S.�"nӦM߂ΜTU;V%pU xg`<.LɎ!pU xg`<.)4K]gL99eLU0#$@1"7F͢f 8 8 u4H$@±`;N((ଷwh֑ � P eX#spp֛;4iH(H2w,9 8 8͝u4H$@pl$`�;:r$  8Lcdzsf9 � �� X&e12W$#N,* � � � � � d&Pv8A;(zeD… ɖ=ϑ{:6 @\ pkͳ">.%.\ɯ*!fH &8ƤY̌!>1UQ2B廈"9ec1$@Nco m粭Ʋ'pp[+4iHc/ %>gwQQYoЬ#A c 8߱ <F((7wh֑ � P eX#spp֛;4iH(H2w,9 8 8͝u4H$@pl$`�;:r$  8Lcdzsf9 � �� X&L̓j)((7d֑ � P e8<YazCa9 � �� X&L̓j)(R(=4Y6jP>F:_NhZU^?At=zxraȑ#o)Rq9"ha3<We˖I͚5+t67őL(gJ+;o<yeԩRLA{8pTRE֭['vRlY9蠃dРARzlܸQu&n2~s#llذA}Q5jߡCӧTV-gM6/,~\R7o.W]u4m4t/_X7NJ*%xb.J}˶mVq1fW~P?;XKQ>b޹Ko:rB ˓?9Ko '7jTsިc$ פIB$JpϜ9s^ ŏ1XŴ1{ӯam\Er˔JtF?g/o]M :vXdUDfy,w|'ŕ\`:~US&3Bd=ϖ?\ ˚5ko_|QVZ%}?S "999һwoUnIB7/ zJN8}ݕy뭷V.(ټ{|ҥK%>#W^I(/\89sÆ c_(ME O^\8<-F 0sx*b3uE El(t@[Hę!*lGf(R(BMyƬ3'Ǥ8Hb:l&o~6lDٌ݄w&$]L^o N;4ϕp+Yf*J^^ի\{浧qꩧ{Wy;S/0ʄLBX::uR\r*J,|嗑"'x.);jU;{ A%3 {&*-SquZE&`/`#XpK.U+xazX KniZyl NWˑ玩/wΊMۥ dLzP v~^H8i\B`ttйT-S<5VA괕ù{fU36 0Nh#ȬYrjR&vָqc ivo4^z%;_Ng^%K]B"`unXYׯs=;HkQ=SNQJ/w+JRJ:,`s3<#[ W\VI; W^`|}UeZ5n /?dv-C=$ׯߩ.tsW/<-j[ +'ݠZ!"`2@_袋V,E,gq|^-b~8ckf WO>YƌX01.\'MBX:]vtYr2tPy' s\;x7qLƬy޻}hR6I->g"jmY  9 AKDDx&l?\7ݩ\A_{۶m4X~'T?Ո;]~:?8rK9`U2MH=oFŨEraWrԕ2sf%̣&*ʭL.;pq]vG!&nz1]X@:@mC|W*[ԩ\ *6F:x#xϞ=[:=餓aÆl8A /oA_{Nݻ+抸d6s$ALƈ#dƌjFΐ.']vP\r<z"*.M;n9_'y,j[uSz&u8%DW?+]:npt?Ֆu60w ζAa&jqoCU Hp@߱A]qgϞj1p+Ÿ9}xתU+e8s饗@, "` ޒݺ3t} [ê92}M4r8eE! Qb(t.kZ͌\\aR q,x+�o.`f0X.S79/-oh fjm?3evTo'j>xLu.ݰM:1[~ѢPDYЧ2rp^8xÙ3<Sڴi^n@zHX-C3 ~HimڛO^j׮܋{7~jsU=]8ZVWIg}v !M&=]d6`u.6@?G|W~N 8LK GC]TzmDMzMqHtuI,J?P cp:k׮U8g>*,�E,]s_m$t qs7xCp?�.`o &swH81m,!?2i$}.Jt!.cn*u[d/gY $EpsYxȟ.nzj-;\ ,aO]&sUj uU"+7ݹwWۡo3"r!4:^37K3 bk1Sa+81sL_eѢE" b/a@<䓲^y9jt6&d۽1nݪ|`2:vܕldy7 O5CNSXIJl2iGV_|v0MvAt~sOޭc7Q`&?oV)LZ$BtE藸qrB @ c[lQc <AԇgMmX/MGb1ɽ-;h# c n^vݙ<oZ׋+?~6CϙJOU[ n'`^M\Լ͏i<Ԋ.nzj-;ZpX4,@Lp͞.Se ˥o?:gа?VCf|gg ۡ8x3zP:3Υ&? IwD6oެvFj!=,q�U-,lDvp n8] &حDgH+~+!=g4g87ٴڙ &2i ѺvZpV\ŋɓID\"˖H(m.D OIpv3\֭ ;tp[B7$" <믿[oU"hluw1>a-QqE4 =z(A87S+Cz99.MA\Yf4s<R-KMVtqSkaՊOvd;SιunTY_E>F3p8{UuyzyһͮB[\>JFwL3}&;߹4\M N0{ \.$`;,3Qnzp-+au6t"а< x) .a$�B=3bX L,}YQ.7p{\ᢃE3y]Q j(-8Nol7qD5C48A.~Х咨\i'VlD' &c/ΒBb!^xsxB$\p;+ـ6ƶ:J^c92]߮7w�W8gtacQ<IsA&j<,B;P.-'cH>tw7{byf@YZ~ ԅ23R]<tqSkaՊ J,Sn s e]rYɶVV.TPn%ys=Y!+p[eoB9Y50gLv4si: 8&>j7%wILqq"aWʠ wpB@.&J⺇q&RŁx|[ t:&H'OVdg⢞ץgu3=f9\POe `ܛtyՅ.(Ǜvm5 `2bwq F_-XøGQ.B7p4ͽXG؟^,\ UbEmE-Hpx溘zc [vT~x}νa΅A!tdF,0s<0˶ڙl9k=&p>m:/O䶌̊%�\η~&6iDz8"Z*Wk xꏀk d!YXirV>yJNSS.b:@?`.gX[Fl߶={n v^" s8 6HRGco2e"}.֓8 8( .T+ݬO?y&m 8?l܁+iٸvۭg:$@c 2ebJɰrI\�pn xFJi{z* @ pw g)p� þAM@.9IUec>]rOwZ%7>9bъTXrOwZ%7>9b ]5 �l$`�]qFGgs@IHm,|29YGN$@$@6@ pcxQQYoЬ#A c 8߱ <F((7wh֑ � P eX#spp֛;4iH(H2w,9 8 8͝u4H$@pl$`�;\\8$@$@$@$@$@$4iR(v8A9sHЃQ"L25{FU3C${cR,f`˘(q k[p%3@2. fI3�\fCI\cIL*L H .8ƥYL!>)5QAGgUs@IH@8]svy:r$  8Lcdzsf9 � �� X&e12GGgs@QY�� �IDATIHm,|29YGN$@$@6@ pcxQQYoЬ#A c 8߱ <F((7wh֑ � P e8<YazCa9 � �� X&L̓j)((7d֑ � P e8<YazC6< /ߋ ^a8XlԬY8ɴHbDd)SH2eC+RT"֭nI~)[r![W^@qƍrg\77Ɔ /R?K/jժbM6ɋ/(C+WJ-뮓f͚%^J*%|b.h[O?${.x%*>ޕQOKQM2VquKo:rB Syr9=y_Z** RQYoZ;Lƌc//ҞfH ; ]vs=W:u$۶mg}VV^-~<j*%O<x_@|]{Z|楩I'${챇@1SOVH;S*T s[|{o$N~rΝsxW<C2p@ %{NyB6哝8rm\&J&j=:QoὙ܏ʫ'66q.*U-g:eժoCq⥻ O$>c7A'p5Jz)\s*J^^q .oQ ߼t6?x%܀wqW_B aO7t;9b)WJ,,L:U O?Q"y뭷drW2(3R9SL3Qiv""sd˿eM4^G".]*k֬Q+vA+aճ^v,os;dZ5WVeYy\o2bZ9AyR% i<ة<eLpoeOAS&/[oUƍ'?WTISN'xB֭^x wyǨAo7|<#* LTrssMJ}rGs6rHY\ꪫd}UesC[)~ {ayjuUVL\:il #&qQ]2 @>ӱ c v Nw`䠃Rc浧qG*LVX!{ra a6z,Nt#M؁ g}&~ڵtV?.HrE{VZ)Q1);i356n.ϑ/+Bu KD޼Ek]aKhK)poASo1}vNcys?#/ՒfkGɯ}Zr @z)-w-/C&/+6G U եVŲV˝ncܽşgŇj5R/v߀{ DP.]kŋ$ 38C6!رzcᅶL&?8Cqꩧ*A?t2൥{{ _~Q+$ô\:r.:HD{ƤNNtrk.}Uoҥ"(spqO-Iq-1m{bNآ[8@ΔuAj\95,Wgʗ//Xf͚9|ɝDn"9a G0`{HeM8Frv~IEy+Lぽ.n*&N={XjԨQVؾ}|ÍfHcyW27eKI吺bN Se#:An&Z4~VjLMv xw]#;nAnݺɁhVіq6 ϸM'-:a%C_h۶!j{OT 캭_^}'*ikZ.o?d˩ͫQE2 @ӱ}�t߯κaU*ڵkQ8gqGˢ;yEAr~[ॠ 1 mڴQ52c1.YPE)ر?K$?l8s16q.nA.:}.Jt!{<>I]RVɑH'[pQZwl/jS.~W5b`WaŠU>d v,oG0;]z)SJFBשQdws!/?bsDl>}L8uւ@ȹpŃ{G}$a6lj&!LUm:3 B69yd%JqXe˖*({0rX0tM˥+?Qy S^MqH >'~ Vwai˖-J`WLq}"1cn^ ??5{[$v tpnKL^M+ Q^>!`L\}eÕ n-9s̠[(*\Լ͏i<Ԋ.nzj-;Zp؁d4,@a0dܠ-޴m:u8&O_O'&܋[Q,;Or4L+W^�aD." pU\&4޴qcJpv5L܉N=8`N;J;̉Sg#J&" ăػpBy'݀,#`.Xh ~Q}؈ Lp.mb<uw1&| 8'\Fx7/h;ѣ eczAbp%K9\[O<ZzJiL愘S~s^Ҡj,XE8^^pKLL給P+驵jEapXTsn1_?Qiy~|r󝌏f鶞͓-{3p%:Ig͎&x.M4w]w5L2ӆ2ΦWR?+C<ӐJKn.Yd0k#82 y9/[pg1iڴ]r„ B".oو/@ ؙGՂW:uv"q 3ؽ+7$ };cL*LrG‚??]v}{jHDҁkix` +yJ$?pyDxQOpӻᆱ&'*=y&} /|T-WFnq會;4Pa:֡߂3݁ Vϟ?]ɗ'8bu+,`nر+:֕Nz|hM]Qy?zbv[([#kW[(ɤg:8ܮxm8Cnhq.nw/$#;mؙƹ5LB\I0B{l 1QvC,vpc \%R(r'[N :*\68dɒBl2Vqp\Ep:ӧOWc"f`< [�~Zt3gTƊ?: %Z)xә7o:8qD5B jäϹs0F|ssyWJ|Pz8+ LR'}t^ϟ.n\ۍI8lofY%6iDz8ز7|ZJ]VSxXL#$@6^V @bNm8`tj\aEgrFö$�΂ #E̎2gB, <XdAn n*vѶqX'Rii� KK$@2eb^'rI&OzDw n\ )؈mۖ-vg9*C Q>*LHlN$@6Z)ppć6jժ>$RY|RI7<mrOwZ%7>9b1 !p7H MwI*+Ud{z* @ pw gV\dJO͐{z* @ pw gp+R.'t�� đ�8:˜Ns_mSQYoЬ#A X-$P pSk7e9YGN$@$@6@ pcxQQYoЬ#A c 8߱ <F((7wh֑ � P eX#spp֛;4iH(H2w,9 8 8͝u4H$@pl$`�;\\8$@$@$@$@$@$lB]իH6 .2$[t>GO$@q%75r�\ȗ|h[p%32: f13�\TE\"fc䀖<� d;^`˶˞RQYoЬ#A l$`�]qFGgs@IHm,|29YGN$@$@6@ pcxQQYoЬ#A c 8߱ <F((7wh֑ � P eX#spp֛;4iH(H2w,9 8 8͝u4H$@pl$`@&w21ODސ9xXGN$@$@6@ d|'dZJ9 8 8 u4H$@pl$`@&w21OD+fWɲyPG%l(0<9oT΀"g!|'q"".[Lj֬YKt絸ʬK[F?i;o<yeԩRL58PT"֭nM~G)[tA2h ^zA6n(ݺuw}Puu66l >5JСGU'M_O?TV\)͛7J6mP:˗/Wƍ'J<Pe]5aKwz(]| uh:ѮF8>1 asJ%JJ9ɟҥ7U5bylT1ZkҤI!v8AgΜ9Rŏ0X˴'fIk;i>#eĈY"[q'|Il-G*M*l0MHΓ>[?pٶm <X֬Y#7|⋲j*۷2dɑ޽{B|tMw߼exꩧNw] z-矕 a6^)_tE>H>CyWJ/#8B>hܰadرrk+T|JwyG0;3O餢1͝ 9<1왺O"y}[VNyHa dȱDi6dFEi6t@w}Y$[?ZT4HUi Di&n͚5SQbPzkV DמƩ*^AtSN/"_MeBz&!,N:)V\9 D%xdM'x )Sk&wuWh&,M1);iKfLTZ%6t*D]7xc[tZ JX:vL;7ȿG/6I2rǡɹ{绌,۸M@A븻WBF1KTg+eJIsޭiVG֕/k$ ٔ{DvO<V.;v �GyDf͚%+WVl.D"^K,I:oӧK~{M4~QӼ^ZKժex]Xoy衇d;u&zƍ+ڵ kʝw)?^[_5DW^zIskAo:묳T֭+ ,PuGwAl0D9Ə/*J+21#`:z`L袋V%o38C>cno^{:{rͬPzdŊr'˘1ck2&vq:iҹˤsj.ÇC8\}ңG [Lڵkd͟N˰tL8Kϙ&vϼna8mr eұ^%ys}[ZA3?][%+ 87L>`5Eqm*]ӎr!ɱW_^= ְj l_S\,/NYvWGՑʽ!'6&)#iU/.ivgPrpX9d;0vW_}sb8 l:w}ԩSG9^dw393Ԋ9B"e ځC.gRp*"0Ƅ/(`CcA ꫯ{Λ69 D<\5j\ qatyׇw|I'IÆ U{"w4c7|Jġg!1WKqwO?]p " <an96=P{(*~W=]𧃾޳gO<,FícpP={ڭbT/iL4Lk%)?} \|lQb(QV5d+erOUys%-wYR.0`AըQPޱbW6ii;#S DZgسJ*92w; }ZJee\%-5ʗ)})lI-SahO8=^!Ɂ[&YrEdDWp/pw`0&68C]72-L 0޸oE۴i&4a Mo^i +~`L,r]%]u a5U}钀 ӱM t`Q _c 3p:ص"Ιa?%":ŠfH`Woܹ @"v[n;ec7=Ďyyw}K$?L:&mq#`DG7mgȴ KY炓9-oL9]㩔 86; l \59sR7Xwg'(nRB(,ֳeyAnų (EL 8ݶ$4VcҊ̙3_Erpt09rÍ^gw` 0qxc]OUTܰA``O^{ؒ 1 JC�w&L~Epon?5`7cQP]W`v .dI؋Цq n{#Ďeu 'ސc <\OGba˽-;hX".˅3pp]JugB|M;g8'=Ki3pQM*\ w_e0ttq''8`R pT No͑T*K]rRv&MQ]H9YDp-t@ p^%4m{キ:3p LnKbgQnp0HqnsL`=H:Qqu7o,}<sj0Ê{n¥cc9)<ۢE %M. ʻ@ԍqyLtE<x\݀C)EܩP뿦! ř3\뭷j3N"J~%*E�O"8tV}?pU7 Ad1x0s&tV".KL=[M 54tq''8LТ&{*j?9M>=4qe&C_W r:yN߼Jx��7IDAT.h-0L>{1%lLŕHtxsIp8Wm6qD5Be2bw yw{0ʎ]) gc۷o&68;=:,M<YRI갠˻~6"/>yYCdW2%XS޽Zx6΢]p;KdOg.GurQx ת<~:|S.и=/Vt|A#'];*͘d8'=KICQ qL83Wo \6"OzUZ3p+idt'zˠϟ.np ؁+U kTozߺC]V ΍<}@87TJ\8}2Њ[=\0H!e06C7qCnr݄p7{TuIYp{(._r/ro19&s0ߏ {g?Q| VH X?O#S8(Ng2a G3 .!nߟ^b pXN\yÕu1M$qE*a.LkqȏIsOD:Сs~&p>bv&uJ"=[([ O7m$2Zpt@]p\ 0L;<ǡ3b˜1'$`�^i2ebR'r3;sp9 2l6bEGmk&v?3q}=2ebQ7n3. pM;Wu?;q Fl6\zh*܉p &D})ޤX8;/2fLsLlK\'q" b-(c}3*@وSA5:Mrf$@$P87QGzsl!"rCokT7H1%.oZ# v@v 'kV\eJO͐{z* @ pw gp܁9YGN$@$8Lcdzsf9 � �� X&e12GGgs@IHm,|2KZ͝;WԩG~رdb{bH�4H�9+4'!I&*CԢE+T`n1bcB==iH 8ƻYz3ŋKÆ pƍVZYˊ+=UGN$@&7'>gyI 6͛'?DmݺU-[&999j϶#pU xg`ϼZp÷ׯ_/V|:H{E 8�rEܖ-[?]R!\$@$@$@$@$@$`@2e$77Wj֬qf$levHHHHHH Pu� � � � � @˒b6IHHHHHmHHHHH�\TI$@$@$@$@$@pl$@$@$@$@$@$%(ತM     c      ,!@%l� � � � � �� � � � � � d  ,(fHHHHH(HHHHHH KPeIE1$@$@$@$@$@$@6@$@$@$@$@$@YB^Z����IENDB`������������������������������������������������������������������������������������flask-peewee-3.0.6/docs/fp-admin-modal.png����������������������������������������������������������0000664�0000000�0000000�00000026431�14605757052�0020334�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR��Y������}j�� �IDATx^ 0Ȏ,ʘ7M !毞7Y]b+hԣFk"QI䍊Q 0\NM=]5˷3KWݪ;ý***Z@�@ EzR � Y4@�@ >(F/_n555q{C.EfMl͚5n[3mvVʖ,!�$5dl--uևaR1VȈel,l 7r> @,1cXnv9Z[ti#'dR}ˆOرcK.Fl9R gEEE(!+gjȐ!ַoVu4\vڄ0aB(mݺu dРA֯_zK *#�@0dhȊ XY?7\aÂցrL@KYҽ{Vm2ZU1LR ^FJJJZU(SA+c!t3f̰S@�@ 6l`/7|̙cK-Z Y~a+뮻>l1bDޝ*� �%h"{gG5jojwRR~~Wʯ3@m@�@ oz->}:Txjnn+W2D͐!� :2eKfe<d555Y]]]S#@�k#///ws:=dyÅV__'!� @ =UjojWO!+5B�@P(@vʪХBz yRo@�rW@!.ĐaF{Y۰8r@� ]U-#� @(#Gl5\ݜ4+ 4Q( �䚀B {euz^ s9q � x!K?zY4N@�BV>E� �Y'@ʺS!� @>,R@�: YW6|[~{n_Wγ~ur8vNZe>_~^z%dIVd淋S6B�@onz{キۻ~r~߽{,+C*^UUUVYYvŋ/m۶-gЕQ#[QǑy`}@�RXr]m2b4hC?ݐ!Clذa˺.2?&׿u~2fGlOGG' @�HA@9~չX瞮SFKnl}qYY "d|V[[nf;]/_O~~߫W/{ףu]6ol:CK.qwoD#*g͚5~mkhh=.B?-}Ov[ÓZ|Glٲeُ:;̦On={Lfx766ٳ_tҥqgg}믷[nƍgw_{;"� غu-Zhǻ\ޥ BQGe6lpV3fpac 6mO2|p^<x#8 7O̿(=W2TC+bf͊[?Yx Yz=q<{\VV◿e;@�$?h GX "dy睮ſhU=E _n̙~w駻ޟ{7K//dݣ>ڮ~gO<p'Opg.Oqd atz͝㏻1nY-P@-㏷3gںu Ǚ @�w}MR!KY?^k+ _D 6mfӢ!0 })D(LhT/'l˗/we)XM~Id'^4dSOk}Tzښl??c5M!4^Oa*.p„ h� @+ *hyK3Y&=sg%v(SN)tix*һwo\T?蠃<,-of,… ]}5K_Ui~8uZ4IPOrр7RqW2gA�@ 7nvN2Z48;'FUTp\߾}=hV=x'!7Hx?TB3<BE]d\pAm,~\cƌnj*НMzo?a=[F ISNmkle!�@SS}3KhS@1 5jՅ '\}զ-%V\wu\s޼y{oNO֋/I'BرcϚp?(yWL~Bz.]֝8q]{T4ݛ_yl?L-jǗkS* �OxWnJ ޽9lح=KAdvmow<}^s9׿^-'O{}/dʼo|.vKKH SLqϺ/$uӼ(]ɧEW^ֵk׸nHڦ~0קOD{5ڹsf5A �jjjgztw-Ww|O*s=7C�u`h}=jG]t놻 -BV*krz[L{zy=Pַ׵!֋??ORٲecMhO?tBՊ w?xW^$@�*ɒԣs4$EZ4Ew7($y`wn]a%\۫z4Iu3? %kz #4ih>nީ=-SON;ͭ-֭ym*y^0]BY v1W\j|PTe_� N Yq@�@#Y;@�@`Ys( �t�!# ��!`N5E�@� du6B�@� d̩ � Бf_ � P09T@�:R B4;{fwv þ@�@�zbLqq{ZNEԴ X^򞈝nl� �t@Vd:?@�K,"� @A  Sy@�K,"� @A  Sy@�K 'B{V)@�E`ҤI[8!r t@�N 'zOV޵;*� @ SA@� BVgO@�{BVޟb*� �!@ u� �y/@SL@�@3Y>@�@ Yy  �t�!3' ��!+O1D�@�ȺdV]]mW � �-0tPݻ>(2B+))u.@�:Q z]ҢEĖ@�@]Yjkk,ڋEj׹ec@�DYr\fmݺ5)ЫW/6l+  >dٲel֥K=dX@lذFm]vp�@އEgϞnv? dV@۶mk3[8!�9,!k6qD׋%9|~9tBЕz"@ W "d~ѫsp䒀krq �!+tbv@ SCH][ @�!&�*@ȢU @Y&�C Y܌tŊik;scC 1# Pم{SO=tL d) �!+ !+ �! O;F�$M RUJ#�!+%K؃>h˗/ݻYgev#۲evm駟ڹkwuÅ9!@E@�v(螬N;4<y͛7̙cgvJ Uc=~{W Y!@Ȣ � :dX3<3.nuW\A ܬX*3N}@ @Aj;w-]Ԗ-[”w駟n<{al� :�!6uE�n;v>6dOn7x 06l`_~9=YA[�!N9F��;<S<x=CkE}g=zSN9MW ТX Yyک4$(5|{L7A:u Z^qWVVV9'd@|B-UC 2#@ʌ# @~ |R:E)\'C Yp8FhBVG?P'*!@Y&� d@�].d---^z+>w $~vaڅ! d @�!O>V\\^EEEW:^E-lmt+L 㭬,b;H"]=h]k, �;ԓ!k֭zj=z4AV@TC^zD�rS BV]]dtPeͶvZSbA� (X)`;S Y4Ccָed@�@ G*di»UA � �$NztvM|W^^OVUU{~  � K#G츺KMcE�@�Y@�@ BV� �h � @P)@� d@�@�Y!R$ � @Ȣ � �!B@H@�@E@�@�B dȢ_,YVtKyGl� � d0K �&@3Ftv� @ |O>!ӦMK4_ͮze~)+>bWΆvӟ;k٭G^X.Tzk^[֝}(ڥ~a'ͽgo__c[[ �d\)S-ܒ>~|P;f7ڬW+'2F5ffUȺ|P6~q}mK˶i|fLcK[ҁ2 �"@Ȋ릛nF\RRbfͲN:)-+E߷ ]jKm YkgLA=XcdvV7XyՓmLT � "O<zV__kO<10ޝZoZ[^ S^ *zY}SuL9ra=ņ!B_H |X@�ʐ&׳T]]mWc̙6o<C=l2g86շ>B;޷7Ϟ`#يwj+,R9 � @d]Ȫs=IZ4 *++;DLÆw*=XށvۻlH�ѐ֧k߃ #ESN@�ȸ@V,\5779QWGif_Wf72+uu&ڣͶ �d@V,͉RҒk!+O5G� �)U!0!!#B�@�L 2-Jy � @DE3@�@�B dJ � �!6� � @ "@�@�Bm�@�A*E"� �,� � �!+TD�@�Y@�@ BV� �h � @P)@� d@�@�Y!R$ � @Ȣ � �!B@H@�@E@�@�B dJ � �!6� � @ "@�@�Bm�@�A*E"� �,� � �!+TD�@�Y@�@ YzUH@�@ <?˭ؽtZTQQђΆڦʬŚݫ*++-@�@�Nȉ?Sp) � 'e;@�, Y VRRp!!E�@�tk/ݻ.47+]s4{d9l� �)U=Yl @�2)@ʤ&e!� �;Y4@�@ BV� �h � @P)@� d@�@�Y!R$ � @Ȣ � �!B@H@�ЍB]JKKk׮11<&ҭgvA*Կ� T@aڵ֭[7Ӈoqqqmu=ޅ ZN=sBV5P/@�v lٲ^ѣeK555.p'ir/z6V@�@]*6&m.J= YI+ � Z`ַo_Xb6mdCM~AIJX@�BV64|&Xyy K x αUTT9n:?NHC�@ m\ iW<Ɇ`L|Z �(@Ȋ Y2d555^,}Օ /VB�@ ,BVgܸqUCg_v uȐ-( @ %TC7ܪ2k_u=}'ZY3RVՓ}/|աe[n^zT̉+(h7K!kѢE)2 �H%dw⦛n믿}~iэ;?!n ڙK𑎟n qg{qi\ ]A뙨G{:}{cccЛNJ=2 @R /ifjy_ھd:#:T!*~{ߋTknP ZϜY*׋EOV͈@�2)NH @{/wo:?s9vVYYi#G4 =#iӦnf7o'x."7\}v{lŊma!6K,g}Qߎ8>|x`#ԩS?Px\y|I;lԨQ޳O<љyK*CAI tX@�R Xp{׾5Wo<Ӑثj￿ 4}]۰ava믻N4Ʌ} o_vw^o;#<r!؞[oGk\%hHO= bJcmy78g;餓<\ӠKz �; ~<=gرȻ!BҕW^zԳu=%\ޯz.b[|_N81cƸ9m{yZ Rץ^K0Sb%%%6yd1b;Ty n O= Gޥα^^@T=_y[f 6jT,!Ǡ$dO �) ߵ;}{sc?&ԫ]̙3n ֥KhPXҶW]uUVY۪\ݯGCkVr;3lut�m6{r}Wx^ޤxMóރe"(�� IDAT YS˜@�:@ ݒ;x!뮻3fDBm4̨u4ܥ4?K==Qgv"6dol U*h8SC]vY`юY:7xܹѐ;x '~խ3A+de=@�v ں .^ĉ_~vziNb)`hOÓBK/w}tk9M>o<[`A4d6e-4A\=F z᣽~|]hzymܸўy7:s1nb1}hVF � O!!3ް -[뮪Ӣ!;4s=oinoRTRy Sztt�ZtU&k9ܧl Y_+!coK=&ϟ?M~W92UJ? �$JwDa%:'fW~[{jv,H*K7\=E9% >2'4co֓E*'˪2'+ig=@�H%$x7ɿ?F^lm.AG~JV?$de=@�v r9hu$drk@�:E CBXhAG'!+F �y+!!4|_zji� sx>}dk_SSleTIJx@�TWu SL_*$d%k � @[nѢ[ S52:th޽\KB �PPM;nj۷ooWYqݭW^6`@˫k[xdr@�@ kYY{j80@�eBV.=@�VC�@�\ d@�@ kYY{j80@�eBV.=@�VC�@�\ d@�@ k:d.UUUhѢ@�@�x YJG% MCC;=ZK_>SӳX@�@�\s.sOZY2mf , A�@�Ns.8�ٳgv,K=Yݚ3gM8ެNi&@�RP/:?|z:'tӦMaÆR9ˬ� �*Pl2{g Yd^x|6n8ݻ7aC ;C�@�m6o<={bu,,/dņz7EﵵJR\V5lܰȫsdcD[Jܺk%r\ }elMTo%lڴNd߾}vz^v_~?<}Mu"85v-ӿxLZ<XaÆkmF\m w-oGx`ƍw=wmmb_F*ǚʺjqIe_�B-ڵ.e,dž,UծZR:|m_QiőȫVr. ZWJ[Vvju\Hy4}Ⱦ>tu떴kڠA@7p@;\zu{5kD^j@֭]{kׯ'S>ZwfjcC@j*w;yлǮVXa#FH}9aT]:E�3&߾AB,m{n؀d=Y L]_&uH۶~5E>g}X݊ՔjmV Y=J^Ⱥ[κF2zuk{]G56X#[4dm޼]ɠ0TSSc:SK˖-[\{އ>; nX=*SPc2 EǦ2t|*CuzTzBViii`$k :ի\J9rG;T/dڔڎΫڏλ,ŠK%|P4"�ÀA+XYT+Ȋ{,_} VRUY$<Evl 7aeK{E? k.~}$5G>P {%Ho\C佖CFH#c=FjzА"}CZR!BHww==i]pV\]/~:}z]:6u*y,MBtVWOοڋ´G~Flm{*[m k2u.|()/dÕ?Xuj*h׫U37kKS$GîK:Ĕj==n ((߅{Q:.q8JM pFrwV Z*<0aam}Ҝli�s=CYRcGbXb^NJwZ/{9aW>ҥ\hK ث3ՃCB?Ty~8$%nz-k,cѹSǛ(d2' "p!!P6D ;h8PhȊ& [KYiQ 6D>zΦQI[&dV =,\ElOVZUG{D&&޲#dhA/ (L+1Rũdq䆡m߰42;bU^=c&:B>{/di 7{jH/f�+U!nkn+"aݬ0.B;NI ޭ $Q}u[NN@�BȪx˧Xqk $N&ݧ*2(0}KOFw/yWzwzہ׃% bE荒 @dUȒV} ;7nҽ[N=,؀v`Vkna^DwH^(d: Po S B ZI$Mgcɥ /a S>d@VlX@�@�tY騱  � DEA�@�B dJ � �!6� � @ "@�@�h% ����IENDB`���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������flask-peewee-3.0.6/docs/fp-admin.jpg����������������������������������������������������������������0000664�0000000�0000000�00000131260�14605757052�0017233�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000�������������������������������������������������������������������������������������������������������������������������������������������������������������������������JFIF��H�H���Created with GIMP�C��C�S"��������������  �q���    ��T !1QRUVaAXq5#Suv"$%346EYt 7DHeg&'(8Cscfh����������� �G� ���!1"AQ2aq#BRr3b$4SUVcd� ��?�wd-n`15<| C1mՖe,烰TynWrb#2w5! lccͫZڕݬ՘)ΨIy 5v~nIVIֶ(Iq}lZˑVxeq[dV<bIv) VW7Ҏ[VUbaW# H(.OX!rΨf]62;fxI#a.QwO` eؘ6RiHb9Zdq !i2zɎu11k#S˓}1IJH4-MMn[+[he-iJ֔WcY>4ڦzll b}fǠlN2lIir]TiRo*t^ԢḂ"vH+b2bCj?a8eTUk> I+a<X365ե;7OoSHdVqRVH o"o&#,׮ьD6͌y*uE1*NmV9c;jl20y@Ic.J:zOIrG,OjRҽd/e1\K$OehsDIż9ܰԦfne77fv{ZOXJX#6e)1R[cGaE{d[4d,CB2>38;C&PrJX^0ֵ1856$yaҫ+N_Gs[[0MrlWJ'-Yl< qma5`YbM]l#t{^�PzjC>k#~l%_!MnG?j;$RTlR ژI{4\Mԩl+J}ۓm6jmYKJ֕)bn*L\ƹiYX벨l/DB^K#zgL?q8uRP<jŮ|]\4fh7@A^W IS+i4M#d钸Y2 zz6lxϯp<<r0%x:Moy!443խfifvO{ R&W{evʂ߳c'FK!XrHnTemF}h ۧO$ jqs3 K]ymke󶴭]mYmծni]ҕj]m.nԥCn[ZlkJViZVح+M/*֔:2)Vi7HA`4KAk3(D泯m--$}Qgw+Ty$u\znX#gCOĎd:06s~3kʬXl%YKi(Pߧ׭KV$/,p pPԩ֯$%1#h۫}-Ի[CZv6Rme[J.SbTkߕ])N\xŖt&t}|"V;vGfuC9RdQIK{|cFRǤ,9|ĦYrV(ArʣdO+Z9Y'[&oqTmF<VRY7ܥ6 |�V@ 蜟`Ք {] _s.TDGB#(\VXF?#ȫSUkFk ܒ# 26ao ЪYKcRf܉ZLlʣ0'{{hm=q$KlBҩi!l?sN=p�J.ǂ�N@qϳfX `6$3{] _s.嗔Ьi*fB\B<`N]!*JL}:^{ku65HrbNu@]H#cmϳzU#մ0aq=KoqDw}̻]v|W:)ΨJ~W˽+eGows\J~W˽+eGows\J~W˽+eGows\J~W˽+eGows\J~W˽+eGows\J~W˽+eGows\J~W˽+eGows\J~W˽+eGows\J~W˽+eGows\J~W˽+eGows\J~W˽+eGows\J~W˽+eGows\J~W˽+eGows\J~W˽+eGows\J~W˽+eGows\J~W˽+eGows\J~W˽+eGows\J~W˽+eGows\J~W˽+eGows\J~W˽+eGows\J~W˽+eGows\J~W˽+eGows\J~W˽+eGows\J~W˽Z۶i֕�y;UإߔTXlJ JRVֽ(&%=W[kvviOw>)]nkcvwh9/eقLiܶ(8T,kϕ1V`쯑8J+0lEvn*O*,͔a0Vȴ^M*S@2Nn/x!cN#b]�&?[0'&Aq8K,})$$2k'ɤ~NI{X qYW;v)rIU\6I,pn$n$C1'Fk6tӷJW6W>n�w/ d:bE/#oYfW|yv4ս't`d6\ vQF V),uz$$$NxPn1;zi[#ɬ]L7إGc~U~\w(Gn̘,oK\2UL .�it@'q+Gf8-RY+=al}X`w{Skٯc_ 6v-[�Y^gu/%Y4득˜Dg͚0i8$Yѱ5Z-dbr`Hk.R+,)f2ձ},WڔUԮִ٥{[4O�2ÜČxb|?a<+ #2o}'ۧb~|_.J3MG IޭOeȲĉn[24Y+/zhf8d5д寈c\Ț�=4~nSp,o(-b2Ax\/eKӤɳ Uc (%HҷsmWb'[* ĶVklWՀ:VrOpByG63 {|opQ%y#p*ɵI>jZb!YN蛒1[1<xb,@sj[DG _$z\{E$8,l;B(ѱ+W5=Evw;#kƦ"@|łhz{ۄ)6W'@ qPV܂F`   vt*FF0{RS֜WʜjͯRK,n}nPZnkcv,|av?-;ꈜMAv6vKkZ6=lvEYh| jk"9T٩<4]D.HAKb-Tܩ= (�龩=?Gvk6M*~UwٱTa`8< J�E=WPQuiַQk?>MjHvtr^<Ÿy`ǬP�a,~X;c@;c|YҔ2R~?ʕ~sKN>%\صjaN~Fﳩ,e#b5#Y%=J3V{J5Lr(t: ¥*c~nT|"~{oRaus[ ³f-$=?S_�5Ԛ*%kOUx-7/yhgJnsM]|oC~/{Xa/O-/1dﵬ9"SsqbFʈYoK}6⮴Yiw%2&'p-\bIMHێ"RU:ܫ*@sXq=kSUF}oi[^7l{EETNk@j+vLnEXX =�wg?BY�:꾝 SVAM+j\%MX�a{@Q\3E;ZDA~]֧+P_CWyOd8-$rD�_^uSg_� jKa^ m <ܿyd"x|;?�jAl|�u֧+P]a^ m <ܿyd"x| j}�~?ZDA]|CWyO7/n_=47T֭{:Kv?t>;?�j_Kcb]a^ m <ܿyd"x|�֧+P_^J4iMkR٭VMխWb[[^kZֽ{ [o I@!Ǧ_^.߀>A%j{ [o I@!ǫ�S蕨/ˠ�OV.n_ m <ܿ<z��kS蕨/ˠ�OV.n_ m <ܿ<z��kS蕨/ˠ�OV.n_ m <ܿ<z��kS蕨/ˠ�OV.n_ m <ܿ<z��kS蕨/ˠ�OV.n_ m <ܿ<z��kS蕨/ˠ�OV.n_ m <ܿ<z��kS蕨/ˠ�OV.n_ m <ܿ<z��kS蕨/ˠ�OV.n_ m <ܿ<z��kS蕨/ˠ�OV.n_ m <ܿ<z��kS蕨/ˠ�OV.n_ m <ܿ<z��kS蕨/ˠ�OV.n_ m <ܿ<z��kS蕨/ˠ�OV.n_ m <ܿ<z��kS蕨/ˠ�OV.n_ m <ܿ<z��kS蕨/ˠ�OV.n_ m <ܿ<z��kS蕨/ˠ�OV.n_ m <ܿ<z��kS蕨/ˠ�OV.n_ m <ܿ<z��kS蕨/ˠ�OV.n_ m <ܿ<z��kS蕨/ˠ�OV.n_ m <ܿ<z��kS蕨/ˠ�OV.n_ m <ܿ<z��kS蕨/ˠ�OV.n_ m <ܿ<z��kS蕨/ˠ�OV.n_ m <ܿ<z��kS蕨/ˠ�OV.n_ m <ܿ<z��kS蕨/ˠ�OV.n_ m <ܿ<z��kS蕨/ˠ�OV.n_ m <ܿ<z��kS蕨/ˠ�OV.n_ m <ܿ<z��kS蕨/ˡk&=O>zz@:PUeLO=C^ͭmLmJV4v6i^im'CyO7/OtE>ֺNtc0OTcZ'{I[o I@!ų=Q}k�fA>O�Gډ?|yd8-$rDlOTcZ']ƀ:A: (nQH!fٶXv]-ݵ[u6ҵ]ڭ+_cN m <ܿyd"x|�֧+P_A�;ZDA~]a^ m <ܿyd"x@�At/�v?֧c�V.n_ m <ܿ<v�;{ө۬2:5TڌNcOP:X,2#iwm6Y[ fW w15|7@!m'G~u.]`Q^Z-jJj!W 3�Z'~ot^gIԊQn[:* c`p0>�F&5�POSc٨nQ?bk?/J{|>yd8-$r_/�5?�>�*ӷ�ܝ1ϸuD�щ�桿%=~aYLP%A"[sYfL,ʵ(\q(j-eֻ4@#4)+��CH?KFQl7_fu-W 徲<;WԺ=7iNzQeWPfEEW`8Rd�=�}Ja^ m <ܿg(W[%Drt䤩%֦'iS},)iavZ}_Z_KlŹr2by/Kp ~q@B@NW 9z_0/[ËZ4+{cc'//[^-lO~r^-y/KV�_}rao 9z_0'+/[^-�y/Kp ~q@"rj +Z/IZҕ)s}6;Tj}+_bjdWmʪ ٹb4ʪ^څA[)uiJKk~+ZSgcNзWvWu-ZSgo0;MQ1j9<BkRJxU9 HT) }6QsR"ԧq.k ~@%hPY>Aq!7Uh;jY[LVT턥dY}/4Iìd?sΖtŪ [/"F'\"y ٚ|,EXc2xL\YxaV.4N{J#6V/m( v/o*uқ0f-1A ֲ^ 8cU~պkܦv�v;;ͤ}Yi,v|G/hNw3\j.EU~2./]yIקTO_$ZNz;Z+ģY{y2ح'[#?Eݑ)4C*vgu ɖbEf9ř/`T)cY Ξ!K$Fy :)-v<Z*h{a+T9Bs nu\`ݦ]Mg�NdzV2ɔ[rC!+M타4 ^ʫE~U ߻=wǓc;q̚t[+ .oKn\M"CڕuVR+a;�ixRrUS?I9xUL&1#Fv[*y4_5dlaʋ소n=mƚFKu�!Zf3Z&9t>ɗ#ck;6i9֦H W)ј۹)֣b&xԚ8!I:[C QK^; ƹ Bۢu["\v=�Z֝SJF;ahu{]CjknoLjU^mJ*enmv+ZR? k\Ωnb},k+F1 1 f}Ɗ,Xj3p)Jv%4 V֡+QNܓ)S隲eJԩy)S!%t[ՔIѣ)KKHS'I ʶ-c ڔ^&Ttoӓ [F ;= ,j5to^m6�ya# �Xu96osaiK1ƋN2ܭV'bPg]JwƧqx'˙䱉"\Xֹ=RMqeJORpgP&sf_Eqa:χjWђnuZmRކYB*0.gR j'Y%]ͫhzRg4O$KTEM`(r<_ 1ޡq%/TI\[-g5Cw^շ.>U/ �[u]fs5e9Q8Uv8P޸O mPf^6Ӽgµ{*b=Vi,;m$NrvӗqRv6nu-kM|U 0TѷUa i#>ǡj%E:A]dϠlN*dUĤdԖ݊[XňS6ə5`~ȹǪ5�L%tx?TY̦M0d")Yl{٩t=Xf3$TǒoN^ Tʶo `bؤg"JnVt�GX<x^ܼl"ߎMubKJ,C2gXU&ps(̲oa]]nvq֭NPԞҬdECM<c:td|;HnJs2iahM *ˏҿbݨ]70>q5 õ`+FɇĎ%qE9#+fly̸U#vmD_d tjE;2j8鉡<Ӽ:M Ǚ"^V ōCJHhwErXq^%zL-e0{aub.OӪ+N$2g>[,w)oPFTV2Gp�~JWc W`Sh#Iozl hS֜K'b"=;4fLc-v {zpu̽UoBچ֐ʒ+ ]HLç9jەƝfRI+XӂMv8)W&i$h/4{wΟENݎ.Pfe`k7*gJOuy=nT7sX׹lrr O_/v{AO~v>>)CA|]PPe6˪'t׬<ט"x^\$Hb\Q-!ɱJsCS8N嚿,Es[mt#ɤZ§<"' (z}^ b. MD,0뤁\\Uu5Z]&&֧ ;.]eCe z>JDFrA#_+=_]cPeʍI,g6fLI43JͨS*/0M-NfnRYu/۩ں>jd~5s"ަ3R�H20d<,(I>Ga4k({&Y%-d3XB3[#sr&�r'�T_�%&CK0-TkstMcoZ_I 'vӚjJڅsojр NI �NH��������������������������������������������˷_ՈE˷_ՈB&9j=&ޠTLRbYф{*o"ݎBR ]ށU-ZMNaw c 9wF?sғV/^}]LorM&Tz2$/;*5om:ywī1e|^j.pfV[m}[݀s$4Ι8c@pDPB96_eIEl.Ƭ.,;Jry n K}$\Sz)*lzr 6YaTj\1[C6epJ$P9~OTH1H˷ie9W0덲*h6"媼3<@MrG&ַL6[GTjU͝Q9#I:r2q8`(U Q1tFOx~ NskF1J&bTC~1~x<f[."Bhj26PfBPV`ykCn!Q೎35HSl!Ԏrk| )2a!:^n!cp`i4eD1AG9b\W&+rج]L8ڲڋg]f[(S+TrhIbB栶瑻5yܗUVdrA~Y 3+Tj|wjԥW\,k0rȮM < |Jj6F)mZa29.֗uoRL'Ո O`>AFFRM,!ri1Id]&,VS@Z<ctyjy>?&ɑFCG㊝_M\bŸ/RQO�ltܛ^, L_\K5"iU-l|Pč6vձhXW) e V#@Ŕzn"ȳ׸i]R7Uq(R7 F7+ih7feE3ߑb8q>oO<OYmqZhVQo EX]`oD*0jces_-)Jy<X;!NϿ,nsZS4@Z)8:Mܖ>O⹗+j^5 " Px;KFCnAt>.-ɤ*Ci3Z34~ }(g1MX:V i:R?Pʼpe]MpZ 'yݵFJےT6xQQ;å}$c9PUѨ.p~P��ݪa]G�@~6�B$PvWu:ў)>-iYv:V7ߐGȖһ&Dk+L1Q}\*N䵶[hGOv M#JڝщSj@Kd1{J/n:8*,:^`rvܢ #kܭ2ggfmv)[n\Tt`т�7%~szvjs ylXc,ۇpr�m@#4\(0Ԃӏ)+ څ5&lm7bjF~dVtMO:3Æin.c&tp+d:zs);4-9c"@ޝmPUf}.EGFEGF (r8+\1�Z;F\P 9 �@at珓Ckœ�ʟk?#8^9U S i9\Ô{ZK1T;HE%'nG %c>7Ex�Eڞ4hRShFEGFEGF!RpTi{goo{22 kڀy?&Zݓ69kLVJ[rjV;(S+w;s&R{+ iI^TCO݊Qly!sap|cUPdb7Io9zQ&H{H1JNbqh.m"H"H )FSK!V#jڴ@f\dfĶ?zkK,Dv;�#sQ/ڗE[T CR>Ph}HCDQ}6ǜ嶭o!q&Wl3{RL}9@?G\ڢ?:g߉epxc"I݊BZnH崂nvJ27G.H*:07G.H*:0k(j;K*ef^Cf=EhOK.܅'u=);57'cHȢ)#t{*k 1UZDDY%reP?i۩o�ON9KSZ k1N{ _q%:1ARKJUָ,'Ӭu!?H-uwtr}"tr}"5X~�>hg<y-ۉOyVc~L=wR[L`L)*[nyU0|Z׳닰dD6MO^;;snWKBԮ;˙,mK+Yl!L0lkN.h;Q3V NAelDr%]\Tt`n\Tt`7>w5IC*oPQFм~赮Z`LJbg[%ZM&!&B2[;JTd9=w&VaIB~rCT Gc`G!1̻P؉2f\ߒVϳ[UMboo)IKdU+^d B"H"Ha[$ߞ$"ȈF TE9 lʊJ@l(?vk90I3L5rӞx'6eTr8IbK.�=dY%5ERˌ ;\AcE&Rܬ ^p`yʒ(rDjȫd8>dVf K*rR13%US[d4N-RIgYaye9rD>Qс9rD>QтYJY dŖ)0<3$`P#[20+dsm?ujM�S BY檫 LTM15SWbu⎅7z4 {;&lGzjb򬶖[m[m-m)J%tr}"tr}"�p;F0 '9$TdpĥAsaynRۊxl7}�\Tt`n\Tt`K98;$C$C98;$C$C98;$C$C98;$C$C98;$C$C98;$C$C98;$C$C98;$C$C98;$C$C98;$C$C98;$C$C98;$C$C98;$C$C98;$C$C98;$C$C98;$C$C98;$C$C98;$C$C98;$C$C98;$C$C98;$C9ܢn*]m >ӧ٦kwb;n7�"r2bqr2bw &kY7Gb)ޑGI2sr gBs]JB ieK(˭ :ư@ˑm4ZZȲ/ J$J%Js*[w;liȓ m@R3_qZ9ə^< %DKKؕUwO2ܳFĤ},HUZ8`~~FC h6 *W(ۤrt,/0!czxs+Ecj)MNmZPZTm lj1eږE0Iސ5bĭ$M HL8GoyN\d!,Y{ yomoho(BΝ�u}?Sf=󧦻tNBe7.YnQMCU}jI5ivl&]&f<EL쯍Jd\MvHmyʯ7R 0 ex곞EJX0b]iEszҟwζWjJ1)K?uhc3q/c-)s1jZ SH΍2kdDq}ȭ!D!r⨺1U"l!Or3XrG15@QYj4viYZ`*Ν |vdqC4s+qv!:oXw_T*.D7uPv`] ebƶuMA}.2T*k,>e1Q՛kdzl5l6 ,zVi^T;!ޙr:o=Bz*FTPYqgYmm&MRl6+a1JETz%OR%0(ĕm'~3mW؍ڢmU1tT)uMU뢲˴c -vX1eq2*]}c4*kVJ[K[Y|`}N �^v� �'˻UºdmHnW ?!!}{6U5QumQ(ЮrVemwC-FܙZUo.i6e].Co&z,A~#guGOb�p(B6+$-fP)pTlBQ)˺Y~BJM.݊JiQjSEom0ZK;FI?Y}-UTTy$�p�$SqHPt qHPt ÎePu7FIkh| 9#4H̢]!ċ깼ɬm_zfpԶ l-A2“#% $Jvjw2HZ-TSzH⥷qwIazn P4,ZJ Z`nk=VPYTk9pT|ļhm/T%hm/T%-3屗ȝJ�26]k[2q.cGu_k ],ȈY&!:wV!k:Ny钖rVY !26WEdhȤ74ѥvrF19ʰʰ �GCt`0Cwɤ^K:8ɤ^K:pY$-&fR؁EĜҔ'PQj}ĞYgZ VJo/4uYԫu`C+)!AAKkKjuQl!2:)H<hm/T%hm/T%7ϗߚ<hm/T%hm/T%7ϗߚ<hm/T%hm/T%7ϗߚ<hm/T%hm/T%7ϗߚ<hm/T%hm/T%7ϗߚ<hm/T%hm/T%7ϗߚ<hm/T%hm/T%7ϗߚ<hm/T%hm/T%7ϗߚ<hm/T%hm/T%7ϗߚ<hm/T%hm/T%7ϗߚ<hm/T%hm/T%7ϗߚ<hm/T%hm/T%7ϗߚ<hm/T%hm/T%7ϗߚ<hm/T%hm/T%7ϗߚ<hm/T%hm/T%7ϗߚ<hm/T%hm/T%7ϗߚ<hm/T%hm/T%7ϗߚ<hm/T%hm/T%7ϗߚ<hm/T%hm/T%7ϗߚ<hm/T%hm/T%7ϗߚ<hm/T%hm/T%7ϗߚ<hm/T%hm/T%7ϗߚ<hm/T%hm/T%7ϗߚ<hm/T%hm/T%7ϗߚ<hm/T%hm/T%7ϗߚ<hm/T%hm/T%7ϗߚ<hm/T%hm/T%7ϗߚ<hm/T%%P&q.SQMBElRV Ҫ˭+a&Mmno/4r)S^ )�hwB$�@._]B.0._]B8_'m1|1J"=3qrl\ŶۿВcK8KxgdpyQ=Y*˱Fz=cT"I-<Xҋ',զEw)j0"pn*u_XnZ*i`X"PRޡ|{ MH2 ȣ-3 "C0X%ꡌ,‹#94o|S+c0qe1 !K Nq^Ӳ)bx:J"J%sDkQQe)NHju2(x G/Tuz5]S+Z"{{̭lc(~Ӆ&YnIҢrD8q3=uWɝ�}<~nN5vQ}5jMc]ƿ%V%,iVulQ`ت�ZꃭӨzmt·WKҙvY?ٶQR̍i>&󴳗bXW7S&)MY"Be\PbC@" Q8v"ZB{;=o^J-{U?L0BSlnoEc#.Osrd+X5s o6FK^LO-ɝ"y#2 <Yd(r(R|!~a+t%#OR ^4:Qu gm%U4nOMvVЉAֱ߲XwzOտMhu[jnV˭)k-u+ {U{=|}li#j_{5v;+At;TYhlLj\T™7�C 2hӔ厊ZS&)Iڢ#Mst fO&>R"27x.Cu:A4BWI P$GFR^/3itmztk{ZvSmz +Dfg}iuZ>-4i3-w6}lKjݙEcy`�)>��"��"|_+�O܆D~j�0�Y?r $wov6Y4l�ˣ�p[ʱ;S(iD~`+[ DWUhoNL>)Lun1:qw ^-)Awљ¬^Q]q&V]=2nкFqDaw\IU1y?Lm>-jtkV)*`0*FANEꩳOz )JY[) R *t%SJ+,kUe.4qxq:$"Nב'ï^SC߇KUSc$D-jp5LU0q$ҥoq.r4Zd2)K)O~V>c=6bhR4+^=gq&?޼z'7}[`VIp*G�N~=#J{YpvQmfk9s̬FyaњR]?/fT*O#Z`[J/h;+^݉ЖDݭpUTAk4v.$>N>?/lSȈU-qK)I@V-IY|ع!p8% âW:I`8^=g}W +uKYJCVE ^CN)*jUAW?UZaei}kn"+) ;ܤZGFţUdjaBjۉ5aޔfBR Sy LͭA6V5iݯ6_1y?LcǬ~Xcgݏf%I$vuSZUR/JP*$Fvv ~$׏Y0I`frHNy NyI`8^=gD4כ@4כA/Ę�z<1y?LHNy NyI`8^=gD4כ@4כA/Ę�z<1y?LHNy NyI`8^=gD4כ@4כA/Ę�z<1y?LHNy NyI`8^=gD4כ@4כA/Ę�z<1y?LHNy NyI`8^=gD4כ@4כA/Ę�z<1y?LHNy NyI`8^=gD4כ@4כA/Ę�z<1y?LHNy NyI`8^=gD4כ@4כA/Ę�z<1y?LHNy NyI`8^=gD4כ@4כA/Ę�z<1y?LHNy NyI`8^=gD4כ@4כA/Ę�z<1y?LHNy NyI`8^=gD4כ@4כA/Ę�z<1y?LHNy NyI`8^=gD4כ@4כA/Ę�z<1y?LHNy NyI`8^=gD4כ@4כA/Ę�z<1y?LHNy NyI`8^=gD4כ@4כA/Ę�z<1y?LHNy 2vv-Oorf=kQLxOmA7l,*m(VqZRԯ=JK,li]I�n\L%X\an\L%X"qEʹa6LoK JnlxsJB8=HBV؝-t). ˤ#\hMlrFG$)WQݾ m9!2F>-V .֡%P̨fHFZOa7s|:U78 yFȃRLZjB+.* E)@ȝ#d-{7HlXTaՊ1+pedu`p:{ wjlFG "1 Dۈku-t^i7ǒ6[5UsD֓Nkvtj[kkRJjk~ EamvLTB8ʮ &9!j\0Wl\R@iuyt^C z}djWq j[\G/\i+QNͺg7-n*ގtkΡ, }*ҧUVXMjV+5q3&8D</k_Ga!aYs$ꤱvyZVY/s9 f\rR;b>o{tE!Ed@-G.{.tukƠHWHB:ܨn'1on.K뎄�]Jh=oUjQ+$mP6 uGҾi:ыqcUp 0R͓A[{ҿ?~*/cTm[4IQz-)%'J\ ^z*>T*N4n.P(bYr@m+8;O##>glTBJ*H*J%I��P��ݪa]G�@~6�B$PvWu-Z|�<R=o�x߫i8.z2LA'8բctM&IHU)srҮN:;hjndW li"bizvDFD$GW+6cutvIeZK)y~_P%Vک`mԌbeŶ Uh�fQWY'�3$MHACtz}`a4IJma<0!h TرȻk64J,@Rpcuc3dGZ&z,uT2VA`Hq${ZvR'`D񹃤18d ޖV+FѤpn 5UH$e@.Y[i6! d ]I]vI7[T#k6{_/?<O]”c7N vG&9 ,B|1[gIJdsd΍&(3[xו죂>bpř 琢DO`MQA1d|j� UEVG*ZƩRG[37+ [*H亖R9e A\` Qs˫2x71=�$��D��D��D��D��D��D��D��D��D��D��Dj{;={mJ] k wzfHĕKS.68<0m ԧ2J8-+Nq̍Z^ZAu]{G*yNX8)DqJQ(n/FbSvZY�l%_049m{ޕsN/w !8*1}~tYb�z;�c )՛[3 p\0ťqwBƵU㸝\ǩvr &I:7TqJxbG@j䮱Yj<5IwL3 ocX7Lհ7T=s>f3Bl ʭi_ ϬeyDS.mJ*ԋ=+l\nf�. ev X`X+ ۄ'.s_Q;pOl hSWy8dׂsx:E#%Ϟ-ͫ :773Yk-̔ՉXkԮWeI:zp| ˹7 !Ou$ݏ5YI%.7&RuZyudEtK2lĵ<nPtp]MvvXm0N(p*bI;ld#k/òJan$n͞~>ޘz:bn:ΙտvCԞQhTN+; Lި'n E0Sʥ /QiS\}OƐsl9l4~:VIsU$ktj_DkC *NJZj6rwڡ8J쵁 Zj 'a1\ms?J:4=X)Wy}#5/kMBB<5<䨬YX.liX$7Kyc*KW]T20#U2pp蝶YIʎ~\dzOpOR�X������������������������˷_ՈE˷B_Ո{a�������ݪa]G�@~6�B$PvTWQ�, Љ-+5gDZ,4bmٗgC[׭'.lMH#rd"JA4/-qNWi[,jB)yX,.l)reU x'OfTءHi&ac?^Q!KSjCÃLت2vd2E:&e<hdi &zMl7F]uH`%2-/Ǡ'd6#99$aR "˖DiPE4sqOg.+ߙڔA[N%`'1#iZXwtQ 8n HkQKq(S{<zYS:%3ʳ-CjQnx�t˙_!aX,Vwk!pzRfc*U)aXNlо4SڢϐΖeeMu 6rc-GI$~eyū2(Uo8ؕɐkchd4 8[`5\eg&Vqi*M`(خ8Sv)җ#k(%! {!nsm0h@u3MKc dO4 D1DQ"J򁍱6.Ԍ &ACIZ7&.v؃cK8f+e�h0ԋMۭJY:u<HX_[ˏ8Eb24m?gu3/cl sZ{gǯ0C r[Q6ю1ޜA%0Ll捝l3đY;ˣ˂4 H\nJ2IOe/,cz}G3Icc\ q|144Idw o(Kf ;JM9 }[6kZrMsi<MDdg EexiV:%@2_lR]yFrm3@-.M�ԓdpy;N`�yRՓ*^IEHnH%ZgxP3VaDD. i*r9yDBlc[,i+ijukQbOd2BJW(tg.DF,jjW<ޢ"cdMmfCkaszԻ>YP#Ub~Ʋ6$W^s(䉙:@'G22&Llh6=Z̮ &<}3l$[bf}19`Xtф;P41q>g8܏0vcRhdDˋI$jZަ#tyK=VPPŠYʫ2{+*oeoՃR3f&+`I[\W[ y aS�%Zю'6HCw<cTĶv7C M5q6:.lҸ/&< *K|,&V%%Vҧ7-㹳#-O#!NRْa\G<yO q|q96 Oud|e���D��D��D��D��D��D��D��D24+Λ-{dh /gZa}o6k^=4$TAeSlEԓc|TiE %f%<sT\~*p&0`Gp@T]bۋLj#*alV> R2" Q%" CJq lAEM Z !lRjzښbRYٯ[ɓc2[#ּ(ǧ $Ѩm#1O6W.R(Hv #CВL XWpqY!}Mklp7U*9EF3 'L@* Cme' _N5HN&\y6_yڮ_3r~^|ܶ3C$R$of-KMXLƼNDZi!bSFh,%^J|#`r̫]UUYz$fSV/E}chw4lAw.qe?Dr. P^CAB qqe߰\9W:llF(1ld˯gy}j:y,>zg9Bl-{C4zG\$2[!]Sq 8ol|;Xn.֎#u¨z !-_rxœN,Q d]%jI- E/kZr8Qin2d[J[L #[s8(dP_40&T74lq|&us\ҤSg>>gYD4@_r:jceOnŗnȟ1t^Lm/҄bXٜGL΁e]VX2`�t|ݏڙK~4^tsfEm|TwbElbsglCnCsz脜ƲUV쥵_#Bc[yn9kb2M0Ն$zXH&g +jk8L<*8I08fNF=&xup'f&f#/zʼn1)IBJbIK/X3hyvgZr8T^ǭv{5 (š59IUۙY<U�c4Mn#[5ؽ{rb˗8!_q^Hcmv@RR[Jjh~BIˁ5y'q $/ 3D=3Q.yxOTJTәkK0DزMNLH̦C,mEW{"V,˛x{#dQs28`Hl@96N�rk:M1mĆ51bĝ0ܶ[xCj8¹j@\(^�νJ3c<?|¹�FNzY; 'LfҨlzQ5.UAZ(_^;�׎Hq̶�{{_ZㅭG?6 \B(qxɜ)xL~R9W3C.K#qUMrU:cLQ9 u0D\[U WHl:)=nOޡt�clIr%D\$6mgܦd�g�]M:kώ9J _6QDM|1rMɉ;Pz+jMMBDܖ�A�A$��,�����������"37-:umajU'[JݽUv-RmiKvv-)((G ="lN�DG ="l8BH[ BH[.4~У._H>.4~У._Ë(8(G ="lN�DG ="l8BH[ BH[.4~У._H>.4~У\\?d,* .K,iaem---RmR[JlR)"Pycԍ*cLcnr彛 D#6."Zc6{4V68ڸlUj(mVyfReiN]* ɾtc{Űry6UuVBcnU(:^U/c?Sz#Vqy9(6!%02[cqTy*xLLv'0Qo&)s6C{aә5z+~'˺G\L>@UVi'QND۬N{Ye76i.H*T5JMca x_7|<i ןpٷ,e=/x[LUܗ;Tj<ab4ʟ3 f:rR%Y*o4%dg[})2!R6&FӶ}Q)BCa(QI}U#HL{ʇKULQr']}̡/F,@)N46551:qkʞ-dțW4eK Ln )%$O&zDεsG0Y:n;c<,r\kYnrsgZd|Qv;*Ze mRTnZ{iӃ?w9 � #ӟ[VrW>A%#!.\fFJG'o*Nf<!-Q4B[rM!JZ<;Xj<FBJ煱3l^WN4Sڔ2T3\Ca\syK\Dmk\mcCLsw 1k+Ƨ$ԄgW)k հ&4\2cXi9S> <,Z`b2FkKI;T,S\QoqF!2H凣H\+aQSJXPC8;l;d�$g@`PI$)Qb`daYj; b ]/X'@"r]lG IbviVȚl!*Re8ֻl/"d8C x'xɸ\e{`1G3.M*hܮ&S'SRq9W180//7m+оx) Lx23Ǥlӝo3sJwlw5,a8\BM&#Sd'dxMT[ 0U7> i wŞm)SYw2'*C#Y rC2Ӗ!c<zT7pA& aU�2,͋pn"z7%Զy^ivWrj5Gm^"Taˤ8s"x@bc{ c=,Ph.9j:,|hvh̏sR^M$K Mb3`TU+<Z[5roՍ|$qnrg\ҭ(K[f3uJ+(.}PC;?jssUy=4o;o|ܛ2-c'ZGɓ)nrC'׵/z+BwX>Tj% XX֎1UB6Wi)jɂ1pr1ՃJgث+b9a<%gj0,yuV'h3꦳]EȕK +9ԅ1bX[@^Aq63H@Ǣǡe#]dM#krVXѝ:DFAiH2UwcJ*ca.Ifa.G\Y" c-Ei 1e8|_dv9\3n&ꌷ)(WZh`ɊǷGggFȊcl`9KHKN8?Jcz/w)�1b!cmUj⬫n8�0Sˀ`bk,[1 ;]#d /p統t%RW h|`vG ]c%-9*?\xnYAÞw&y}ircOH"a e6"B_*ؼ7)LTR)2ȴC1+ceVcQ[#G AD'#b(f�fv�f01{^3<ij|)+jn#|b/J#aci'^YrMWVǧI,U_]Dc۱2y{`&5w4(rSu5;#[52j^ڋ\<_DK=xkVp@u>eW vH w�uX #^H1Y< G1@ȹn0/tqiu,Z95p#n%ܬKdrָx)7<u[E+&H%,ũ#IF19R%'<yVS))rvX+?x6jw0(<,�gay$y$cG@\N/sq1>|7;eLi1SM'QU#lk8nꋻLYxbUI'0ZQ1oCqm|b;Ob[cmҝ?˯cYvBr,oO!|MH8 VtP=N1\H!A'i`]va[9=�'i`,Bɫ6:NPĶ{"D \jm1'5$=*ylQhlK%Ä!qhIMS,:vJQiQ,F7)Nf~zȊƹv@C8qKW X*|6H=DP P 12�FN>[;%VT9<v($ŮDr;wDiL91|Gb]sZw+3r|͸׋O*# M18< s/dc\f~uǮ0t~|].Ie Aii ׭Pr_Ux{ XX7 9+>j;|'d:�:K ʙ ERY vb PlA镭# , "3,ӥ8-dW(ZH)n.$Y+V.q/jŮM*my !Tf>[R8ֱN>fbgiHpyQ MC9|p1<O8eBr0fXH$zydEKtj8b9;4(H/GkXb'RTD=uK f"5aogrxҟͷ6o"CVaҜZ�oG5oll"1"X5d lR{v9`8! $�sVv8s< � eTeM ,aaULlQUvV_?�O#ȗ)*$l/<܍ DŽz{\X_P*kxnBNyt1K *mvgS< PSTL$6oi 􁥡*œ]/R2$A)0OqyY>"Sx܆j瑲X׶$㊕D*mWiIWU*XTFusl5vJbg7+8H_ -1܆vY| ѹ٢Y *h1ȱv;VHQA`rBPO8jv8 <)'BqwUFK�{+cø1xf9D$,-YUiFȠ4 -uOnC@<1M HF]0Ǧm76iǖ!LSL>B{j桍>)|zPĖxt5jSpWqؠc˱8Ssf|Ge/$fKT/]#\rj~O'j`p͍IRxj1#ɧ+p=C#ME+{`MqK؜H(>O%mNY Sb@`k倬69]ʯp6Y"#jFp?jbgzGiM*#%Bi %32bGbX ERobxfM([CNju+o'ud~t*8evvl-.7,i.\''|Yꔣ}JNuO;͛3DH`$] y, y2 XEŰ;aiE/H]b `'^,Ԃl7 @%l#Rgڧ,Ŭg[fe.L"u-1yjw;mo%njH$C)_*@lR\rr�K.H fDny!A!5 E\_t!KNEU5#k̫sCzdC4OV^`i8O&;&uLbCefKkFDkLɘ Th(!:fwI6*l@|K-t6Q09K(͙bRY |q/CkMdL8Ș?=X%ȭ&\<5BFkQp%^eBS-.B;89p8,v*LVaOqCU G T^tK|}<ҚblUM34?Ek2MS:''jLmc;¹DJ2 pﭬ-h^WXk)r\lϾ\,jNK397a;qjA-•+%n4!xfqrk] *9Lޱ=scLPHխmf>+IG- leQ)6~l$sm "U{00% {e^sGl_V>cf 8tp|T 3ET^71"@W3C &kM Rqҗ X :#SQWDp pX]#0 bӿDesHYv%D�bWTd[_A|S(+�D� ,��D��D��D��D��D��D��D��D��D��D��D��D��D��D��D��D��D��D��D��D|G$ӣRVSDh]^IgJ/!AD$R<,e.*U&*F=GYԨ:ڎ-jzԞܘ 7wě-k}ŷSe%ZU"))qW$ۭؤ,N2qqѩ>08xρ|GWgţ*L<3Sa)4y2^m"Ze]um裞CSbR%3zK%)zÔV .lVBgSm(y*Pi\a]u;oF;oF0A}x>ϼH3#PjuPwG ,>8n y]9k#: 8dykqf95eTKRVV5lKxISrEYw+g$[ԃ &^Q(˭Km!.3z5'!.3z5'��9?'ȌPڵtfn֜BǖܚˎTrVժ8PmoK(d%F[W0F`ꪥs2t:+cqˏP%mllmFU o\Z!8qѩ>8qѩ>68A +jCtm19>5[x4Ĝ \vLC$-UY-ilq֫]Kn#!) lF榆cQuKFvJloLZU)5+Sq!.3z5'!.3z5'   {F�׉-׊$9p+n�KI(Q:H=mWnV M ̆LnA o?D.Vf+q,]<M^i/GR7!.3z5'!.3z5' dx>�3e=??T`a+"a0gISģ$Hak%եJY:ƚITy^rd2NUr#+d9\}AtmISԻԝݘrTDΔP@xԟt@xԟtF118==>gy|QIiN"scRhԇߏ~uBr%J__V,ZrՊO6>)Tk mLkv L[Bs\ Orjx$fү6!s(m)]:/!.3z5'!.3z5' ||9 �O&?~Y$&\Q$LiS'LnĤY)ˮm m*L뮺Vp'MJ셁91RcDQ?$g$VؕM%:+H%ȣL-m}R.;%nQ:�j"+%1TЂXR.lBέ7Co0L ??~_~e�?nV|V7zuu[{]ұN*nKS({-*-iZQH|]3֭LvUlVȑSVrVe4رR̵*|?)0>Y$_VVUHD SWĨPڑ(m'CywPƦWyk4F8]*{#brKՎ!BS v^|QZ3}(8P1�~�>cT 9vI/EȒrHָ’Д*Lڊ'GDБ"}/䥀zlQnlsLˋ=$isVpPUFfq~@/眒Ny?kfEN4 ~-z6RH[ePV"U̯ fv=c:I*;n=KB3ZE#X[ YDTR] ()aѶ˵K-*�x�'9Ĉ>1x,>I :Tf#wS',I%Yv[eH[q&DBSGÓdiȈh*EEKI)c.�Kx@09�БOɏc },,,--,[eJRm-R)JR�,`5ZB䩖iUZB PUP%j%4,oZ:ħRQ*N(W -)Kq!XL-j FJڝ[ZˏmRM,9Pu&99?Hu�mJ¢UzMJٶ+3xZo-kZi½�ulVZr™E?34izT3BX9){UpaVrV3kNUm�R c|{0 br' ϓ)18THHSKlqKY#} RKL}nr Se)4s*"T46 LqNjוU$ZȳmjM6K�0>6�.<G|m<6 Ź,Z8١" N qlB}\7--Q$^,NҊR}uZ7E*\TyJ2֒CJq%{SK1=׫-me67#>"LQS01gd��JQ,(d٭>Ҝ&IIaYPQG֚ZqEB(avItllǫR؁JPT8:;ݾ Qv{ztv^e�0�SI$0><c�?�0$[+4q34} S2m-8jT(%1O2m/8 f������������������������������������������-ԗatAIˈzg'B � � � � � � �$?�h@�܇+ ������������������������������������������������������������������-ԗatAIˈzg'B � � � � � � �$?�h@�܇+ ������������������������������������������������������������������-ԗatAIˈzg'B � � � � � � �$?�h@�܇+ ������������������������������������������������������������������-ԗatAIˈzg'B � � � � � � �$?�h@�܇+ ������������������������������������������������������������������-ԗatAIˈzg'B � � � � � � �SnR+:'f) ךܽSQ)ֵW2Ǧ)-:,zerGsu\IZq.CD{�?_4 \anq�CB���������������������������������:{S{ 9h rJjGSNSm^u,9H>]E2 0�<caUH)2VXKҵaGUjq#Co 4DR{lzYyB7j^Y[Knk>2\d ]YLcM5Qҩ[b{Z}*UmB?&Y?e1h*;L�>k77oP"\A.r3cލYJ:'&,R,4.*e18Y?pgl>0x꫏\�DY?e1W�(~x꫏�gl>0Je18Y?pgl>80G-`YRc]mJ-j5>ڔTRYuId[kˍf>c n[bnx\y)*5QҤR *m)k} X\yﰒ`�������������������������������������������������������������������jfj.ļjb͟#ݑX"Բܭ)Q7i^ܖ,R 2Jh;$͏6.Dz<.Lܗ‘˨\V7E^N\%9 sGy!֩*}+r8jm]fcQ,R #He9 H4g]# A f i-/hXY i14Nn - X1TcIyAҴ3;beL8B&{+lCWUteG+l" 4\m<44ٺym[4uh&? &1f'tnɤnעגn'55M&]a'K,MIR ͂@*<3+ǔjP=„P/fv[bN}D{g��@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�EuGt˥nj2OX_c+me#'iq*E&j$+]%MfkS(2.nP@�ddFTFsIJؽRk,D_uQ<�cbcMnítLsP^KӸ`9%)yJm)ͭzTD&hӔ\OGx*%jr:F<r{uߜq{=?/e|TUG.dgp9<G xgpۿ><c&k�3 JƳύaK)-'fHO1S jrv, "-׎ h=TE1u%;S (śzFs)HV5bĄܾr1g#,~ar<)8#>GAfYG`9x[/xMcكI兆R|^U&4_S#6[FvJ/G GG#u~y@AA3n >ApD���@�@�@�@�@�@ #T"E*&$N2t5c$Y3VO#&9m;kDRo@uH#5v4 {Kr +密^c*(̑Zͺ%&y)} pAV C{^ޯ>S=<1B$ ar&L�ŵ:;^RQ5W$)B'ki ^EX^Nk_ &®RT5Aqm^s9 ^Ԏd*EW4L=J¤muOSLp.}N]Mǿ{ߺq21#s29񌲌qg|?p} `� � � � � � � � � � � � � � � � � � � � � � � � � � � �'͚lҝc>-^fS:OZd[;+[sM".%A$8eY<R-%$% {!-(Jo,wֺҧn#)ڝO2msٻkRhUktJqz"߆ G(w)RARA2Tʒ hfSb<x8uV ÐÕMri,Q/nSĩw%Lb+֤njrI&)\#LMV1xI1!jj^iWEY-Cap#RɆ*l#~+Jd+{l|H^m|HTm%CA9!?x[$0UJ  zT�qITX -ٶ[%K'^e-Qg bc,*~{Jw& \9de MVW-ᇔWv7^E$Rnm-e6jfx? B9odž(md#9˸=xoaxob*,-8ϩ_?S2Tg`q3K'?"~f!ƙpUfHS+qtyO|eZr`)f6T]<YNXҮuzCC%|wzY^6>y[n^6>y[%N3p73� �  1O '$ˀ^6>y[n^6>y[ؒˀ^6>y[n^6>y[D�-cE cE K^6>y[n^6>y[D�-cE cE K^6>y[n^6>y[Dv{?ɱ�ci_P׍i6׍i60z{ԮfG_6z^)"S;IY*B(ՕzE0JaTf/7Ĥ5ueK' M#cŕz?ԿӤR6 =e!,E MCORלE#K v4ٍRdzpv<6_<-l7<-ld(U ZP6UUdEP0F# Eb]?e%%]͎ra8z-.MMNOYsGi~xeKKʞwv]2'iHKEF{:X0NĹf.en "}.,DehM, Ȯ"(duGsRLBO+=xoa=xob 8* p�Tj�8kf@��)03XaŜXŏY;r͖9,�o<-l7<-lYeo<-l7<-l"\��pz"߆pz"߆%o<-l7<-l"\��pz"߆pz"߆%o<-l7_<-l"\��pz"߆qz"߆%o_<-l7<-l"\��qz"߆pz"߆%o_<-l7<-l"\��pz"߆pz"߆%o<-l7<-l"\��pz"߆pz"߆%o<-l7<-l"\��pz"߆pz"߆%o<-l7<-l"\��pz"߆pz"߆%o<-l7<-l"\� =xobc]EnJ̩6⌲ͥܭje+JJUlZn]M�D��D��D��D��D��D��D��D��D��Dv���wTÖi3FsL6m]$Ǔ<de&Z##xzIdL?Ų!eGdnֻbbZW=+1+{xf:C<Ё}-Kje6Ei,P}lsk&R䪏(ckzf[,um.� ibj(IVZ_Or[O}]-Z>ъzWR� C}ٮ;m[8K:y+.K]X<9c튘c/y;+'VHSsCs1Xɩ%d<t˒TcIT!i+j_+wfR3W,_" e ΫIG%5sMd?2q^65q`:>6UePk!\a/[Q4MK J)JSBeVb9]e*k5-<ƆEYZKʚU랥y5ޱ2Qծb e)!W_W}`Ril;HV=3Lj;/ݧa2s <\ՎDRe-:";ff)DTfkrlQb%M]<'4>%jtmmHpMz5ħrHRJ\͓,JkiVk+jXtۅcRVt̡T>ZJw35 k)umAc3Z ijoME[ouk]ֵ5{uv;uu_Nj>νj!7j^0TTܵe֕6EitRn:[m.1YkQVm}_`H [K۹m}H [K۹m}H [K۹m}H [K۹m}H [K۹m}H [K۹m}HZi^Mvاl7vsk &+1,:6=cZ[yHIj$'oK$NuI xēe1)B+hv|~i35IBt幡 'YiDsd,w5$Bc.HORʭmm}/ ZYS߼w1*w ؊FV~0i{w6bii{w6_ͯ"ii{w6_ͯ"ii{w6_ͯ"ii{w6_ͯ"ii{w6_ͯ"i}CYŞ82?H4b;AbMdtvNFSTԐy [0X[K;*6sk[ے zUNܬkBrBTʜRU69wR[И}^=Ktz]m~351wc`m aEv6H.FUiZj@kBe al+x!/,zeFk[AOMepXuɕD*Up5}hW=\5Vih5ڹ7dH5M+s™kCF 񅾪w#Mv)u!jkx{6ѾVugK]*ڃzNMԷ % s/!9)I%7LjdȊ:u *$K(-mKy^Oc9jQԋu P,+Cb7ܯowJ֕5j>GW\l >ŷh+,'�,-9U7q}U"F02EαצSNNs)%2")TKէɯ=I`3Jyd|# VJc5#+{fy3\>Q%Ũ7\Psb.)5L5ہ\QdyXrѶrGmHU6b/Ǔ:[}]u+4Ni\廂\ۗ%[z\RjQ)N)HPEەRیk�M8ރ~ѩ6uRT:؆jΙa5bo>}rr_@MөҾ׶@T@'t& fcZ)S(ҷV8-65%l.&uKw?dD4Ʋv7-!ڍmXB#D|lTD3bṚn雱TNjгQKsj*BީTi;"yˈimMVܑΟ~K2BYE[,UaeSi= Gp)h.%HmeHwFƲYn'IE+>@2JM4 ~]ϫzUmW^Ogj6K#j CǦ}bIPZYF*ЮK_KYpwޕ aißdi}aQÚ$&\p?OI]mlFЍ̤ka,H.ӍHq1e8kq-M^yh_{C Jcku̥-X[J֩[VeCͥ[K۹5.Aekҭڵ.b\`k4T]:H{Y-]UWMuVeB;Pn,ci{w6ҝi{w6i{w6i{w6i{w6i{w6i{w6i{w6N57�YOZ]]+B٥i'Jӵm)I0����������%#]BuJĤ)[}޶nߴKv]֛;;Z㵯aCj٧'Xu*x&#=>lЉ$d39[zDh/pЯ.+rQtORt[бEd[pff!+`*j`Ysun/L5CE�^FEVlS5ڀ.66c~n C_�wۦk|Cwe:)e!H3(4Z%%/cqJ!¦d*(ӋŤCJYP s9g?0r`bF|9G'PZw SF;sb;MUbV?kt6tuZ{Z[]zVjޚ۶BeK+cҾN3hV֋uTU ?Xiژ 3Pk-Gvvxhv?qn;_E4ßA!x/qn;_E4q�2-�eZ@!x/qn;_E4q�2-�eZ@!x/qn;_E4q�2-�eZ@!x/qn;_E4q�2-\p/v{?vu>>nO?+M�Cqr9aeև�#q�~*!{+H>tr\up6d9R!Z}2iPaG2{xeդ)Jv=j"> }JǑ C}ٰ~$g88ܤ Ÿ}q�2- Y Ÿ}q�2- [h~8/� Ÿ}q�2- [h~8/� Ÿ}q�2- [h~|wM-kbʉzA$>3F15w7mN\ o 4֒YU!kj 2&v_AQmNF3ZtXeB*ʮFΟPնEծQzPP}̨֣<aB. "d#;�-H|+\ֻaev�HkScglv^/.y폶pb9 ?iq}\*FDMjȞ0C<4lTO-+Ւ k #i 35<%L˔`7 W$ɬG'(^N|cnr.JB+dL5C}~F4_[jsPLjt]5O^E:$ ftu@{!ۦ&}oJc߉gԆiv/>Q3S.&U6 6S,,ی/q[auu)K([ZԻ:kTvץ8ѕOp[Zc9ۼm=:L"xZקg=yݽ-.Y9%$q/G6V$r"N d մt['f3l1a\ޭ4 ӯ΃Wz tAuO[eoKТVeC|飼G\:#M^2-zK-apʿpWzEr;_/�?`WŸ_EJݞw G35I`2 #-8IrRSqMw2.1j[U2HAS0mLْq#evNaXz`DIcL{oq[:.N7b'j&iNGym54H[Tq1v(VH{)aѾZEhn鱆=CpYbMZs^F֖aYki{EFK'(s#qҟ^ׂ�>>7 /ǿ]CI5,H&"$K E-N!h!lm[R7Mqz./*/y>fAY]VZ+Ztmc6U]VSlVtb}O֝~5GM{5 *U(1 [h~8/ӝ Ÿ}q�2- [h~8/� Ÿ}q�2- [h~8/� Ÿ}q�2- [h~8/� Ÿ}q�2- [h~s Bˋ@""oyiإ{&-)nڴv)JlR�zN|9c?G] χ>g�9Ռt'>#ßV3xuМs~�}XBsϫ<�":N|9c?G] χ>g�9Ռt'>#ßV3xuМs~�}XBsϫ<�":N|9c?G] χ>g�9Ռs>d?:N|9c?G\χ>g�}XBsϫ<�":N|9c?G] χ>g�9Ռt'>#ßV3xuМs~�}XBsϫ<�":N|9c?G] χ>g�9Ռt'>#ßV3xuМs~�}X>sϫ<�"|9٧�-ų_>sϫ<�":N|9c?G] χ>g�9Ռt'>#ßV3xuМs~�}XBsϫ<�":N|9c?G] χ>g�9Ռt'>#ßV3xuϜs~�+=~ßV3x�HG] χ>gL666P-wFZye\eYun]awml-Vod,9Ռs>Oq'κ>*�}9Ռ�<G] χ>g9Ռ�] χ>g9Ռ�t'>îßV3x�DuМs~}XBsϫ<:N|9c?GG] χ>g9Ռ�t'>îßV3x�DuМs~}XBsϫ<:N|9c?GG] χ>g�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������flask-peewee-3.0.6/docs/fp-app.jpg������������������������������������������������������������������0000664�0000000�0000000�00000167141�14605757052�0016732�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000�������������������������������������������������������������������������������������������������������������������������������������������������������������������������JFIF��H�H���Created with GIMP�C��C�T"�������������   �`���  �� v!678STV"1#2A 4Qa$%Bq&3RWt59DHUbr������������ �>���!1"#AQa$2q%34BC DR� ��?�˛�1YO8~z}g``'I#~՚ ͪ! e진O9E ۘaqhzUXc+_"W0Wȿ{sX2/l^~E|1_ň�c+_"W0Wȿ{sX2/l^~E|1_ň�c+_"W0Wȿ{sX2/l^~E|1_ň�c+_"W0Wȿ{sX2/l^~E|1_ň�c+_"W0Wȿ{sX2/l^~E|1_ň�c+_"W0Wȿ{sX2/l^~E|1_ň�c+_"W0Wȿ{sX2/l^~E|1_ň�c+_"W0Wȿ{sX2/l^~E|1_ň�c+_"W0Wȿ{sX2/l^~E|1_ň�c+_"W0Wȿ{sX2/l^~E|1_ň�c+_"W0Wȿ{sX2/l^~E|1_ň�c+_"W0Wȿ{sX2/l^~E|1_ň�c+_"W0Wȿ{sX2/l^~E|1_ň�c+_"W0Wȿ{sX2/l^~E|1_ň�c+_"W0Wȿ{sX2/l^~E|1_ň�c+_"W0Wȿ{sX2/l^~E|1_ň�c+_"W0Wȿ{sX2/l^~E|1_ň�c+_"W0Wȿ{sX2/l^~LuXwXD+wG]ו:A2pN˄S{}S)[) Hm?†2rR2$߽\Α".bX"ETu> `1lcCѿ}bwȀ f;qhzUXWG+׺SP^[QОfQu[m`m őy{I[`B6|BQ@E3li.Ճ(Uy3+WKCXT4=9|YJ!yjGE^dbu`7]OAýڝfh`֏V1[X'0PB2ݚ> ;[Wѵ :kíx( 4;+0((ΑS'-y=Aĺ[bL@q/b%1U R̮1Jۋ&X fMpIJ'M;yqr*$Ռ281qu9ל�0 } ;2F=46t`Qe=f5!a a$Hzmv=}*hLM]GWh1x5rK>#���1� `�����1� `�����1� `�����1� `�����1� `�����1� `�����1� `�����1� `���3?wf Hm?†3]o)X FR߻"�1ţVAb_-X^  f'LCY,D}XtvPFZu`|Bawij]fF,R{u�)w�57ˆ]ӥlٹYw"( xɔUe1SI21s.3gX⿥^Xz5G e#uS$sb(ēPn5[,zL?Pk5f*akR @Dq]KbYfD#=9)2=g;$Rw4BVao<" x* ^ݶTJ7t.1L)}#9ÎH1ֹGz~r;9Y#,RLYKT6_*WT}N]R'mjb>r1rJ)>pCaN b8^Mh<m+!a{6FeK*9Rb3hKcRd*-f})5r|c&=?}l'{]L1 r5Kn* j 3�K~*z/kK{Ebť!�0�<)mWpHWݰd|lEezJv5)b( ?S$dIjbs=*r=!z1V--AFۚ]v#eY*;AxJt$K/&j*B>rL(^=dx_T+--vPȭU3=eVN\eP;E향vuL0^~T=~p#\U9Ku &}? N$ 6VSHݲa&VIVVW$9^0D&K'馧/%hj>ͷ.[`aw_Vq"-_,_'ݮPߦǏXzS^'k>bRT]ۧ]|�Co76jҙ}m0ZTV 7ni+7W sIOT˘b2Vo .K>N' -FұhI99J#%-aޑwe\ =cVÛT51ݞ?WQ:Hc*zF(&0#&*tS5[0gNs_R疹Pǃg' -4wZA9U<9'f \4ܐ VUQ':թl kɫOevggrNi6,n5V'n۬Oa=h^:˔!LmkD\]!{b/d"vUZ}N֖k%*gtWh|y97>XGmHIKuKf[tFR1uB&nYM"eͺ~W / z$棼߷.k_{ˋ4Bp޼]87,RUiH˜.[ 5M+j{p=Ul^G1)02P͛<¦ˬCWXѨ7v8i!oSveYk27^,bn;e]˷<cW4џ4m=FU6auwXo׬m]rt#N\l<i^AX9++уGIN\HUČ3Xf6b1WF`(vIYrKm\ ^z*9iy4Bf#(MW HdK%+ /IGg^PUZqGON/%z3o&'#fMxz W.Yhjs?pr"A/v/bg"eUiTØRbW/.׻SyUʇm iⴥqmZѫr6PJWmyM-Λf~RS9im5NJSebN:˚FCfC?dw "y)SQGzJln$ߌqrn9kTfmYا9EH0REwEo |kf21v9t=F\xde; )!򪄈a"DO@rw]*F^�gz>1O#$ \m,VWHLڧ1*ﱓU뢖ǀVdUzYRQXY{T4+Z;`Iďpe%ro5~•/[tDt-�싊|͛,h Q3 e`Ʒ2J)zDck_7f2{UmZe:dJ<3n+x˖ Bz!$Wm!!"Фg%2"97{^?yvXLl ##kW*3L;K&TcnNqWn.aS{#n2Zs;65bW[tRC<-1$?"0͊3t]9pT6z|A=Í_jYGï7q^snW,^|6 eAZOaYݴl:lkhLկW[V,_,Q0wZ{"֞Gsn/Awer?i6b63q!(dUUYX[GڼxI E -~Q9'Uk ^ސE⮙Y nRv (yF4s2mc#Y0^k-J5NX7ǗoĞIδF21.ʹlS 7NS}# E[݁jOZqZ'|XjU}{HD I6K5f'9S/Mba伽oz~.MqKP*L,YSj[\V:E:Q>KksZI.flΛSJKgcFL ,PHq6zCα1j13T7˟(Lូ>\#DuQ̜8r5\îdZ-±9`Qٜ͖U =-d�yAݣ0#_@olt(Gc:w}PUkYiWI1dd˩xg��"ˌ��c���0���c���0���c���0���c���0���c���0���c���0�g$6D!Aۿ~' fߊR>;d@#vD�c1WG+׺w꿜Z>^d {ٚ*fy~ibXgO#Q~QSpU2G2MVF`h��oDs뮻~U;E2HK19Os1S}:oMq/G ЖiL6̔L.qN[}2- pBf# "#1){ D~S_ 5kAj *]%I.LQ7Rc`*fnIXyxȝHL]AV9Y3.f�߹}u}͗:i#$liH̰LDD|Dei뫨Pt S-CRE!DE#]mW]csk rrOVn]!=%ݬldەETT>sxf keAri[#uZد:Ym5jggexUMC1fc9lI~Os?T?*XՖ[:gd~Ϲr#&'$%"2Q=#ǵpn]ꍦ\]S H{ϤtvvKn�Wߺ,Пqjl}=ezgc),;\PbÓc^P9pR)qoDSpxO> 67vj뵵3#U@>٘f"f>#<57༫W%)XTL;&b'DI׺?$yK]rkvQjLsԵ q+%5ng. \˓gTQu>rl{_楽2Mvva)d|/{6O Մ 2ɩT;f@uqOs?T?6gދgv, &RQ3]=g<7*ēfivBW3+s301񚉪xY %7fK ɾknA#eDѓ/ ]$ "&s̯J֡sIsm++vG\HɆ+SUvn5v5gcQz"AHj]bI.|'~"~8loC};JYhli"uٴ@=&?1Lk<{>=Z:jXύ)z@mU&dwY�viAp܏gF푻2Bk "G LHJl&aCo3 $Wr Enbr5fȦv|=EDM$QI>)4I2B!pR0%�߹}}(E֘M:6GP`V (�]2eq ~1:V wZnJalbkh;{e(Xi&ֻW3Om컝I%lrˆ$E }<nqA"rl&pcu˄ʹ"MmŮ\*U1BA ݑܢ̸GO<<Y˞'{1}�߹m<rU"YQQSG_5`y҈1ŴcrvQ~zލ.LM枣g|fGowcG2:ǣo֜,R-e,KJUSH\G˵X`dxv׺:IYMvudnk>ៜ%l1%>ff1SlJ\R?T?OsKMfSM*{WG^�7V}zwز\L۶&YL S5r3=l+QP1fdocXyaJ MԲdL $dLs, #��߹}9)ffg@Y11b"#"#30"#f bHGH""E2S?3333��"~8<'~H�#��߹} d?}�߹H�#��߹} d?}�߹H�#��߹} d?}�߹H�#��߹} d?}�߹H�#��߹} d?}�߹H�#��߹} d?}�߹H�#��߹} d?}�߹H�#��߹} d?}�߹H�#��߹} d?}�߹H�#��߹} d?}�߹H�#��߹} d?}�߹H�#��߹} d?}�߹H xQ+EE@Ivns19V1$6C7┏N~)Hݑ�wU ]WuY3�IWg=*�� C����1� `�����1� `�����1� `�����1� `�����1� `�����1� `�����1� `�����1�,�ɑYtzv?XŲR{p0614}iZ5n]R0b涳עPELVf8b%k0djEدɪ2/XoEt&0Wr&^q5mehŒ u6dz]W^65n2xY Q0'[Iڴ)N/k7JlZ{ֹFrM D38Uck yr _KOlWF6<u g0iX{M@ՊՒRms,Q!H+<m=f[faaX8U(Y+44MvFi:ٓ;t#9/gç8|ިm r2E!*&-&2rWIDSVro vn0m.e$'Oa<ugbsK:wqېuGU=TiPqgwKTdL:c-^]2@ݱQ3>gXYB[7۱Xjݛ#iب sȭAׯpk>+׵e E'+vmy"w({B^Vjk ؍Te;ź >=軺źT)|q:Ef\ULy[kz&E&q"v4˥$;=\/yZYc)ye�6Y a]5%Lx3(:m# xѳؚ7yr4DnhIu/R6X1,FHMͮĒ*S)h6[2?a5dDlk[]x7JeUB2b*_g vgFTٓ])ǩS"e("̬.S[jFuȆ+e'- !{(VQ!B¯cC5RZW'uw킈i#]^vR2&Vӷb{ZƴNmEuYuCm҇f!5 Ri710o̕o?gnM0{'wXX5Տ.7Yۚ\7S[_ao+mq/\$ȾD$YƙtZz|!Ġ_47ɋ&Msjnea*֣ ®ʓDO#g5V.ni6В_ZmV)bY]%!,UxO1RщZZԬ4/˕0TRT00tAXU |uՁ'^Tfj+ nܹoLVlA@׆Wђ��hq<(%�?# xQϳߊR>;d@#vD�c1WG+׺w꿜Z>^d �0���c���0���c���0���c���0���c���0���c���0���c���0���c���0���c���0���c xQ3g$6C7┏N~)Hݑ�wU ]WuY2:kMD[#Vm}ɭҦD&% ĺ$^geZNI7&kYg ݚm^@lǮzq]qjnUu4Um73\3q:f.6xwB>÷fЅB\cbPƒl*&պp4i*&6 bS:JڹߨbhdeՖA˶M,U'Bk)]Zuj|bAM/bԩ۟ 9oaIU*vV ! hg n^U=S=.WY{ף^;Bl*fA 9kdP2㻍E4:v[-{ >,бGl7oبXTA*]wCvuKgs#]Sl IK!&քHpr'S^]g[>\ IKǦѺ%)6jDȘ*_,ffƛ(6G.Z6:jwJ^iyU.f{vC}}to;bɓifF6蒰n1NU95MKfKϦKw}QN8 s랕hz[GS,eJ[! à% 1&TyX:dw9 zMcP5w\d62a7 \Ne֝[c:xEa ~}/oi 77zSGVq\ b䗮26 5YK9ein~i{_Ƌu î_FK&Jv+-"&\LF9<>b˴b߳|fY֝0¯)a!t˷ʋ(vr 94>b`Փx$ȴ;Y&ݵS\;cUnhj.YG _ž\W2Z".eVQ4(-F(BJ7H~Gm]Qc5uJ~ћyfVn3YYuJEm5Fx򯼚*UFѤ+j볓_E{ Sl\mt[�ݥvlJHbK6vO\6hi9'sؚQ4ojγ QZVˡR͕Dqѷcl6�8Ӧydixod-:&)SP}Y4Dt*h(6RyyҝƶQ%"vf!7n+uԵ3zf c ɟ+׊đ_Ed^dӛ6:RiZqviKP/okRҨILlŚ4ͭұN.xVx>V&<Mٷv޿Vɬ"g4x*nu"yu>IG3rOre[UuAE�O~=`}B{ݴ@O_RE <n~E H?Y;b}BCQwlvU7BYTl%juEھ*P_ fٻ2/$~ŋu=ŷ8#*kS'"R6Xz'b&š҄vT$&]Glv蠊]`j.R. "JpWpLn(ZϥegL֨2;ɜJ*Sp)Te"bO- RlF6HvYGD}~LF V~$ AFG[�rTI/Q+l ܿ ;cGVa)VNؘ0'ۅ%?+s+:Wupvɭ˅꡹;>rsl.bt[ +4^"j[Jt¨.IHxl^i;nX6V'mtiL8` IDx"g$U /I^'UnK^G9jٗHvE\LVQrOί4OK6+dp|}]sjOWRZEyY"DԢ%s^I.: ]0钱2eR qm.zrt*{:$�:VfȮEn-t J z7CssV»=uuY'y YS?WGJ2H cߛ:MK'{61n岤H;rd"(CƗ=Z%Weآ !9y0f1,Tb~4ֻvsdٵlARG<:W/(ӇϛCr6 R.*J܋ٽJR:׼J|:JtiR6jhH ٦n3ZPQ<#8r?8ڕ^}J4S .T/V)[e2YpB |×ֺ!Hk(&qu.qigRnٶM�H'`i)7[掗*/{__j봭zfRtkt4@{/*<,^Xi<'Q\maG=(jF~%7Z+iNp5cB4)MK-#uqWdM'RlKҼ4N/!Q-!#$%Q}{)$E*>Uā|EwX:Yu� EUtФ�\l\ViVVXe;$(|S>M,C]tg@Yٰ"ڼZHi߲F@]Plմ+ uKkEho.{_ZZK~j5o �eth'Ѳu4o(6]Dݍ+XE)"k@DCSyNÉ9s?mTMNtu5Gy/y&ת)` SFIy[X_f0l~M ''!m>ojƓrtOc9V_h-ř 9.݅68Bԟ@HRq-,Vq8;`mvh44g c㳻zEo�13K4$#-JKMv=%vqh=^ڂ״lHBXi \\Wc�lWEo=4P`uc_ܹkL[̜HaL&5C&[ }9jTy5lU$+1e²2I:*-/^ZKPtĬ˾9l}yx国xXI~Abd7feY,Cr}ˡ6{3hO^j7]oTZ.nqXsNkf}̝@ќI+>> j=^}۷o[۰7dyV]ʾD]lZIN8I'Ol;~U9Xjr؝F_CKaCvuQNv[CòZ}PζmQvjmz)T}}~†KoM; od&A^+2åE �:��1� `�����1� `�����1� `�����1� `�����1� `�����1� `���3?wf Hm?†3]o)X FR߻"�1ţVAb_-X^  `�����1� `�����1� `�����1� `�����1� `�����1� `�����1� `�����1� `�����1� `�����1 <(3?w}JG'~�ѿ}bwȀ f;qhzUXWG+׺����1Ȯ{,QvneG4<P:ؑۜS;XnW TʘQ\2#ɞ3=zDLHQ3?h-(9kc"%0 9 ]�b' 6􆦲Ėq:ʞ]e|;~$V*OrS!:3GoyUr{ovo1b:w?R,j?)3I41q\.\&J$R,IE+R3ϸeFM~s#wmߞ)>ixf+Ft=Ì%(ҕSkZcOR)1j!2bNP"#f b>'-K{[�5r֯n+[X[8I+HjNkmNTY)x tI^ݱv Qr{FQ W9s*l [ j2{T2+g0l\dA$ eX1/;+ۻo]j}scs|ٍM4`m UtYڑddvP<ۻr&*!.v1"N[Wt|m^ʡ"L21S+a#`oԡo~?'v~{/�1c8FH>RW4#S|~7?puSN&qϨCkb=!rߑi"^Ij Td'!vj0)s1ce5p8pUZq�L9�xBȸիjO[ 6 Wm"Tl:KG:K" 9LSg7\9^Ad}3Xե˜`̹"Yp&A4"rfLAr嫼Z[Kl}XXbkWnVIkɌw&eYplYu,^5kk}/ӟ_jN;}C"qZm8ή붚EN-ڳǵ˳?tnk[MM[¬k8B!x:9&.\ܣDz3G*,4hل{3bŚ 6f͛df["R"ݻtHDE"4!HB1]"wnk}} BYyDed1['"uC=3;Úel޷*c+̮,O2ݫ*+a2="=�F;P/ȥ6y = rP9'1N�Gus5UkVTi)hA\[flٳc@+Sn̓H]鉷lgvW]Be2f+羛<cCy$2% YXU!mRt-@`C2&=f"0c0 C?3z=ꆣ_NxǨ=~U䔊5VKs*@_IpUӓ}I p>˹gB_v7g6Vu Zj,>?b~;dg\ܬkrOFRwW=k]$ߐl-ShLW  lo|UGǖBHUJVMâ}t|ogGG4w;�I~-vڶoFS$"j%f@;ԧ %ߦ_uE}q׈"_k5_rذS ꘫ䊳 \ost揈y56DN_j)-^łvg6ecШ:k9xyP6ytVzoĭMrV!�;}w Qk2:y}\vb [dJ=tmS~[+5;v^^0 [F֭w ][hMgn#\+u:tT9 %rQ4\TFu[6ưQXG4y^mժVB.T.r͍C! #jۍ\3GkvJYk�mq˥ZզժU]ZE[\ĭ||~Ѭ603F,kQNJ9/QNfUdzi&ZĽ0ȹ{7! zXsŸG '+|ݷqQwo_)niɊCMvz~l\U܈Uᮦ`l"?pop�[l kamEux5=gzuK_[iq$25[fZ Kb"* Qw2lc=YY,kεp!5) ]ܻLξVEQu >-Ѭ3JĪҌ.p{C7O_vgŷvqZOY=jTT$!="uNmDm!E=iIboNɄV&&i֢vu)`]QX(ņAf' fmk.f`\ԛRW[YyH6 ͍Oc %cp xs+ :7^<uߖwle,hL#y^ <ߑj_i草) X|y[6]nŌ݉Snb̢WhffY"޳4Nkx~]\R4TjpuUݭt`{ñipsInYākHjaSWo/8C̗n&b 0'>UV̂vafMIFT͗no)?qś�Ys6jTatRwNmʤƋl{d;HYҲ 8小ھ]:Z}R.avȬ9Lr .Or_HtXj܊^ٽ ]{3ƛ[uT`ZEIX=N8\frm%[II͡h zXsŸG '+|ݷqQwo_)niɊCMvz~l\U܈5W+qX5eeg _5Dt$eU伧ʥy]qwS$u/!nU-_G2鵴f�]XDT[pohn(\%-xi2{G-F{jų, -8ze,<6%9/^"R޺]4غSiX"ljQܭ=\ "X/'z/dü[ٝN1c$)1J@4W476텖Mv茅dʶЉ_cN fp’Zlk8sEr*5cͭ33ʲy&HWe{?3 N}^+GMGחqJr0h2rO5MKṢZ֑U-j1SR! G藷Gnl{v'ޚV\6ծN1kWl՜ٯŮq-,vGM%+(v\Elu^EbT\{7~żY*-usa%'p;NR:5j^VQ*}muݮLIŷ&fj~Q龲_9g#Ϊ)u{T M]Ӑ?-64w?9 Y."԰}N.[Gk="%*в{e2WKT5* )0v;>X"XJ"pbY|Sqc8Y33#^Ew],mv؝-v�|ݺ%7mN#mىlZ] '7bETyD\o_?mlOtZ$ia])sOUs3/36֪y-p^1H3p}uWEDT<M8Jڋ;QYjX,) W+A`z^L1)`>E_�- %w>⾧larCtmuc -M?�U̺Y ;@pgܐ.R)~Ը`jm:hj}_j n\mv fGYEjQWIlb%+NSriBL; e]M~zЊ[:dvMs l*Zӂ+hٯ3Rw.*YeV H2}zʗ/ CQ.ԛ#sZB,I =93C:0<Զ%V!vyWDVgg3KvĄu�!$w7D6ۜk|cZFlM{JmY^8l]opk.6ٷu9ZJ.`Mr6bT+h1uW]q1b_wiZŧ7mbҡkEu[\eg0B듺!"i^dHֲt�:k;\Pr{/@sݷ7>Tg{ڌv%h-UZ503*N>N]˧'qc/7L#7ً9.d}gu-%s:%AF NիR]c<.+[Ikq-u֖~:Hu}֕kkNL-V5A 5lBz1Feo v},& $쒍u]tw|6^E%S9*i&u6 cgL119씹61Gw+<U6Rn q`xrKV-;$ UXWkK4Q:%"yg?!RmrK>'NwXlt>ֱvҫ/)yqMJd,+꼴ZuVmN~[3{jyd"t|cTkE$l2*nkۊ-Mեsai4ҏ hV`\ Qea0ej5ΕTVP 8Xh]W=wTfkp,;MÌg`8$9l֜!syݻwݶ>*m-I/WUW8uVV%{.wD֮usiv0%:R]v+ߵ^g&:nen͒0IW 6,څ5 bYN;AYY]` %c"LձL`�2|��c���0���c���0���c���0�g$6D!Aۿ~' fߊR>;d@#vD�c1WG+׺w꿜Z>^d �0�.Q(9AuXVREdQl1fo;*+`0\G7RǎYV^.JOU|YzҚRdcvc<33xUrcjֳU:a,$D"!!.Ǯo�ᜣղ79;6I^ͷSJDfŚjeRpgT/m#ͰQ< vlj0Z].0i$2d u# ;|<ca0drG^űq;1Kl˩YwL٠d;r F)&%E;ĶdWY$0SW)\91Y:tG*4Q7'rj΋ts62\ӐMhVY"QBB5"uު^QYUگ,e˼K/%m!3y2_?7z;5ޫS/-j[6{5v;\vא߷Bڸ[kheœej̆ĦۅTO(kc.PAHTQ) aH0|2dU<ݚr>X޵eq~Ø٘#tC$]G$]Zۢ]CK7SQ*$! e4hCa7wNgIN\7^? m J6[{4rdr5H\3VfXD[&g(b͟ϤOfX/-o͙'xTY&x'A9Ǥ迣șg/{}7>LEe:[A~1ypxGVWl#9<uO`b[j"^5gqs2 YNPv\fVWT{f7y'g=}s*iϖuL6<]ruWq_U<W")6pT*XȣT6mW#l$ 2==FFwa9f .D͓+ 3i2DaH#M<G k!: 픊ZBc2%2r{'"�E~4M�Oħ�RAz?i%+{k()iubd9m0].:l~p۝hk`FmqXȋLDcSrij >9tTZ˵EGY:r G[d`@,HMN3V>V*CdRh:j31LS`"f""n&kUVmYsk7+i]ھ03ͲCBe2O_%kẋluks_3GW0]xWC 8uAtOU]S]&R!Cә5tSw5v.=Uv QUuv$KBƈ̒`R&~⾷~,}?;;M/}*;�MAriG(W8֏ bKGl?N;'giEUw)芥Soi*4EE0T۵n^z8eYU u:\vU:Yg *9;<S9UDV>fESUDQ4tB.,rTLlbxW·-9a9#cTZlpd62E[C%%$HdbP^V,YF2iѳ fŋ4l͛6ZDEv萉"D"i&B)Kcm=ڐܻ@A*yZl,EUc1ՑІP߭? z G.~qLcU5Zl~$�] �ڮ85Ob.uwu# Q2={vfk/fݿ~I+y$Tj-A[ԛSM4핗;e niQ-+S~>ʱcs="ѪxԿљ~df͚jX=:ƽ6UUHX}Vs,LjBn*íׯDՇ@ sa2-Bw(>].Uwbr~R\k^|xuNIӄy*Ɯ_%BW]YBw&8`TkAQ.{% s[ 8UdjE+a'Pe"k޻`pIJNRSJ&(&;VtuȪaUӯHT c1,4~V.C:}^}/;Zc{È O[8^?>>srml}xu}e{'jK^_+p F$1m\oN-S}O+n;e/jd]NfKP[m0Ѳ6$|ț% % v$Ej.VvzFU$ϐ#ለ01`kXE6jk)wBWCYnrwg0ܻTMlԅ.Rq2gFj}H4d>pCfk "!)OIMx]� S˽bi^ VggVZg,H/Y\j:Nm|K[  -b�B|0?+oGgޑ[tDV;'ɜ&R \2Je4d {&9ԦO f> i.3*g^A.jݦxD1]veU@K,*Ù8v.%<,=+gkhQ#z͎n߼gjn+1R:QY56rLDjY2jmi5زT涫ZB!n]e1VL7n`qsg%v_fMttw l} 6v:?I:t@΁QGmdڌx[AjW3T{SۿKںnxYL4l�&&G,ᢳ 67,ŸDղο 3&&W3#Y"k%kMbR5JkZUɕBU!йZJ.4G?VXuBV+V:[`T"Ӕ%zw 4Ù L܍QӬp'pT:OQtrM*o'ޥ_"բ&fdo\Q䍢"rUȹdH5LLIOI]1*%ܴ26["`4ֿ͑`(Ȯ rN{S=Mm[S] ᴖ,ߝF =gS2BytejI^k]8U}mFG7-=0ٰo $m=ƶzk:.gmlL0YAkf\"m-7S)mGe.עZW鶕Z^VuS�j.쩳/Ue5ᆭϑW_jl[Y +tmYIKݧ/Msb89ϭxa-I縂7>R�D`[o2[uUp'RùކŊv%]=X)TJZH6t&ìшfMZƵԦ[Z[lT(%RPzd,TI[X D^N"-IotRJׯz .Ӻtk Nڴ*Sݫ4 Swՙ/ ^8*I$ [w#\j=fY-+Jt~h{ \0U{~n]ot*OBɴckl,| "Ln< $[:O+*)]X\<e=293%>&;Nfr24uIQj 0JF$K�1Ez9xs͜rn=Q%5SRjڭKBM4 6&lђxu m,v?x$BgFr1*IKIJ&�,5wk6MZS鹏N?bg1厮C5BCֱ��XgMDD_7-= |wx¼&+uEtBFz¡ m,wc.?y =an^ juk\қvLw\/k!wT!<&.UT{Had(RB4'IGȭ=JPw};gDdh40כN)k3V%$֫Rkԯ ,,`:;b F1 Y@Zɯ;6^�= l[q[tt;޴2gӝ|[6njJܶ}^zMð]4i{ZQ\[nfpκ>ƙrʙëolB#inH;g<Ya0OE,m~cbrGODȰAdVD UrB&`T-c5cMkvTL QvUa M-=e4[$2[`&*=tMxW/һZ rZ&tƣqVAR/Kzvʞi$ԓ7?p؟�%5{+׎Wʔb*\v)Ack G:zcz>G9Lc)�0���c���0���c���0���c���0!Aۿ~'0yCn1~)Hݑ�7┏Nu_-X^ ߪqhzUXc���09ײŰiTw3)4&X1cΚuݻ\,3Gr듦٣dYe B#1\i9 {,JSN"׾E5%5"YvQD+#zdw`u/ZژJT}˽˂9HVC?~:>z/CcyOqRtϟ^:oq o݅^}e{ }Rmʹ>gߣ]�^RGRJ؋YHVVlxvS O Jt-m1 QfzG93gbDc^1rt6vGr?Ιson>MѾ Y ҢuIrI'W6,+zj7""*o1BMY]V�l;|OL ɵ 92b?7dg]g_x;SCik- Ymlw`Oakgj7JիثdmQ2T T޺VES0IWL@.؆7oL&I<>:4RɼvzmT#V3LLG¡,U6 | )Hu{&uQA{exKs]]Lȧ sཛྷbEun<%mUݺlӭd"ыD*֤VD2A@&#|}J]<m:2whpnfO'f#Exχ'fŞ!}_jVq$4Rj#])C~Q2wE_|7;!"-0M= ZnK.I#"g 7̖hNA8|))cIl⨋Yțok1̑!u"IU� ]͑U× v&u]uEUUT1Hd)s.2lǖ_.^ÄfpY5)fFC]~{)ܺXőw84O7z\3F׏w!껍MA`nƝ 2(2iK8鐭mV3 xߋ7-@+Ѻ{oQ8StQm&ZrwuGQ4^veU ^KrarPOkҶvEql 58ЏeˢAgrd'*υg'󋙱2cPLl) Yy\ds$,UjzUkupA#vUyӻ:t#_WN0"шCJզd8{9G`i(hAkŴ8}Xc{?rlfY,eP9-AUyU7Tʟ .r�#Zݥ i k|GVUWRu(&::WX=kү_oMO~=U\o~6ktj gb-Tn@Ƌλnu~9|vh-biM|e5n ȢTZ2lAy[$:.�U=#m7pa#ȖLM&|h#̻%"q͚QI8)MMhSvI?9Y4whw:oVϽu26!K4E3Qlr+@hX說Y9Ģf D`A50�# ?C=|Mܓs:Bgj%`֩]Ч:`4۳� >�0���c���0���c���0���c���0���c���0���c���0���c���0�g$6D!Aۿ~' fߊR>;d@#vD�c1WG+׺w꿜Z>^d �0�_5rd3x]tnj3"g-)]9YHdL!b8Ϝi?/Nޤ5ȵ]'YurO*0c>Fʱ{XjjF?opgNKkiaC� +'9_(bd"z GR2(GMv$ln뵵˦O~o萭kkݻ%~[WZ,XV< $+.\eG^˃2 1 #2b #w-]]VIqPei kWHG`+0Sre{RۢDڷر!L^}$;IUDgwH@ɟ 9pgYW+|\*g,븷]ۆ;[_nW0QoiUM7 qh(˧ ]*:~uk+0TZGD[C6G_aj()aA ~Gz1G_#zR*WG_ё^֫q`u=꺊Z=^[Փ\~PxXR]N ̇tp4L_&n9VܱR)c ʬL+z2߭wUKFhd&ępV]ez3N%a7-TIgLug|FBbӶ$Oˑ#E\1lu][8p8a˞\JC{j62J-sD1U˜9?1ʬEY9'(s;U1@{(T&ܫ=uĚĄza\�C_W=wS_k/ >Zz8b[ }c.{.QGnaJ;rFb*9$)5q15`IFڲܥ')1-L^) <.|co"YrQK TX^47#jsGMPd9M"= ᤏ)C/YU e.-ZAy狛+k jA*շ?9LTRU8GW6C"gXh<c/0jm]J[c6oU5i!j822 c zEx=V-lzcnK<o^?6״K+n|ӎV|okRU4JiCUjpuݸt]e3d˔Pě9[#X˜EݔQ򩦋NţN5 {wm뽷 _ֱ/lno1PS[)fs½m_µʮ:vջR,29iY'gqF*=iM]H]f,L0m 7N;+:)Rn.wYSN?&SS8U8>Y}J\72S,KgoNZ{u[ U\6ܪSa??,-3q$^ocoBח3ZF�ue^,tyg5F 㔵 ۺ[VŷvnLU6$C\5-c4E,ӕC*4EebW*8�57<�22nPq~ =!oP,j}dLz_�ij%1.,ˏJ%8VZ)&y9&2Ŷh)fع&{ArL`m]W67$_gNySڡ"0}a诠arӜ{(wJY.eWKutS)֨˺pEzRY�:&~�����1� `�����1� `�����1� `�����1� `�����1� `�����1� `���3?wf Hm?†3]o)X FR߻"�1ţVAb_-X^  `����#Z=[̳&nޤEnuZ<@&G E:*Y.s)M'I3zDHf"f"g1~C%J@ *0d +q,AR(Y@΢m�Œ^DvH/3ci>zܶMZj<fh5tfEv[S s*ɪC6qiqт�;P4Je&7D Ҋy ~e"H҉9{cCG@ttǶMDLګpdI2eg+*/mU|xEhqfej@GlHd;'{>b:W*i8=w,Ku+kTTU='skjV5Y(D;Ly^/ŽP]8SWT#WGɔPdD]+pow#[+e2rU0sFƩ޵yx\ ld7XJJI,GH ^alf:v ayB2 8h floZbo\:HE~w9|vh-biM|e5n ȢTZ2lAy[$:.px#|uTGJNix�>��{a � R9�j;8}h%lRTnb8DKR5lr.m+-Sq'cTQ.Yk SfA2aLK\v"R*E)C&[WCzơ-(gzq$1c s9ŗLVe&5ʍM/tK^RXЛ1b1k:ivs`׮NfQe) oM.S]/by)wڏq# %lEя$T+e+iYX<;LN'S%;NN]_[QwhVn a%(A^ϒXi˫&[z�U=O\Mp>9/Vx9V}N/>0nmlx7]A.s۱6muPrg{Z,*yV"k;yydpYթHдkdlt/df:QH~ۧGjtB&L`ԃ={n՜״BUl;H͟r\wOc^] dWD3`-s/r2^*+YtR3Xr'>[1Y)$*%;;-{3Q[F́Â!R1M_ Čt? |�70k_}wXi\^b1oGUm^tT6RQVW38hH*k„kΔO2|R:E2uv?QԏLk$=yh N;םXfۣۡ:WH*TSdHTPO%1gR{7+On 5DRDH0ôؘw|H>J]ޮhP.jdQZͺ1 ^XMMm4ee]��\����1� `�����1� `�����1� `�����1� `�����1� `�����1� `�����1 <(3?w}JG'~�ѿ}bwȀ f;qhzUXWG+׺����1� `|dMKWf4 M^W&IJKG"9AW1ȑ xR\0BC=zHI' l!vXKZxJ{-.(]/^wSǏYӷn:p]˗ ksʜ*s6szmv ܷU5۸BLEtDQ%U=|UU% S SȲ@j}z>z׿^ׯ߯_9 t7%~IlYߛww^9/R׳;wݵ ڬcD}r &GQqPo?f-)'UҤm�Ϣk/ąg"1f0ɌaL#cDl232)=Pf][YG]h3;nliɺ6.߻erbØ ;+'aDkV\zxIIX(3ȵ[K8tEsA4]7:y39@KX9WH sƥzh1zsv(PM:u!-Уb%fku>Mƕ�I����1� `�����1� `�����1� `�����1� `�����1� `�����1� `�����1� `C<!@O &a <(c5FR߻"�4o)X 꿜Z>^d +U ���1� `jw%6nLo,dM9X\W\8&><ug0OdXbx\[lGvۮj[l",udAtT)U1U% b(C.K8޺[f-= sZk/W$wa sior f}[&} ְNDʉ8ڪs=koDR!⧮kk&=mvNa3,s `o$ff[2ϭ-Iukw7:'v!VqMƷp`kk::[*E%c�<yEkldǍ9ٲ[R⌚,<n %$0 c֋0c&Q:/txIOGK{͜X!f ^d ޓ�xֿ7ÆŸ8Ir8w[[mD۔֗.A X[[EӭUMP謊UdET͒(Sg.Hr1 q AbAEMb` L61c g6qg8G:nM%dtJQ^Neyd+ӾR�!u?@8<ЯݞL)_ ZeY1gNYd[ &u]c$QE"*Hi9s`.2cgr }W6`Ir 4l91N&xՂķrDf^.(eL�|mFkH SHi2rM&*َY6pi zI+a08z/KܝW\ڼH=zb-Y;x6e<g vN{Z%w3j(i/'%s}~1ښOP탰Wmq#l_:Z~)*`|ZVM*T?2+c<;Em ԉ @lkZ'lI# T]u3UeMׄ3CvR-Z(11w5WBsV)c$la�đLDDLεnZl]a5)Klڵe%sJX@Dbukԝ$\,Z9QuiU7^d gvڝHj 0\.p{8ġ>W (<#P2ftT#UM"٥M�n躔ZʖY*$nfFG$ve}]FMf6}HEZ >m~=M=Hcίu;KL:;cp6:Eɂ4 dS a:A_?NrS}\qxnm.VvlջfPc MheTjo;7"iO6<ymn ޢh}xZ,pm MWWR'ݴpN2 9o6/K66܅~7lwv;<R>WX%<V>X̋MԏOC[;zb^َTxX v'fUI%iW% YeQWّVͥsG0g6enyȡZzמ1oM#XI64[Hx~7X jT5�KX-}pF3dly5[ ";Pdϥ6*>T|U?'%*?O!ԉ{�xH; u%|5cXu-=N<^ƛǭ%@[MUkX,W퍨^Qbf,('/w3<v06I%#W.fo+={{8 9StzbZ%掣J5Yrwwu(Q"> ]>rזjSr|Mm4VA쐩y;+rimM4U^ޥeK/iBx%sgm6mvGBkP*>__KEyk}B=JyuJjSi(U|Q^',V|Tj9-vkebݚ4W|bfQ 9<xg (ʭ#z_OܯS])naٶ;ٴ]t[j1Mnc_&'n<=}T[M9 O5}]qC xAd#=6߯ڨi RTLK!"'vM+a;A&O^yʫnmA qК%Fu榻n [bؖͶu^ܕY*DP؎qrBN^R5e }xޖ̷ln*݉+7`#i7 V؉+FE3y gl;o O5ʅ "@YB F(ƃԺ-*;wVԧ^^4TNhD[!InՔMWmiH~|84\.)PrDo=XCPۢz [+ npk 0clZ]~ YS4/K"+m/7FݚSz/D,ˡWwlhmc vߢܹ=)`K 1ɼ@{E㗌0ҿbd_�m$Zʒ9M#-;,@Pn$Ggq%̔u�mQ-U5^uKT`i;Z {Ygugg*ug'7Vz{TR6-NyPlK\KI-$2lKnGl&+闑gg9E1seݮ߼?+i.XRvTRMY^theH.-XRsqf} 3j G^E<ڳS=[zJ>r"cmIK:uM}RK!8:^i ]B<9h554Y6{Fbg˸o^&2ƪok<@Ŗfabl@]= UP< :CfTԀq,y#y]�yNϣuy9oZ>xϷͥ9wKlq)nV)UI*T+dч7A((6nmG)wMJȏ{KO}ڎ#4EJ1|ժ"2M=4v uX,P50ŶiR@̈%=eO`1n\ݣOkQ2D;;,]6E5}^]U.,[C5th_:7H;TcN><W4eE*uՐ1;Y73w܌&;ksWekN]OlztNp})Xxzzf.om$U躤%h&r/T=}zDvCᚦ ytMwkqV6Ҳ"nb"gX\9pXK\/n KX`,jațUtV\kv{0\I@sumZ ؗX͋P:IjZm["Dpd[D-�()={e:gS"aAA�cd*ʕ zG$ZwX,Fh<r-/X t6rq܄ }4lR!`ٸA$J0DDĹ,+ja u 7+=-A.ZCg 4TkK^<ԱYl:w Mơ-;;M,w%k&q\31T)IJ5ͱ@ieKtrUnn=/Z{[nl=x= :L^@c}wa=!n`\޹ճO{ҘOYXnVї,*X+tB.+rz[kWS MVf3$3?"RB{kSn;bECjciG(Nc9nN#zMk{KFrfϯ#tɸqmmVA-R,@kQ,쳍u,D*/$c's3/SjDKUgҲnH"e]tu\P*sdI>@%ڗ>Υ/)GǷ#eNX;\*56& 2[0I`kx&aaCm�&�0���c���0���c���0���c���0���c xQ3g$6C7┏N~)Hݑ�wU ]WuY0���c�� ݷ]t*rDYɬS&+&c&JP1\9k�t܅mi]MV_83$9J5$WE @ʾiw5W*5aEWrH QEEVUKXd!B6pR904oX3{fؿŜTș8HkK$Ҩ ,_꾃Is;^֮ӕʬnj@L~њԿ_AˀVr\鍋7clo5OENSG)!H,[7djkvoYWm^+ 5t2᳖JTAR%TQ% b1sjx &;c1M{ D)(^;vLBXb$&s!)yu4[_#B$V$. I&Bal 4}Zy^W)ލ;7hZl{e0M� q?Wy9pk/*lBŊ:ض6\Dx9 ϨipVlb{v��228Z1tVFgȊr4˯0TL &$h?[=XDuLB&O+NIq&H:;atIhfΥ-mkj~UquG)WW)\L*R&HԄn\ ϘһWIJpP}ݘ^\GiP8rjS*zUg><{ꫢʵ6fDk)ck%^@6Я^ӗd+ڱ$-kMMeS vO -TE%WW) /m>LR_Ri#X)ie|,/*ݻ>{hkUU^O:Br^I\>~ڡJUZ@,9e?.N32{6+\g\Q : s%$nl|vNq3ic )1i";xZ:[]Z))- dME!G~�mޟ_Bk_l>˄FZtN,aSZMM֧5TSr95&9\- b2S؊ Sc83qg]&Xb% f31E|ڮ{ԉ޷Y%MB3_�-?c[CyIbdJHJDt2OV%NӝkjK]4L#?E3֟3mlp<o|k~_{kkG_m]"ۅ|pu.󻗇~Bui{ʨeSl/8 VP-n$Z2veb DDcBlcCd G\ku(Rd{Txg TN5,ZͲmM~ArA3e۱:'?6ݜݷ<[-;pzc^h%gJ+ES%c-ʺ]%pT%oݝ#{=mU\-8]77eRTmR ME+y!geeq#8~�SGJU N( dTЈmz[2s,&X&͉ @uνM>$AպR9_.O>u\MuJXk}6W6W+dJJu 8k RaXhTӒ!V8i۷i2Q˺旳n>?gy-kSy7N獓_mԗY""0y3+wdu/x kzLgDr2#PlDȸh5J+F*&:j#'J꽓([{|ɽYds7"oF❂'*V?6c*%$`\q0mQy>k*\;dWZb[*VV;,k:ļFM&l5WC)=gV/KڈGҝO@)T:{U2�9| ͦI wgo|OVyQϗ*OA}Zmr#h] km/wM5WTӚUMyb^0w6eaX!Tg8dE[RL}iIKMlMIi gc}%~% �oDFļzD�`GU4}~^x;Z50pԺ{5. uغφSfCC>EM*s'YF5-)Y 4 bJ٭d̃틵7FufRjbۯb#y*TFAjre%G4h7+*O ,7lm75+znT{󊣖o4-,x8*Pj�[QvkK *-6n[ dRI5CcW ~I!*k$[BSX&'nKXB{}f7R3ʚ;`lmm-VJF&6(?pE~mNuLS*2v[]gO+&zrh_u-YHE8`Q4RlMLImY"5_6ko]gɹjLg;ȏ\6/.PԪ+oNj%oQ5jZ}iϝ62w_\{݃omw+42/+"e67G M%o}ՐӐZҩ^oYfvҚRU`BN귔k3<xη<-fZOkl<=s%XַScX}k̊JiW& @*% H\^e3�12p|<atgtQțgbؖ%bmm~cȇ7mmkN;&j$\.E"@Y3J[so=,u]"_+b{U[Ŷ=jem;KlA T!i+\tEB*b"<S#(0PRqw62iys ;`-vzY;DOD�~hFz J6ڲmYlH=SuNm,z)g)v|=UHp$VumN n}O p-`A='Yի5ueB^umx,z<ʺõb\̾XNq:/:[2m6$-5 զwmI Ǐ\ix�VXUޝtz(BaB5J)kN:3^m;aиڭ!dוm"5 ,n홮;X'3&vHJJʼ{1`�VƵ1a}ϩLs_v=q1S@-j,b�`@D`+,#A1�W� `�����1� `�����1� `�����1� `���3?wf Hm?†3]o)X FR߻"�1ţVAb_-X^  `���rsU $ZC"�K2.ɹs)I$3De$SM)rlC;ﵶu UjGwV_1׸ d5kkdˈE;Md"e)YIA))]hIšG\\ ^2MmެFͭ32po2ΜI*eL \g).NZ(NmQ+(lQVnLEP2f*LATW"jGjv,|ɴZ36Si"BEF& Y%K o򲦊0¼4\W-Ŗ'+rv@vv M[GQ? Al12O}[ۧlw:.)žǹho:UdgzJsVid}V7cN2)٫*-p|vpMwpσej L7zZZXĐHd5)˻!qqK31 Tb xvT(6׳c'(.+LNZj2&Z9卌 c˸DI8q=_kXٲ6Kԋ,E¹YHN=#Fµ)KOMvNM5*+�f؍FįZkuy!!?Nю4/Q'KvcC]9\W<iwy$1WVsӮ&=s6B:1,yyr0ofa�tp&`Mӓ9a˗.3kt33!EvU3c62}|)e +|?IUpH EQ!UeT6I&L(͂.Lsg.3қhGaj-(K_2W/&9w+aT\8T}}XjLtD]xJCl8jYV ̓#_e( K gv^ʄFW>k{yϗW/56$-Z1A}ӡ{UXUzWO4sȊ3M@1ֹsk-BAwmlՂnPj<.)0zb|[3H_{) AQ<nNLY]l3uѣZYPQ%PMD)Nb63zz`|O:o]>Iq KBUuUR&s%$m69nc �rUx(\[Yζu+e[ kӣg_U@-)̯N5 c6 ^"d"i! R0RJR0\c1coysoE"٫&WU LIF»S*Sy\$GW[gtm*,@zز[Tp,Sb$3FAyN!Y^Muw ��fg���0���c���0���c���0���c���0���c���0���c���0���c���0!Aۿ~'0yCn1~)Hݑ�7┏Nu_-X^ ߪqhzUXc���0�0INa;0Ϲș}~.I7I)bAHwWA=D[& ,ZP!"ȠFJDHbz ON=-.(k/]A&PQ4V,y% 2(3&%/C|eGί�6E<|¼|Nj<aQ{}.u6choPEVY~,UA=12DQhu!~'*wMBC`3ϧ6X8=/rL�'rcptUSѫLFM*%[V>L.Yo%pVYY3q!"M1H=CocWҟl): : 4&{6$B0l0wg^oZn-~U1Rۙ_q={* ̬VʝbO]}JEfɻJFUD됇RU+*9T.HTpdI?5V& $K-rrt:Q;dlw&b9M_\Q;u^o8mUjʛ1&:o ͜2*&wu]kTԎv+Z%[!Uc,V J epqG6Gn kƲxk;=k[/oFWf(sWՕF*/g[.�tHӚUd1ipV26_$Gͳ)3ua,cbhGk<m6dbaۻn|#^= ݹllvT!]4Nؓ5y- M:+4KZyi,V@6PP$tGSXHI-O26_g*} }4]Lmu]XCk0^ _Q>zuKeqoNWzPkKF{D&ZW֍l5PUim:[F'Tl&M v [U[ɪt;)ʪȔLTn<͝n)j3lo(V~ N ē$X4VJA\S3/޼z]row7/O5ƶiɭ0+9,EQHNO20"u{ӽ4Em_*Χw`B㪝[ٵM'E@Eٸ6X _ 'lʝ5n)&ff l]֋`,L[V-<$bQ5&%C^B)'H;t՛vU:O+)@d8 Ჭ3QZ8zGRctB09Z3^W=1]b(H[c]{#d;F.!$c kcT,^,%��mҰ���c���0���c���0���c���0���c���0���c���0���c���0���c xQ3g$6C7┏N~)Hݑ�wU ]WuY0���cy�?\^ФNT,WZ]*X嗧 ѢV1\ʸplͲX2ݮb UNR9GהW=T kYְ32")KVNx:ujݯPVuJR1kAk"2(aT,WeVܲAD1c &%." !T)sy\zwFW{%%'%YU<&'.m \c8pEW!^<)rVYǪKK]eOK'w笪xLOx\*qȮBxRZؑ/ޗ%{DRөTwfFőz!-m@=�drT涓^v:Uw-V. !HӦrb�R&GX@:+Yl^-gRiWrC><)1NE%rc<jZ-@۪,P/g,X pd‘ZV1!Q}D4&ۈh}*7+i]]L[5M˦@Hly&k 1]Y5D[*rkEME-n,Y3yټC?ٻb>]5[Idg bz*$d2jF'`{74L)IVt&9RK Qn$POZϐyRZ</ʼ7Ǣ?y/q^H׿=wtGmZ V^^FұKcKa2@dk)!=cLcuǏ 墷Z�˺ޯrD5AvT hYyem{ F9R]a GR_M=/^Z%^^%u5t\v+]d\QrWԘ띌4.&F3Tҷ$z"vD_?fKĆG_cZXԴšjUtS<|{qy$EpL*vMg8U5ItQP"'2jfU% 59prl`3dp>a˹w+ u66cPU_*i*kkTmz"JE}S>:/ԏR=!Gut5⶯PO"'ج P v,֋=PE;V5Ӡ +\gɡwA27pr$FϞ&B 2\d$0r:߁G䚮UFRjQt԰"2ʶ>7+:Y F_lp~qǽB9*X"O}E((ImY.v6T��f߀� `�����1� `�����1� `�����1� `�����1� `�����1� `�����1� `� Hm?‰C<!@O wѿ}bwȀ JG'~�cWuY 8}b{,@1� `�\>B\-Qͪh˯"cbƱ6H\vg&tYŠ&i5�BUSNb` ,x[_̩(^wBi^9kb;lUQa^@©sYʟnZ  2��.0ƯQG>%rc*dÙ)7X! AوS.RMK4 VvhҢ=(y�T$pyh}{c(mUC/SE-VxRى5ѦOMdu�e`3^ZD Q<ce7OLe2jNۨ[fi!; EIiz~[q35= k-Ƹ1Dvӈשh^ ̯g8ƳuEEMa5t\dZȎ{=&"4Y:TB״]+#;VMTUL:j)e:j&r9 g8(aaWV=mM3:%$0;$^Eh1uvJDUU> t_AǍ֕.0&K{f &pmWAOFwkeEE$2ƣ5IE P,d�7 ��c���0���c���0���c���0���c���0���c���0���c���0���c��yCnL xPk#vD�hߊR>;d@38}b{,@W~ţVAb��c��vzّ)T6z1 ;]L3V?�Ea3�dN)=v�Q?x�S�K�h�&3\x^>ɳ՜1ל<9)p_㫫8_IG��󜶖�csu=ysc��ݒ�i*!zҭ<H;*ّkdFE|2)JSa2D9sd1r\%s-ѾYǼEi$%{'*ykԙq`qB8Yr^gy}Ų6 L5rʫY.LwvtE!0BcFFY"]c^ޓ۝�;Ȧzt�3K)jnWu3/): ^~Tu!&K".1YL\t2gdp4Ylzŏ7kܙee#oijV(3U-%9VM,vbf5 \ V. Q</QpnJYL)K�,7k&^kVtؐ^{MN"W$ٝ;8y2ndh(Le �0:GI��bJ[f>>?oߤL�^s-;*,^13H s)rRⅷgKrƛ歠��bAkբ:!3&J0C#XGGZ=  ^˪frٝu1;W:**C**9P)N,)՜v~zE ' GfE~+#֏d~NT)S:v`pbH~?^y8<}#^ͩ]%joP„IV7ADT˜ʹ#(Lr(d)1fx淦+ H3Uȼk8]*ey )giFШV_puTOr7K}mw:5*;p,ʞ6j7 B26Wݿʙ;$KΊrbgRc1zɍ2je>c"uӬ>~g2OT c�x{ܢ<?Տ?"ovnYĩ+˄*-f[PmKerMMcyW9U#Lz'ZFIYz.wJkZ+uMT[c!^,F  "E+WӱRj�wc n==Qa-&5ղ-"|ׯd#I}$w׮/k>(m9e]jjڵ Fr1zk [MBjm[{K_,1u tM3a+f7+lւ{%uI+p+ sPU^ q%B nlXV*>\hB#uWMCiej]SqZKn k+]ASe,^ey,A<-mDl|IfqoN=K4Y;TK;ݓ<VǸT6W_dyqRtu4M;M8rWHvFGeþum"&kMf9kA%Dr-lo-5AiM Mr$dɔt�ܲ᪻ UՊZ݃KSi9(Գr7C5#Zǽ(TbGy۸ 0r=}x�)se ӕ_ߘͪwfމx֖jw9V}bts YȆUZ7bmٽ}3r\KרNs<𧈼4V4{:M 伾O"eBV(Qm+`(--|wi}c16|:ҩRN[& W; !>{cEqAqT5yח(J tVЩfj3=j.Z\Mg9�#ss|rS򚑯-Mǭk[ �n}"U!Yz:քr:'"ף{܃Ӯshm Itu|К3(*A]ԍ˸;X9+NYRR 7dd+9eq,<^ (K3d,PXY0SX2.&i7.^lDt7ޮ-WlΑVm+,NJWVunyj,˺YИEtuޒj+c܋TRmqc1q:&b96H{$VVj=Svr%t؜2{ψ<溚#AεYn,"v|;"fZpZzqq=A4L?n|A6FRlu=1qez°4eurB<NC:k1FmY ^4k`*;O%3"�r w�-Mn|eZ�JtAȞh ?iAl|IJ侓^/c/C (~%yO̮Z%w-3q.9rﯺ-7r.@kh۶ܙӹkꦸݵRo[>hhTd""(u+R}Ȫ "HZ=jZYojVw<.Z kV026X�r嗹4Ub$Vï{瞼⮟o-+{ReqϤKҵʣXm{Fٶ Ƶwm)ȝL mTdɞ` y|�N=^rsbݜZV/*&aYVܜch}+"gρ72>734uvwX ڳibo_ObQ1Zas3n5(Xlj7 tlkb =t⿊mYQzIvzWv۷G ѹ.!^Wdy\zB+iw=/$t#޻KӰofn_S#KSڃ{ߣSXxhtiʭ~K E; 2lLe2T6ld=٩:\% 'F8ck^1`4D8,5=TfaȈLʸ0W6MAsVMï}7VVl+7靝#r:'{MeYHO*Ic2jAPQkX{3[Ȳ,l$\Ac>bL5vVt ʠ¨f)'Wqӝ=.Ln-ͫ{+lKqsiôSJ%3Z 4m 7볡!_% S kz<l^kw;k&& drZҫ:[2ZQ^ўez}沈wJM=0@~f'7܊W!+WrE:w(vŗ}1x3i ۰L#itϜr:LQzeJ-:)d7!bw{w#-6>![ Xk>r?okڢmuk4XJtiGVrTv1^Ж1uomtAxnƅc |T�sl15Tq \�Z='|X1Ut>/9@N4m^LMzQ-kH􃖵)d,U;-˄ُeQ;wһ߹hͅ7M Xj!Ū\铻UЎ7znV-(+f77"(/ݱ%VA묋 1-=sr9ǛWndSm㲔9dk^"kл\Yaw3, 1*Ki,iQGǵ@[$0mN%mY➢o @xBa)D-뻦c9!9Eh.N9im�ɝ ^ﵶ*}ixmZV2nnIg/5v:68ÙtY?-g\ܦSj}9-e~Ri= "5EeS-{vDVc XjM.Q'_q"Sbm"N0^W蔟#U5XI; i +@nƤ{|Һ[͵]F[z ԫ[cȵאgs\]Z/cl>DooZ^m[=$8L}qGM¯dәádҎ;N Ό!ym6ک\Vֶ^Lrs:.Ok hƽQ;aU#3Kw/WʙgR4bm5Go_eF"U+s6mתҽeO];QsI ȣc_7qd=;DS,Y֐7UqjzֻWn%G[59c{*3=QvV0Ùf˥#tYo4܁K+_kl-!uqVXuZYWUeQ)?Jv|ZEi;NWu˥JbͶfܫs*A6DAF2C^i\_cxFZc@FXpMMOFֱ[+5;va\m>@5TveLJP^7PRzJ6&I =dLc"KTRL&zy됽cd8k�K[!z_k˽|J,'\+e*ig[1ܻXYwP=);UY72fHƦ;x֯]I(L3tMڵn]tNz| [EPΪ%~VI՞fc * {Wد<): XI&7=}'<k$jk 78^CҔXFyaEݥ!HV{U-aUTХȌu&�Y]B1X9%FïW:ԥ>,[m5aڡau5DObJEvMV+eɽ!~c;WחMInzm*%$ :ߏ7S~MؚkuYS#IviPm<M*~ؓ{䥮G^Ȉ;#i |9`69ILئ%<cɷ9VM#3'tOGjWQT;CEU\q&q-c& #m@xa.zLևUw`2}(YWLtYcL�̯���0���c���0���c���0!Aۿ~'0yCn1~)Hݑ�7┏Nu_-X^ ߪqhzUXc���05R/dmSrhqy$BA!Lɞ/',;N1 j"BِܹXV s8R)/8 .y*H>j4޹bidgvKzՂ#A\*z6N{zH?L$G~"?[nXʉ�eiG1|sX.1yaNHc'u3ۭV g41%6Y7zwd2 (ceʗ͓17o%V2b܂ag9{ M;! ݋X6r.d TW|EfkD{aLR9{ra\hw%ΥSN3i5Yf4|u'+B yy&.^eҰr隮3JkXtIBF??i~fz�0ma&f 8f>fcF[8rJus p|c*c:19t hIaWD<1V\뜅.U[3稤.{9!Qeȯ*kgySUHWɻgb^39:.UL(~@,ٲpnE \bM t C&l9{S$1>?i?6~;vͅ1 )>>c1'+G8W,9M7u 1U+6;TUxDC$~Mù6P)Cu%OuÕvưbK-pҹ 1T1TPVTM\<tLs`lk62 ΨWt׳*qK)ɳg9gYZ4H|Y�/=sijh lAi�O|vOۧ_�غ{G"t,xpk9_'2ʡ͂}&RB+ps?ZMJ=QL9rw1ug*.s9shi<mL4^p�1rg=$lOnc;X:li`jW=:M❬9> \2\g81�TtW=~�uu�_횮81GNoyO;+QE<JE�q!2Iȟ)d(3gtY;;hg)HeMqչv1Ռp\g9g9qՌc'wm$]Š/hT9EP!I!1헡ʯ:78e q:鳜oͤ\ccq?~^sZ-E?>dgG�u I<g9{Amʁ*~v^(4Vfa93ςB'D7Ƹ3xI˦R/k+g*YfѣlZv]Nڅm5w1Bccb XfnHaDM>uINș"?B2^%j`B[AaӶmsJtx*['UI@Q٥mu킏kNo36tJY ;QԂq..֮tP"6^ed嫻gY{{dLeVܗf۪רhrWjg|ee<0 l,mHvkxT5kbg0�ôf# 0&vy�(bcY��xӤ܁rK&*ؗ%NA9;-%eJ1<ueJVvcKk[h_6۶0mԶvkMv$p/ƕl8]7faRl6vCf(  k0Rޕ�6o.< \62Ȋd1#82iW&05ꑔOS*e)BTXwvj͢Z'%X'Bmi#rr/(@TQA8w{^Z [H(7kf;`X,6{#tU6.+hOi={Le@L+3dX̶aݣ].f,gpl0T *~#_@tu ׌R gªU]qXTKeY c y;<.6 #PI?EÆK>yZlLn6�(h-ꊵגkfuzӘۚIv{^փ}JWlٲ^8 ]"xk+<I*΢xs=VtzUbH&EevbXfOTD@YUv6m7Wam0{;gAyсU_ߤ՟NcW9ܺ=MUUb[zQ*,ǕuڳQF$бˬ�cztnpoI:Y&otEmy'5�iqP.5hh \Ê %K KZP�ȦaC`v!};!A6#Qe%>fwM,9dL岘-d"9 Z Z@Jt«b4B#Rk8w*6ﭥT-TI;FUĦɴ+)-yJȕ̕G�ݼh-zIKY=D襡(ՇyZDZJj,3 [0U�XrֺLu/l]bz.cURدVZFF.F(TW1J64tT9&"e<*]t]xWoһZ rZ&tƣqVAR/K|vʞi$ԓ7߸Y�{km| /(l-5vj~ߢ^ε2V>=l/*v,z­P:v$Lx'?|_kNΞYϚ�¾2-l�O|/2]e�Ւ^�ak$nƖTnWrLeѺz X8iM,kR'{8$W*Q3u(iYoG? w.ٛhhk�sjF7m-1f5zZ"ڐv)zV.7vk8Ҡ �#%(k� `%BuUr_rOl116hHuF503Lט>{EsӺ38ՠ5ⶽRM*(,*Jcܭ:z!,�SE[ (3hDܧZeZw}\Uұ]xEs{ǖ{{lZN9J2;j)dhBp)7-J0M&DҫNd بD>>))D`6#:qq &8d4~AB`H+h)WeKww[jWkUa[nKPS6ڎn=ߟh*EwONS֐$:f 8>Acw)-0ٰo $m=ƶzk:.g֍lL0YAkf\"m-7)U DP$̨D2*Hvhk6!=F#VLN�6x]v&-Dű>.݉AvalW\,]f ɨ8,K괴ú&klk!WY޽s%))+{UR/Q%vro}Ϣj}vuck"VVS'BMflٻBÀGbT^UkY\Y$J)k$VPRe$z[iB&V�۫ѪE\WiIb0Vw*ٵZ%l;?{$1-Qfn:xLwUET=tVz6jtX.;;Mmc+{CS1ݼ雥N�IĝkLfŲ_S"j +Y]Bbc W˳7nM؛j|ٙKjf'&\% (*ZkAL$xT*k̢W)Td~!F5M ;eJf6Ǻ$Y] 6Hًrex$STp3<j]:3xKͦR1{,<g*YfѣlڞZv]Nڅm4w1Bc%b"+Y" RUHDv{(BJJL%"#6Mw™#uԳe&Xe IR՚R z%:<k-Fd$(u6C:^vGڧm7:r%,NMA8RkWk| hlKFw^W`f6 &g 06H.m81xA{"Q6+xXjz|x>;zgDS�i&"iet% {  xæh�CUBg&%,co/-}vuBm`M2e˄*ɉl�̤ȍ"""74㙙k0aLb��! P BWUJ눈UʪRBk� r��c���0���c���0���c��yCnL xPk#vD�hߊR>;d@38}b{,@W~ţVAb��c���I�UFVHx!*CPE@9ΊgEg!JD2O(fU�\ܜ-GpԦQVzUCog@7YPvC"Ȫv꧌t\)'"%== zGU|�O&#?Ff:G|ջ_:N}9dUvĠ.y#\яb)Uv1*~ Wwm,xHN9܊1l u& %S/Kq6OdpU!J5D6+3q?bRP&gя~BL%fWfvGp rgl/s$,A3g,*ط:+B|^Q8Il4pX_kv堪QO_r?Ϭפf3XPh%Rg孖 'dK5R=Vr.vHtp3$t "O[X@ȡn6*,dfL!d0|HL[kshdc:eyyBc)L E7fsص]I2̎$wN(+6So:: Re\aL&:9 .??�^:k[133�u-E-(QNC=z�Xz|5N3D[ȘM=G" 1qS&slqB˖ecLgCd¦O  %Y[ܣݣɵRir䉤܇6JlsR x7TwkD+8ѫΉ%IC';~�91'V0\c�EqY9]KDL|G�vz̳�_N1K'�>ske v >CSc>qdug1ל;r\%6<5\?*NSu:V1uT Ut̐Y̅䯓~TL=қ=6OKe>ì\mgչv!DJ$yqv>L! v 1s٪(_ )�Ժ}פg*m*]beE0��Y?V,)S\'YSOsbxK/V g8sWB[+Jۣ7Y3.>�1>M;X19WI&fXSS !c8%V?:R2=<dLDǦuY g&P[ =cco) X,I̞ӧ)HDw|�f� `�����1� `�����1� `�����1� `�����1� `�����1� `�����1� `� Hm?‰C<!@O wѿ}bwȀ JG'~�cWuY 8}b{,@1� `�;s`re$^2ԳF'<}?^UcwvP/:nr8YTV3 8{/:m&SUȝv*nͤRʽG*jMT129C9sc.IEH`1V2Lo0/w"}QeҩXe^ +a.,SQ|c%"TFC+f֪v/QupܫV)9O=Gv;2^gYUV]Erg9Xgq稽Esd �"kUÅ_^3LT`WLB�&׎jy^!C=0?ϤwG=@1RQ=gO铍ڡ.LRz"=Yq9ETZ8)dڭ`Y8ʙ9cfDZ+$1JsdʡՌK% ccQ=yΏFXrIC<K0c*+ c6:cg_o2hi;K$ pccݞ~rnrմA3L?h�,�ot6)4H $ftwkh쩎f;e6zɳ8xc8w T٩9:#*\C%׌8W9YD{'w1$rR%|]_Üq$. ݼeC`?=:Fz�XjK,Mg2]c:>;Ͳ,"TOOc�ȱ;TY«"S9sB~.H~{E!Hns& y%Sml-ME3Ze,(Ly9PWU ગcP[?"Y)Hoʛ NS&;^ Ռ�,2&+DP"HɌy6sP1G }}1d.T �X" HN:N?fx$f>:L}:hzk41l[�&Tg8.1q՜g9Y]>(ʽ6ݦkۓ%>%&J\qÜ$n"dO'!L?˷c.?o8?D2\ ?'_r_1m4 @XӠ3iu]I.ZB�t˄�F��1� `�����1� `�����1� `�����1� `�����1� `�����1� `�����1� `C<!@O &a <(c5FR߻"�4o)X 꿜Z>^d +U ���1� `OS{Y2eKO`{8E@R9~ug~ޜ~-s ^} \V^Je0#Mkg2nSl-H'n^Eظ–d,+�_Al'^X!&@iDG^0A%lyϜ*~"1&M;2fOaSg8Jl$^Kd1Tʦ; luy;&{8rluGY회v5ͮVl%(KK6x3æիNSU69}[q۝mUMhr2M)g$#lWv.Mc&y=*a? ׯN6;ff&GGN~c>nd E#wj:dV{9V18>9ϙR 3fP2RQdn)d~g^s!wΝVHɗ"g…:%He|"Qx\ 2,eU֋f4n&`2aW '%hkQG8I;=^S#;VP�=G|Du"=F'?ۧ VjR*NQR "eo* g`1nze֟㫵�/"u:�.|Jr\YW*)&2lu ng8{fKg \E;JRHl9SpOlu(\g̪mTS(x*UC`ttD_^?pa tz>c�y"2/2R6XɤSg|cSc=E:׎;oZ)!8O�ɒSlgNIR00N|^9Z1h\ ̋2Y?`g%yGUXY|)Yt0ʆɺ;2l|c=x`c8K&=j0a]hcX>['ۨO?f0ͦ˯e1S1Wo&8z׎�N)$LC}�7WNJl?e � .%\ w'xWlT:ꩌ4")(L� f!3eCЍ/SQ'M3pj9r!vÂu2HrC%6qלOm;"LTq6tX@t q�7 jxdI,�e����c���0���c���0���c���0���c���0���c���0���c���0���c��yCnL xPk#vD�hߊR>;d@38}b{,@W~ţVAb��c��wϖv㌐^̝^b]}ň71ĵ;I5&2KL u11=b&cG] NBR3'HF#)mpHGLn:[k89jVnu%(tKJr[ fO�psj&SEEŠ.g5b.엉nP;MbBr$79UU/ A\=q$3LVWȓD=:OL;4!bv뿬Z-NU3Vv:WX4Y8xwK62X˔%$Q�-mBng-/-?_%";yԉ7B%0fTfXn<W{VfU. #~gFcʺJ{c3K�X:<r=˜EIP [@/ܠ؇ R&{(M4zQ?Ʉ2c}$BxԏeTTZhc 9SE3\w 7auB 1(Q31?Ƀ$?,Ocω/cĭ6MT] Kn쮂6ELS"0~?nPUJ>T \*cdQ_%cbw) N {1qU?o闓=:9?>#�O}N7_b%1;1mZ̦63�ƣ�6I?z!㖄qLӴmJ/RyŘ { 9s 5^Nxm 0I*uQpWY .@{;^ّў> *{ͫ. $b~"'I���1� `�����1� `�����1� `�����1� `�����1� `�����1� `�����1� `C<!@O &a <(c5FR߻"�4o)X 꿜Z>^d +^IGDo�~1{H:A4; w\)w*)^ڪ2w>yLagH3ڈ?33zGןo)A=#Ϸj �\^}{Q>S=pc30g}yD>yLagH3ڈ?33zGןo)A=#Ϸj �\^}{Q>S=pc30g}yD>yLagH3ڈ?33zGןo)A=#Ϸj �\^}{Q>S=pc30g}yD>yLagH3ڈ?33zGןo)A=#Ϸj �\^}{Q>S=pc30g}yD>yLagH3ڈ?33zGןo)A=#Ϸj �\^}{Q>S=pc30g}yD>yLagH3ڈ?33zGןo)A=#Ϸj �\^}{Q>S=pc30g}yD>yLagH3ڈ?33zGןo)A=#Ϸj �\^}{Q>S=pc30g}yD>yLagH3ڈ?33zGןo)A=#Ϸj �\^}{Q>S=pc30g}yD>yLagH3ڈ?33zGןo)A=#Ϸj �\^}{Q>S=pc31 <(#Ϸj �\"muD|U&ǂy;觯Q ܶlUIE݄:! 1#vD�hߊR>;d@3]�mM@����1� `�����1� `�����1� `�����1� `�����1� `�����1� `�����1� `�����1� `�����1� `�Z7┏N��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������flask-peewee-3.0.6/docs/fp-getting-started.jpg������������������������������������������������������0000664�0000000�0000000�00000030412�14605757052�0021245�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000�������������������������������������������������������������������������������������������������������������������������������������������������������������������������JFIF��H�H���Created with GIMP�C�  !"$"$�C��"��������������� �P�  ���!#1QTVab"Ar234q$B6RUsCEeuv��������������.������R!1AQBaq"� ��?�#?og9udPZeYYPC rBx"#sx%юeu1%%#>'5spTW#psqv *\v̽VM\Tօ</ "vf9#UEVZUTEUMZ0uPRKUc^5cj98+Uފ1wilƶZWy΂ٝrԗOfْqG#RF#\7j SBFܴmKc-%IKdRҾ4Es&r`\,Ē[^̳lJZzKN7IE+fpr^: d2_߲ᡖzjfA3e9""Ev-Oe&2[%}eClVUٶEV;ilش4uRW+cHrXFt1Iei G,^ztH߳ ll=۲-L r;>[Bjxآ ʊ֢$ev.`VRږ}eMڻxpV>+7Hؚ5j{U]\&ev#>1u}]� Q.EUں]]%u2>;fr- j2Ѯ:HjQs"/KZӸcxO>::XjGI#ED\ש=}xko7E:m~j�e펵G*2:fQqTE]"3^�֊f�%kkA֌Ve$*;J6:Pcs^2ك"Ԫkqhjg ;#W6%&;U5Rsf7ܬdi4QP4ֵ26zѵӫX̑2;6eUje\ - rPQ /{Wƒ̘hGHBGϳ O_YUj,ItSiC;JW*665b6EkmOTT:݊l/ԚլgOLY̲WB& ;"z&8E_w6zIN2kYdI_8˩#ǣHKga,OnYtE]5Sȓċjܸ#QӫfY 6uce%D׫+W5\MeN'J*ul#?#z,6x29dGc;%Lr9nTbCg'"?[.3%q #?og?[3p.3%q #?og?[3p.3%q #?og?[3p.3%q #?og?[3p.3%q #?og?[3p.3%q #?og9.զ,f%+c"Eʝ*Kdk>[J�wҖq:jG1X|mkӪ&uq_8A�U�jGl5zL}c*fjٳűի±?9Gm5Csĉ#W& n9r*]~˰ZN3U?izU5~ mjG#Pj?xMl,*@HꨗLWF#s".WV a{)::h$=DdͫS X�/沖Ӫ:iVz=3:|~z{*ʒ BI75*jT^:s_i]VC>kJ8!Ʒu[I_W3υķ37Ю38:o!\^m2cr֥W4/:x*Gtv߼9ࣺto$ȚrrZ⺵*rGt6߼9ࣺtoEr+r&t`3"1zӤ~mx<1\qO\u&uzӤ~mx<n8NDLà3 ;IӤ~yR��# �pNVR**`/sͼ3''y{rosͼ3''y{rosͼHN'c?s+?pK`ˣH߼g^о@x(& <wNmyFu= mxrGt6߼g^о@x(& <wNmyzu= mxrGt6߼׬g^о@x(& <wNmyzu= mxrGt6߼׬g^о@x(& <wNmyzu= mxrGt6߼׬g^о@x(& <wNmyzu= mxrGt6߼׬g^о@x(& <wNmyzu= mxrGt6߼׬g^о@x(& <wNmyzu= mxrGt6߼׬g^о@x(& <wNmyzu= mxrGt6߼׬g^о@x(& <wNmyzu= mxrGt6߼׬g^о@x(& <wNmyzu= mxrGt6߼׬g^о@x(& <wNmyzu= mxrGt6߼׬g^о@x(& <wNmyzu= mxrGt6߼׬g^о@x(& <wNmyzu= mxrGt6߼׬zݡauVU}@(& <� RmxzwRDP{qN2}6s_j)%-;\jb∿}Gt6| Rm?xOΨtiȏXcV%Z+Wu8e�zҤ~ Rm?xuO_'[k?:t n2A2z Tz�S%I=ӥ~PH8u {ӟnyyzu7 YReեFEw+xo4':} ࿺o�dÎؿqUxZ&V 8q\F*'Q|cݖЯ]sېRiӝqxnj*Z9˭ۧ.ng5$W*"&*"{ϵu<k%C] Dʈ1NMҮ0G֟Y�[O3>]n?ϸkT1W{W)pV̋dK\a/U [O3O/eDgqF{+ԽJ[\ao5 [O3seEΝ)+ȹL)^tyul.ng|ݺp*9�\uLM#tGbW&8u.q/U [O3ڨ1cX*ebKǠ]*y?:[O3>]n?ϸkUQJdR#1TkWB*EXc:U]*HN>]n?ϸ8ut�>Q%֦0`xut�> iF]jc0>]n?ϸ8ut�>QZ{6[O3>]n?ϸkiE֦0^ [O3Qu`xut�> iF]jc0>]n?ϸ8ut�>QZ{6[O3>]n?ϸkiE֦0^ [O3Qu`xut�> iF]jc0>]n?ϸ8ut�>QZ{6[O3>]n?ϸkiE֦0^ [O3Qu`xut�> iF]jc0>]n?ϸ8ut�>QZ{6[O3>]n?ϸkiE֦0^ [O3Qu`xut�> iF]jc0>]n?ϸ8ut�>QZ{6[O3>]n?ϸkiE֦0^ [O3Qu`xut�> iF]jc0>]n?ϸ8ut�>QZ{6[O3>]n?ϸkiE֦0^ [O3Qu`xut�> iF]jc0>]n?ϸ8ut�>QZ{6[O3>]n?ϸkiE֦0^ [O3Qu`xut�> KPڎU2FfcAuCd,kbZ+KCX.dd5T< C_x,~ntĆ7zTusK{-'S?|_ȟNi��s�NCؿ7.u� �jC$axCmjI3%G& SШxn4NZ_uOUJ:i 3I6Mҕ d9;W=:\zUZߑ*~F~Ӳiϟۭ?"ӷ |nSD W:^6f$,>W;+yS]Iͮ0wB`Dk{Dk{Fsvgy<vtz9mJ\O>db*⨈(7SM>ZgإI2#[.TvU֩vDk{Dk;NsFw<u ]jֽHtQ1j1U"jEkqcdZYkjrYqI9㊫U^z]9t+_9t+_Yngٖtt ӵ#"#IRDSޜGķc3G*2_e1Ř Uu/vF~F~mw1<LOrѾeZ%lYU�2.vl舸.Tė !nh$EsuaSMzȍo{Zȍo{Zutyt^y]IT;DG>U\c�MgoO_4*cQ,vV=QQ0_wDk;Dk{uGVw8O2"5k"5k;}|{yx8,aC'#[~Vxr#[~Vx[k<i ȍo{Zȍo{Zoo%sXA2"5k"5k==ciZ8,aC'#[~Vxr#[~Vx[k<i ȍo{Zȍo{Zoo%sXA2"5k"5k==ciZ8,aC'#[~Vxr#[~Vx[k<i ȍo{Zȍo{Zoo%sXA2"5k"5k==ciZ8,aC'#[~Vxr#[~Vx[k<i ȍo{Zȍo{Zoo%sXA2"5k"5k==ciZ8,aC'#[~Vxr#[~Vx[k<i ȍo{Zȍo{Zoo%sXA2"5k"5k==ciZ8,aC'#[~Vxr#[~Vx[k<i ȍo{Zȍo{Zoo%sXA2"5k"5k==ciZ8,aC'#[~Vxr#[~Vx[k<i ȍo{Zȍo{Zoo%sXA2"5k"5k==ciZ,[6YcXޮʽ(>ĭ6=ZIqTN(#[~Vxr#[~Vx+;y[f]cg"D�o$61: mq,[x*į}:;DRhQUs˫V%!QJӫu t)}:h~?=Dp��/rs�@Oy(10% G u֎;IduK>lT0W!-nȰlW[V-JF&+ҾOIIO jȗnͬjϯJU^\3L1LYhX}w+ukEO'߇lYd+kXek-si)ktEׇ>^z2Ͳm9(~4YmBRITիG*uEy, SSjLu�6ȶ6D"lsX<G2GW�iYeh2vh5˂ YUu*uJw>/mm=AVijFr#2ኣN1윻!.껗9`[T6B<f8&U )]5{ѶU\eMzX&ш1]w R\5ZZ٩n=$W1v\>p/8N;/{B\2u<iaX"\#1Oq9�7B]q( 5-35$5 W#n8Mj.=⾗RUGKn :ΞFdsֹ[׆8u/Qgv�E^ Kv֡V6F:v.kʨp\qL:-7:(--"ʔ5b/Bt. щl{t퉩!>jzGJ2t.p¥`vkmص�Mzf1kWr^r2h#.t֝ײ*bMWG #QcT, r����������������������������������������������������"'S?|_ȟN����S/MM ٷ#XJW,*hըvN:VMೖζ W#UЪ:bx[xa7}H;3Q3*?W*1sfn=T"ݲ]ּ ĺ֌/hTХBb1ԨV rt2.diN5n\ua"]*کhr*EgUU[jN֋S)�,X&Ȇ/wQ([EڅYt-#3#Q{D閅ް7]'iG,iY?J7+S^6SEܳ:d,U\}97RK}B94Xvev(xn?~yXᆫ pVIg[:T#4br#K.]kS[��-ECkOfI_gYIPj _r`Yr$Y5٨ͬ�|nݰ ɣe$dNU{[x>9%7UMOn$+w{:ɤs_DNJ@[Ն BРTSTF襉^LPꉏ�b �7s6SB**~mKRY23F1j".+L8 ǵJ[Bҵ9:COڟkڹW8+[,w6GqLiZ�T]JL^wU e4vv2V Y)p׾ *^ou-k 496*b*8> .uiUV9\_fD\qԨZ`meqZ=߳'-:QץJ**+ࣃkUJˎIr5Шr1'rY6=2س!meK)Gv(Խ V5=? mME}ڕhD2X̼/,k>ќǫǫR"[u%_OjNz%Gfͯ7܎ .*Yy]KuUzqe+\kẺ;¦*pdh2Z̭Er"?G⩭/B)lnMm՝Ih"`٣ S G2ֲ޻5MDM3ڭzt#<q,5´~.бkSU^a6Ы|1i&s;^\G$2׆Y�m7foʚU k\j.}A-NR葬SmˆUֽtEqnYmw(*b`lEqVN*8 Ղ4l:d)kIVX"r5�˭WW_궥 )j6׵[şMd\*mްlfͱ,z 6\̭E^ৃVTպzqn" t!/w]7M'N*h(!A lj`j&13i" �@���������������������������������������������������vs/O���ؿqUy=ǣʩ@G;(|Q~` 9/s_XwV�G;(|Q~` 9/s_XwV�G;(|Q~` 9/s_XwV�G;(|Q~` 9/s_XwV�G;(|Q~` 9/s_XwV�G;(|Q~` 9/s_XwV�G;(|Q~` 9/s_XwV�G;(|Q~` 9/s_XwV�G;(|Q~` 9/s_XwV�G;(M&)\<1+@�?|_ȟN"U8���s�NCؿ5ѱl^PFƲ'&NÍUx KB-FڈHE\}I+}Ӝti)jֵ}7`lR.,vlܩ]jÙpTWس)k*ɄLl4Ҫ�<#}ؗ-KՎ]{ZоǦlZu-X}$bȪx_q>P[veuh+%udZ7&H֩zp%o=%N[J1AlTG;6SrjUY\kiYz{Nϙly_=4pJ7GF#n͹ jH䣶.O2FC=:K3V(Z{ѮF"˂`]Zެb}1G�6=bڧ:,~9#J/κ5`\p �(�������������������������������������������������������������������."U8{CT���qU99�b�ʠO {Ϡ|Js") {y-"U'Q 5=4N櫤cUZȒ"weOժ#k`̈Lmf[7Y̴)JaRHHIVlFȩڵ/<=-e;Ff.fFhzYUjU]X_}[]ZbyxFLKQKqYQ����������������������������������������������������������������������E/Oh~?���9�b�ʧ!?_T O>���������������������������������������������������������������������������h~?=Dp���8�*LP :ӡz#dcQHƧB`}Vv6!t՝Mz 5gmaMMYdgVv6!t՝Mz 5gmaMMYdgVv6!t՝Mz 5gmaMMYdgVv6!t՝Mz 5gmaMMYdgVv6!t՝Mz 5gmaMMYdgVv6!t՝Mz 5gmaMMYdgVv6!t՝Mz 5gmaMMYdgVv6!t՝Mz 5gmaMMYdgVv6!t՝Mz 5gmaMMYdgVv6!t՝Mz 5gmaMMYdgVv6!t՝Mz 5gmaMMYdgVv6!t՝Mz 5gmaMMYdgVv6!t՝Mz 5gmaMMYdgVv6!t՝Mz 5gmaMMYdgVv6!t՝Mz 5gmaMMYdgVv6!t՝Mz 5gmaMMYdgVv6!t՝Mz 5gmaMMYdgVv6!t՝Mz 5gmaMMYdgVv6!t՝Mz 5gmaMMYdgVv6-zX1'Ƣ.r�������������������������������������������������������������������������������������������������������������������������� BuF N6TU\+tjhY\Ϭms� B*RMLZZ5\k;lsֹEk=k.VXscr`Jf`ãGOzg^(m̡kHՙZ,˙1E5b.U/4}tk,J2Ggˇ0~:ebAAKJUL10kvS0}ܰ$dij\ULU;iz: rKeV暑j^,jkR"/Ev'F:Vt7+:ɨ} Z,F1cG)eDVG.Zׇeef1cl6LFFr|Dz u<mU\5ʭVaS?Z頳XƶDXeU3a⊨+$m<7~;J*SFf14 Gzqdx�xblxEe1]"J7z9\]Z3Wqw)cc$66h؋JbFUˇV)Ф^aVKGRI3蚫_ku"V7w^ނߣeL44!.*YSWs%d,rfQ>H΁\QqER∿}=%tS#b5L5"{�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������flask-peewee-3.0.6/docs/fp-message-admin-2.jpg������������������������������������������������������0000664�0000000�0000000�00000172356�14605757052�0021027�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000�������������������������������������������������������������������������������������������������������������������������������������������������������������������������JFIF��H�H���Created with GIMP�C��C�5"�������������  �b��� �!1AQU Vabqd3s"#2 $&46Rr%5BEFuv9Ww��������������<����!1"A#2QaqB$3rR4b� ��?�)~Px{ϔgX qվc7'D!!qN<1+jE�R8#,c 蹝m2, ;Dȫ J [v*<y @jWOnz]ߞ6V??W�'WMM!r YGrd�Yk!JChQF*wt�['k#utݵJy^48vX$1ŗeY&8Dk1JF[[ �T@Z!Ka#�PF ddo*=jR. ,LJalPFFsnQ+qڿ_oUͫծ�?6{Z ѯ.f!Ad%5BjXI(֫<[8,1J̵3 |4>ʎ%Gaѥkɻ؄*QF Wix{n+[$f9 $ep/v#UA:o qʁnG{Qr.Ox(93h`I-yBИCYBX BY%1W1AHY8SI\?e �hbfֱk$o*Z0�"0e(P 4AeA|U<̣,eH cGnjPRpO'<;׬X)\Sf!1I(Y &+nA'.8QpL!7!0:$i 쩇2q{c�wf[m-brM @ekʇs ˪F3%F9@fpx sx<ǯTA4:< qti {u`a9i„xRu Ō GehH Yܛ ͐kctὬ57m,bp2IcF 7P9`r^Jd%pNq1s7 [xֽ/JY>ambכ q; BfX(V+Z-՘U`#iK8EV׾YiJiQU,X3FӒ˞oDD ąNͅ^[pr CeBCĀyb@�BAdwTR] ,@JY_92df3@,2&06 JbӋ](:XF ZL'qSs~7`h\"P{BIZJm"Ob7�^Cy_1pc;\TPĀcĀ 鴜נ_U{�Gy�z9ö7"@'U3*g!. psQt-8oYsrw"E�GpTN3)`ąH?#b#[FicX)w6v$eQlvPM{Vjlѳo{ۛuzmv{=(Ӫ 4Ι#´:1E65%. Jݜk,褝]@ӊNI4H$injIE4L��C+!+ֽ$F(vʎXgdGX%'e2)$.5Ra$ĠR~c4)IMb?tt__ݻy}6Vth*Pc/^/sα\\Y`f?N<a*lҩ =P֧=8U$FHL{`szbi*}af#Q9d㐤2FXbߥ..P6�]mz"QzĪEgioxҹ)cUQI VsY!R^]\Y(ZSCQ@I5mwxm^"uh|1NHS;.x|mpk1A@"TQf D`2:f蓾T[ [g<UY@THwI:ĥGBN Fe#?@$'@+?\z2cצ� � �k߭<Oԯ.g9$hx6aDTJXf8F05-Hw]Z.7Fz`YY� k˹{'i%iQUr ! )lX2چ*-ȉ1+Gf%@P:[/r:^̑1.qq,9hb@R[}&eKXyvBϓ\݅+=-#И~G{B2�A *5If7elN6|Bkan@SjE)h Ր+%řT5HRs$2(porswE�|$ K @$#mccCM ܨ@oZҔ)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)Jq?t(p~?:R3ZB�9�{? �LVkU}ٽ.d\5Fd,+n-8"`2<;gj<Pw +yJYYCAf2[qq<}�$m2l*$a~>'F&{E{7Et=.[qX˞/`�mK(ݼopZM#4sgL Is@ ՕEƋ^豦u@Aۑjݥknm[gd׹7,F!H^^tSS5sS'tm8b7rJ0\~TPi.v M!.N>0:n82y|!XHJe ,vNj%d%R^K ^N.,umVCor,\`p|-:bKiҬmQe8{dyPkl {:48Fd GHQ,�RM/-统ltTCx0 a AG 94NF͋ʡIZi. 1e|-8ץG%qeyXw(=sM `0tfcy\"sVc#e;,"/D%OwM;*r3^q./5hb|JnLMsDQWH6Ȧ.;o",nR2.UA My}m:Cuy�I *Eq.>DhjmYћly'gh%#v1f0w;to썈|"|9\=YcRcZ5&whn #KFA"TKAd\ fhK$IelzZ"5 ]s2dKVp X$wF}l7T`pg�3q={=̠ssA|1Zf@$Q4c]ȸŇ)h4FIW8D6\VxU˧Ao!1_ejme΍15vng@ʖ6Zh׫kQ%GbT2/ۤ@HK}D)Q& 2ܙ $ې0v�?3ԛ1h- 4NL%+!L,.t83Xaljޤ Ęqi <˜9?r?<i? r7A]OtcK2y3 $7:E#}%Nr,=i;8[!`<?e,K`\FGGȢl R#$G(iE>g$tFkRt>} b b09W<v7b]'hLvJU]Kb-4G)ĵ'Bd XLcq2=,J$ GP!HJI*/!2 9�%ɺj#0c <^Q!x{7c%M'\D Z*H%5=dx5݊ОSًCo,x#n$$JJh=@7$jVZQW T`WtB>t) !Y 0ۣjs:2hqI,}뀸7 4ag^ѫRν %8cu6wC4Rӣ?hvoM$C9;!§ \b9MgP%ijd."nR(ng�(LmN1'X˖\ dd`Y(XPRH.ٴ9`l! HJc!\1t$ҾR 3#հVc[Uk$=dCrtD΅ ޠh HuүC D]Ȍc%9.!lv$*0ȺKZ ȻitwIct8"{ꁜۊ.7E屡捝QK'^Ot&i&eëe%` ]`e@$O(S\Ŵ{m R 5lF",C4Hy.+&xiaG* me䐙If0GA%Vlc~ v|c-e-ni0q4Gcf˱J!9 :);oa61 $Ϗ cnGw5txkGȋ[M(c6oU#lrq-+VŋroHQ,OLe<fӂXYD⽵m AV$ttaN,nɝLr7m ۍ14<?@ 6+x1BैwJSdXǧmC'NޘDRؙm5o{up {w�E:~L֍Y-&֗aeee-i] ɊC}kٳ{%򝴄5J<b|Bڢd<69s[* ZtB !FQNaƌ%![תڷ> VVݗ_;IhL,9!hhQcL$ t7aO,{=n,*& |L9#7|Tۤyrd,!h̖#UTǛdpe {}nm'�2F-0͙t- e)X% ؟%% g4Q5-KnꋱbTsjc ߻uK. '!ے`'BP:E=DD.(�AnnEak�'WDhTh*(칩D´ch$',-sT2#PnZTkU@fj];_4"6IjKDGAtnEaڤϧ0?VWSU铷qPaeܒVچ0"6ܳFp\dVl>xODU'rIVp!}'hJlZI6tO S=890D]l|.ZYuT?o>g�6_Z{|՟"N܇Eg:3J#~#tqɛ֌8fTDy QjFۯ-NQւܜ[&ͽ6] 3t\`,)ǘ?CK iʁ&l a-mB^䭪/o`q'g% mi/. AL*#*j]xanMN'pEm6Hդ$:HEJ/txdh="d]3q~`Ee—$X$y4Ęↅ#bZFW.}[a$"-7fhs:-Y%֏,6LIf6c [eV:)S9$<<[B&~4xIx?pO ӤrkAKӎwd4b8͝ݹ`T*D&מQGW~fJ`vU/#ṢC:, lט VLjťo"8 ,7TGN< 5w}'c:dGOa^*HYLJ {3iå2nuߒmsXd�V{RWǞtqB7ITM4f'iLꇅ�W!C P-`o V+3o:ו6?N۫'s?@=/prN2Sن=hI^l\Z H$iI2j)(KFUtvr*gi%d;cdJ־>ƫXeMfpVcw;zYY.Ycd % ʤgs!GhůM"-ox'ʄO`p+.䦈Dw.,2^]kJF .6K%ͬ-TJD'/T(o.􈄮tT?iG`KPS@P $LcxPN~Tpǰ.涌Yw+up#a4??6 2G|4IL0G("'ᒏXR;Z7.=.;=M,*~>ٕ,X KeoK@".B%ӌF^}鐈I4\Zm陙IɭWRmAߞٸ/dD9P _+yo_>}ڵV=�Ҕ)SJR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JRC8q?t)J6_WE-k6�뽹뚌qV5ʲ6ܬ;sJIwqgs,fWX;zpT`�R7[/\_P{st{kl`8ug8egjP늰ml{{9y믣mWug8eg>O_fon{kٯg~kk{nU^�YgfϮWz͟jOO5bJz=fqz=fR_Wѯ_׶ms[n _Wz͟ŝF}?+K:xwi_M=3ˆRJk.Gɑ2:*gJJS9QI-d1q1%-04bUmq=HmZ }*ti J3KbU/gFﻍ^Y6Wh޲}|fͯ� >^Axw铓vJMLKp,hFeu�`' aU! UZַ7Ett[VVujoվt{� ۶�MW<j޲YQ��c㷧c*+٫^gNw6�M{jqz=fqz=fS�k_e[y[m^^ ]5_Wz͟Wz͟9=j~v~n>yjW�e&ͳ�L,m,�Jm׫=ߦV\5uNx:mժƯ},?)Ư}?*1#Ӝ˟i}꾽ݫgn}}nn~ϯ_mWeg8egM*ɷm~U}Vۯs۞۷m@qz=fΏv�U_�l�|-P3s}ެ׺mZjlzU˺=_e56W<j޺YMXU5{YgN5{YgJU]Wz͟Wz͟XU5{YgN5{YgJU]Wz͟Wz͟XU5{YgN5{YgJU]Wz͟Wz͟XU5{YgN5{YgJU]Wz͟Wz͟XU5{YgN5{YgJU]Wz͟Wz͟XU5{YgN5{YgJU]Wz͟Wz͟XU5{YgN5{YgJU]Wz͟Wz͟XU5{YgN5{YgJU]Wz͟Wz͟XU5{YgN5{YgJU]Wz͟Wz͟XU5{YgN5{YgJU]Wz͟Wz͟XU5{YgN5{YgJU]Wz͟Wz͟XU5{YgN5{YgJU]Wz͟Wz͟XU5{YgN5{YgJU]Wz͟*Bje OLB )`B77w" |n?/sy�)J^zT;[LK+ X6e M5z( Aw!y@(jR)U>pJAqiH=.#M)VJUo;Ґz\GqzRKSJU[|ޔ?ҕdVý)~)8w 4Y)U>pJAqiH=.#M)VJUo;Ґz\GqzRKSJU[|ޔ?ҕdVý)~)8w 4Y)U>pJAqiH=.#M)VJUo;Ґz\GqzRKSJU[|ޔ?ҕdVý)~)8w 4Y)U>pJAqiH=.#M)VJUo;Ґz\GqzRKSJU[|ޔ?ҕdVý)~)8w 4Y)U>pJAqiH=.#M)VJUo;Ґz\GqzRKSJU[|ޔ?ҕdVý)~)8w 4Y)U>pJAqiH=.#M)VJUo;Ґz\GqzRKSJU[|ޔ?ҕdVý)~)8w 4Y)U>pJAqiH=.#M)VJUo;Ґz\GqzRKSJU[|ޔ?ҕdVý)~)8w 4Y)U>pJAqiH=.#M)VJUo;Ґz\GqzRKSJU[|ޔ?ҕdVý)~)8w 4Y)U>pJAqiH=.#M)VJUo;Ґz\GqzRKSJU[|ޔ?ҕdVý)~)8w 4Y)U>pJAqiH=.#M)VJUo;Ґz\GqzRKSJU[|ޔ?ҕd/m ګ|ޔ?ԓkNe2P H� *,rN&@DBNyAQzRۃAqҎ?)S5UpR}vCm�"UCI<1MS^*o|犸us�V�qj>W_V]:\X[VSҟH3̟"+} & sgX6X݂@JZjLOβ@y*pzF+%[Gkk.n2876ʑIJEܫm TΨUGl.&KTpO""&X́6c_M/*ѬwM!bq*H- m~j`bcnCʪ|gi9 jQG!N2\|oi@bKͫr'bzP7bDXkbyyKrbcՁ]z-sks{poýrXtkK۴bVx c*r: }HND;ѢC<6TGKY`y0 O) [p/hutq\C`ߙ-fTT gQȮ͖,q$W$u9ńL63i+d39L M"co:!'k㗂,BF6rO<q) HKR,?hPq$U{2oBV㕁Z+GwMa[[ P+wc{V[ )$]$-mk|犛_<Uպ|fh+!A CyhAuhEրWl95I@9F6-);Zڡ!aHK9~s)Y< |뤖:cƴzYgDOHKX.gFҁJ/1]۫][MY.fq狧; pgF^9cISxG]H%ihvxH$7 Vi@X2Oe�[/<T/h-1tfI2~XH\^'Hxp|FtV:)XbSJvrRhR6!"z`ŇJQ#3h,,nX.tӠ$AH:" 1j%IC)iϣچ,4uՌDG#Z<~ܻ[i<W[jQVgoy22FBv+#|WNj8iRã.ll#.;3/Rݏ ܐssd gP,f/~KgHЕn|Tm)Ō nv7pHҬ-J3a#իdnf)%Z t^e׉Y,BYX !tԠ=GuĞ16W seqqjмjE4A�{,G#b[y,|犛_<U Tپ pǔ3\Uxd;[rɗ5{WEːadƶU=+6b=㌂V:35 r\a\V(5ZSW-6kҵ>%(U{뱄-67@WhkhmQգLAΫ:~ѹ3֒]ERc`-,˰(䍸o|S|犵R=+3 &EǗΕey6B#@YK\u*6LW)ʯ-h� x6AӧH v˱,7�S4bWv|5rVxO1er:"NKeMƪHvR|~zO`-쁖i=[˿a}רaG2#"(9yH%R [p6Zr iaɸ6# ˝/*o|Vqq:غI'XPLE[Y z̒)I,/y?MFƼ-Zimߠ@sރ{M j̎mnJ @,r! C_[K[gEfh(c$Im aIKo|S|犢w7xT7x'~XS~XR-_M/*߯/8߯/8Ko|S|犢w7)R_<T/⨝bMbJT7x'~XS~XR-_M/*߯/8߯/8Ko|S|犢w7)R_<T/⨝bMbJT7x'~XS~XR-_M/*߯/8߯/8Ko|S|犢w7)R_<T/⨝bMbJT7x'~XS~XR-_M/*߯/8߯/8Ko|S|犢w7)R_<T/⨝bMbJT7x'~XS~XR-_M/*߯/8߯/8Ko|S|犢w7)R_<T/⨝bMbJT7x'~XS~XR-_M/*߯/8߯/8Ko|S|犢w7)R_<T/⨝bMbJT7x'~XS~XR-_M/*߯/8߯/8Ko|S|犢w7)R_<T/⨝bMbJT7x'~XS~XR-_Q/}ZD4V1mޏ_~yb( n</=R(p~?:Qt*frAndlb[�1^*UwXxDZ\FË0ա6ñQT Vc/`P7nˊ[�XNu9>L\#G<@Jf8!$#p6rЭ鐌B2.奸r wfJH;yiIo3{:M_ouqjKY巐RSA#8{[kȺ7pEssYU+O 1Xr_0>@t bɓlAS"!u`GkReW]̺ n&kl%A$aZ(ˤM*PMӻ7H}d8p9AKJRC{ڳ%$4䤃p?}>雉vl]�=p�V/SuSzI[Bzpܙ;Ou3X�9ZbRJ1~=!:JWLq91)@ hcy,f%Umrt^;dq1ݚ Dq&iBeX)j2|Io3{:M9) og\>)]OQPoFŐ Xn$;G>ft,ͧٱe(K! W$aTs�Vi !% ē㈋bbȍ{B@œ!Zpڥ_0E|p� '4i7ggEon+1m9Ϯ/. ;=s\yRV䤃pv7�԰ %0 d?3A`}2!ȶ- RP=W)ndǛHYZ+FN%JE 79AƜ=Ѧ1L�$aƔQeeA�x�J�Ca0�Xè RAθ|SNJH;ykNI$I]Fgy;YKNI$[E10ƑEGj�U����czkgG HXW22<7rhygtJj6F儜$\Y'%VS(ŒoOSqZncX͑W!󕼳 *{"T#S2�6E䤃pv7Ց]\ <#vPyV)ᕧfB 4$<c&cdt-ͽR[ T|xbEdGaN`E jG( ˃1L*jq*fkEN`NLt3Amo8�4&& !o%$4䤃p'b1`l V:VNaf[tg;N̈J9e$k G5VbPb$s]gǚ he 6ʛ 6-@#zZÈ"T^d$O1hJM.ue.zĹG5 ֨%$4䤃p<Ii -J9Aܬ' Tp%\J$ 22sR6eT!HխؠV@KvR]B'r(0"jqLT,i&pR :QM|RPҒRa声, �Bd~z��oZ9) og\>)%$5q=+M$̈#S#@rrNp�mWmEMܨ2͒q߽tmyo�mw䤃pv75]7x`o0?]) og\>)%$4tmyo�mw䤃pv7ҕ}iߒfurRAθ|SJWM7o~JH;yiIo3{:M)]7x`o0?]) og\>)%$4tmyo�mw䤃pv7ҕ}iߒfurRAθ|SJWM7o~JH;yiIo3{:M)]7x`o0?]) og\>)%$4tmyo�mw䤃pv7ҕ}iߒfurRAθ|SJWM7o~JH;yiIo3{:M)]7x`o0?]) og\>)%$4tmyo�mw䤃pv7ҕ}iߒfurRAθ|SJWM7o~JH;yiIo3{:M)]7x`o0?]) og\>)%$4tmyo�mw䤃pv7ҕ}iߒfurRAθ|SJWM7o~JH;yiIo3{:M)]7x`o0?]) og\>)%$4tmyo�mw䤃pv7ҕ}iߒfurRAθ|SJWM7o~JH;yiIo3{:M)]7x`o0?]) og\>)%$4tmyo�mw䤃pv7ҕ}iߒfurRAθ|SJWM7o~JH;yiIo3{:M)]7x`o0?]) og\>)%$4tmyڒr#Qsy-_%$�� (S),\-Z^HIrxL!N|>ZTi Py`zRWۃAqҎ�)J?_u4F&H XJ@@,Bm)=AI AW`i{JWxE^q'4XU0ׄƜa#q? )V*Uw$}'?qHO~JU] {xOi>ҕbUU9Ha �yNiۛ[XĐ=܆]ZµL"XB'Baww#۰A0;w&�Vf]�aZ׾^)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR p~?:Qt*gU^|s8X긣4��X{[[ktZkի^ݞK|9_گճxS-)lK(.Z|=yƉFH#,3UHe*ma?/uoY[qUbb~.,FT�>v{^׳]<=\ZVνz:Z]tN/샌Lŭ1B%Ӆlk[ dNzDdgǙ׳qH`Y.r-1x *'%,[4:xgLxKk\" e\=k:] .' `Q˃*ra`Hfʠbx]1Vu%@��PFv;{m[ZH /3. 9J1Vñ2ccf`bqY I t%!mn2D"9,T>B{sX/94F0lH !13vM5!/w5$h(ܓg A$$NF{21�xz6}@Ii{__mexmZ+qH+9\dY7J^;&yXsbXҳ4ɚ‚ə)g+Ը!ʲD%c̈́L첹QQHH$i$yu&tJqV9B87]Ȥ/?%)\\#&P0ېxITO 6m}>u_^sUz%oʯo2Zo:gV_sz%�wyVʪ+!s�XǪmV۶Vƻ W뛧V LF1aH zlI LMPe7CEK+$BpXLCbo{{:s J-6i^iD(6Hw wI"/xm2}NZD"FDyeT(HʋpYbp+lt뷺o{x-mux+ռ]ZvmURyJ? Kw\/edɎLNmD$L,v<q/ub]LB�ҡEJFi<hh[l6(2y4lď.2x0H/cV6(BC:K餳޵,5ɱMFfAbKc#DX#D;DU?Q=ͼ1^\4yzsB.g\t]PH[$PH]mٷi!s6y-13slFbJu􀆡KŠmJeL#cjme\Qyyg|(52. 2S6PtFne\ӊW)X4$49:]P֒6 ﬓPKVd)X[#vVb#|Nߍ[ ɬnZ'DnQcyRK4e NVV~ki9W$̍zA"rA^7&cW"$" h9; k/xTA,֕`CpBմAwo} +ڭq^}]φM-ٯVGQ4R=1+6Џ(cy~^qtL,%2C$%u-ERI 2l7)\tի߮7a0:nH c\ި+V0E(F$}BUd_BLyeQ�7kV)oIKW<t{dҀ̏]\'\g<LFw5H] hMf5$ TڱMpe,671Y⸙�  li2\Zw<bèQiP͆cv:8Uk^ksUj-N'̀υY hZ+XSѦOy@aM^B Rm'_hK'/7qÛNc1 DQ6e$'wPM͆EK"L-ρu{KX;#t-f@pwlXD+"\/<}IU)f7湺m[f4bC<E/_գپSflUWKe2PΦ2U'̵ |ːqdR)Z&K;Jqa@Nb37z4G6X鋺)Ը;)DAnZU'Xnh5 h?KlB{[xbNV9| ̪/lu]b[Ļ5)CHҍx.!9@ՔY)JW;]5)JR)JR)JR)JR)JR)JR)JR)JR)JRq{_~jun~O?5 L ȦU5GbNG5C31PIH)Ǚ~{[mIL'8MyvD a^xVVl׶GOÐWim㦴*RPot &z75vQ �1 .ei"cUk%tHUH׉ K,SiPOoGIR vsssunlOGZb~/J6K I$GAL|K zIci)=[ݤL X'1C2%$@a,Z3$33ym} Y.΍ &8ݚ(,RR\03mZ{x$G^KJǣqeeI]{z@|soѕxLX-wG,rAe=n'I*]\Z�_/Z(e,Ì"G#|I13jiEJzLnR<3NJg8#wHj{-ePk!@c҃H\yk4Lf'H)Z&�>hȡPU7y ,2]AN>(<2<P-% rN3v^Yܽn4Qo,d ;'rtEӉ]#&wfa,^%ĿLG/lŤcVq_K^u|_rhݤ}-0,7d4oL.[Jfyb]]Hc9 8JT>!f].LWY9j�slVq55x/i{Է.UZXFIcetpHaFluA}ddv*#y Iኁ p�`2Aծ{\�ӯ/W>oܨr2*>cJ L&^�W1JiTk)4J�YG RZ5tȯmϚXx \S8YbFK]{Z҄[~0˿^~ՒJR[9]v={}\MWׯ^^G/ 9sX̣ȱt*:kСR : +) qUbi]ƳC6<<vх Z{y<>,כQi³[4r ')]ܪ63,1H@$`E[K ׶\%?VR+?G TVגI#}nzGG<εɭ&# %rBrFXS"t9G< *itcE)&ͨ駬QKa em-Lj$jU77?wSӰŬ]to,n-഼+?YLXĞJK i) XcEyDSyqq @K S]y;e̕&Y0!;۝ IXcqjq$M4[)ĕrtǒr8]8I^/h5G�"3@QaF`M84C"Nr�,vufe\?!${jFiZK-ZSV+H{i"'f2T7, "T.zn<ai5MlfV0:SXH!RUe*Fdg .bG]kmT_ٲC>ezRF"f|_vLyp3hghkg,b&G˭x6 Ju"bӏHW":E$Ybpfr8 a/aF2Lܔdg1!J'%\ΥTC:$Nl,M0c0eUU1«r&znci_-?8:-#MTf2 wBdP1XT[[V{:<?kZH搬)5y:7krTH# 6H$NOMTĊIU5b(t'H5j̭8V9wq[TFZ%<PTF1c9H*< ^Go%Z\, "8K<qEܖߴʊZsҫ&j)zvm$шRWbI$p-pխZ믛t<5*e=*cYo<B'xD4hqIcnKkWyS!g :,nRC7ۭpqbn7"̰5ypx>zl9m.CGX[j02">VW C^WK蕠GC9E^M -2f 5 ik߯eX%d4\ ,2, 'qj^Ri+Q #OIk%"X D]㗐7j2 +''\q$7f(B,yT)JRnJ8󎔥LqGh��c3+x *=PuOk,Ȃi&h> (I$CNN^�_]W$---%g4QƱ`-=ȶ5{�B[֖] G`׺T H cW\;кA{MH@ؾD@E fujC5G0j jX18MUҒi'{"\XZa`8lN9ϯ0?a vz ņa,NlęQWr%%e6-j@kz"ILy1$O.ĕ?hLjַ9MrrZIu1\[k.PzV`XƜ-n￧CV,R99;C|sɩwH@�|�p+xDȔlsy@fak4^$&` F/Bu 4Qɯr  H@(LD+HE}fw�jR/{*Ri+<<y+[u\y3O8r2~uXU$2I vp1D_Q*D*UXʦak0d U`FK j+vQYmXTO3nM1>E$h8wNKrnn3+<:Ow":Ow"Y$@H$ ̢Dp DG [[zroPw.AK.Fa wFQl%Zdf:B858?r PYKY^BčNVh)@詣f2 1 4DMH_;(DQ7="p$ILIv)(\ IŌ/?{ЋZp?{ЋZ?k!cVae@w,(^гm^m]ǞtM,.O,=2a. $7=ch,. *oKU9AB±9q&*:U l &<lU6#Րơ*>BYZ[{[HQD&TYe.'y~ N'y~ TE_! L\d`UpPpE_.NwOae3of[X$=E2m\700xRh݂/otEZ[emXK9�=U\E>N;[YrW+HZoRU`smֵ-*nn'( i%ؤuy!p $udxcA$ [$lw9ҫ:Ow":Ow"pnDs[bV9$Rz3a L!zsL(�bGCmkӹ;+ \)owmV⌖^@Re ހ(oXx~~൳ rousS`3K2Q#eY ]3egtIsimq$OS<%02¹*<ٗt<D]Yzr7ȱ|j\ ͭ+hi4CI8DѬiIoKB2[@σ^�B G,fnMn__K-�a?_+s!j2<jSL!ep#D ĕAHRAu:^q9kKv( ѐpPas? ّ6 k)M w֒ N ɑr3$/FMcX1-m @fe2Bb�3a E� 0�0}ä7{B/iä7{B/kF[D3 i$M:{6_` ogilT@R>`"d7IJ*V<Pq*Jp?{ЋZp?{ЋZjJp?{ЋZp?{ЋZRt*Jp?{ЋZp?{ЋZRt*Jp?{ЋZp?{ЋZRt*Jp?{ЋZp?{ЋZRt*Jp?{ЋZp?{ЋZRt*Jp?{ЋZp?{ЋZRt+qgDٍ%'n=Ct*綼5Sz,  2,B L0 =cbyIOSA[\RH;iBZcIn_ӇIn_BEq4ArȁTXu kI; EUbT�(mkx%.rnEmꍽNW%p3vZ-5>0[ɚ%'gv<5B&L2ѩOfEX !u11,q\^!4NXbdYBa`̸{O[UFS.cvFh/nfFhXْIYY PՃHm$y#Qಶ˻QYz~߹g&?oMr.-JʜSwDyyȚK~ XOUB軀$mO,X4A1p.t۬:R F+n\.,ä7{B/iä7{B/k$bɨ_+.YnI$rI95iZ[MpF݆ݪpc#nEmQ"L]X[eǎxuqсF2ne27(EVqG0/u.V$9N]0"QTWb4IrVy o׮ä7{B/iä7{B/jGywygfʝ1!$Q4H#E J01bj�Xnnky:-ѷeW8thE-8thE-kV�����XU'y~ N'y~ J^mERr6Xy(3]Ց㎩^؜7šQ%\r$77o)ä7{B/iä7{B/jfXY Y"hD! : @ U WIG<FM ȲE,R)WH2<n$UE bf98N(H77WlBJak[QjƌW ׶o%s׎jړzJ jGB&u{ Ғ#FJr@~~z( jAV`kh|#ZͦۚɘT&u )D," pKIjDae%ː:ZW΅vZ(Tù4"m1tsJbAmh4Y40G#jI[6 @$ 09In_ӇIn_+C7q,Gs2 ݜ+LdqS&a1FVѴлFӝӔ,CgѳB7!jft"ZmVj\waY {X� pA6hc4zQmð3;7JHw" c1VIːfXaӷ)HCRJ+O+3SQ ; ېHefReJHK SG¯7jk,(xcp0Q 9`42V0^dduJEȕ?~Ŗr4QfۢF &3! %- rwDv؁#E%D$(EpsG][UBu=AKonAgILDs+%t} KӈPUA;TL.tcf8'D+#^H[ykOkPgjVj(Rs q1Qv.⽋.ᴰk6&{E*Y (Ӎ]ƖTroLꤢQArmUf~~T\^$+5һ+31I A$U},v6pF$6DQT= _|ՋW^Nnz櫜:Ow":Ow"+rtd'.4 (NI!e�E!LLP+;Ջw q?t)J)JR)JR)R)JR-m[-\Ҕ)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JSU몔*t�8JT)K_߫+^~³iyᇵ \3Y&# R*>KQS&rq$c @Xqk\kdT5'f] ŤJ7QHq>u%q{ vU)^u=�V�o v)JVdBƾF Ē ɰt=<b\,TkXAr Qp0׌H'+�m5� 6j9Sf�dɟb }uƻm}[kʅiLݯ"Ly7I NS6<Ce1HlpMPӽ8S<rH=wj0F"216 9bNjdv7hBpNkgr mպ3)ȬKd@5o)٭*%G }Q<ed'PAx?͕Ryd2yd\dh{v>1ckt־??=+º ,J�h!�*iH_qyh2"9,/,RB7F2J[&nl=C؈hؒ'r)G^IS8'z< `w.py=)Ut/}^z渽WMu_gPN1 ~/ukWmk\v~�Wek{I\Ӥ#DM%pT$cQ^B0/ЁBcFb@IDXl!P 7I B(bL#^EghIأ.H4cjGgoRq(N\I5jXĆ=*In]FVPZ, ^ =mώ4[[9Gcw>{y,�t%l}"ܺ^ەT(劬Vkճn'{[m+Mp7NxFfTmJ -]*Ť˚/ eKo .Kw[!7J Jcl$xEl8 [ ]fFI< 3SL,z=6ŕ؀,"݇Ƴ4E-$[+k7ᦎKrѸHXĒ2ϟ'⇂XMW @xmZxT3on$BGƥrǵk^ustjճUײu9^9 &ĢYl~pNLYY#r* R13s.1t ,m 7k@x8<#r9Rv($JG1OuH2QY 䩥ɞ8YdM8qE4Z\vPAe{~X{}^R;%+p1ԶrRR՚~&>vT^V[Z]3 $DDu+IgR(SJ+)JR)JR)JR)JR)JR)JR)JR)JR)\^{W5իkJRϲ]\O?תI]%_fHiĿ▔\G=:yq -<>:"YmT*5jI4Jw5{+$X]boN8/=dz3ZuAܥ&1l͙Cc/L1I vw:=@ m<'_iVL M)IkkFdmUќsw)4Liw^ВI$bHOp+#481inWϪ]]\J/YĴ{Ö]J}-tjbu2{KYdr4v7ig=9bWFdζzw,1:cy?tp9u۞qa òݢBN 挄fzD]xcWR  Hn"GibI'rU_i7d3.apT#B%L0R1WU_Uko-:rŊ #tX<-8ah#eƓk,'|qI.%mJ&5l'lN%e%5-g.rr,G$ܰ6'Bs6d3g oaY/-K8lZ4u SҥJTl�xYBZmyVxnxkU0ʹrȅ Z�[I& k{Z @4DYP<@L{kz:=ο+I }|^~p&&r32F&myٱ-F (Q9ֶJ Ek۫Zm[9usz4ê$6FVR}3Zu/\oբ2:<*܌$k^t|�uqm55׫JR)JR)JR)JR)JR)JR)JR)JR)JR)P?nJRi_=)JV+D.8Ē,JҿLZ^ԦE7hnBµraQ�+ɣ)2'v# )%ݽCy (v 0Ԉ1", ֽoFҔ-m:׮kRxI=6RvF~[V rK0ZpC\IXKijrzFXJVN,XV*H,IVRA2~jEH$gd>D9$MC1( 36ܜ&w1FfOn&6J_Ԭ\N 2İ$b;22+| nU1]zWb91?I|jN�K`;%bii!H g}RؑkSyNlpY�`dpL~Op{P@ |ıX?G]/(f>kėg)<KZ8u{[dBJ[He˹֪~[)YH噘$'{PUF>+ʸm5q^}w|o~jJR&8Hר|BFvld773%RJY#x8729WrFbqVXc6fJVl8/&l/VCqix\=�ڭ�`[cϫo]+4kk+-{S,mumȩ D3t[1G<7]O{{7W*<In<Ko€<0_sGa}L*5h̗D�-vqz*5塕 {T,^5{JSTӇ&ih*q}qqQ!)gf7 )D&40HKkesů^pEjxzi<Uo9:W w<y/UQi7n'thĒI* <Uo [Iimod#j1۟Btðf&!y)kk;>H Syi;!EKjn4dg f4 @ ^"۝"IGƨs4тZW5K d*Ithu,o=?6z[^�of񗊮L}T ԻKpbo1n/[7¶,6K,W Ɓf;Xm$VVmϐcRWMJR)JR)JR)JR)JR)JR)JR)JR)JR}WJRM5p.Ɇ\C5Kfv<D) SdHp<e0&H܈l5vX�)q{m#'c 269 gBקh 뀙@Q8#<(i {q[k/m~zWRW[!}:I%~ڵK֑X#HKU9'ʹa{B%=A4*1[ic@ 51q1ynFLqJIsZҙKbd)]Ͱyn\G>t=F7sѱC]$2.omN#462n4M#$kKʞޛE<D2/MlmGMu:o<m[5~8E~,5.;q.疐 $F=%[) 9--m/VebSymRow<B'K\29WܰqYpܝ;/ i}Ȼ8XHh%,χKu|bCWpr728 C.L҇ GG ŇP鎘+ s<hX/RQqԅrO&;Lxѓ6LF`c:~Y xl>Vf+a e2$g&j>K缟8^+5/9bp串;)0\'FFsc.kțl/-㐜gMeyvۣe�F�k�5o2b v��m[v,֐^:'٠&-ltbBm �**j*sK'U>̷ӑ*ti5I14`Q0ݴ$V{AH0'Z' [[U6۟JuMb�Xx$vV{FXU7LT$H3^ƙX=c8ˬහ0 "6~ q kZ=>K)^]zԥ)JR)JR)JR)JR)JR)JR)JR)JR)JR p~?:Qt*f&GÑUrBz r7{յuֽmڭ }CO�}eҕNd rd r*5١bE)uyn|v%$|qr.<%R@ۅIZNJc(6;YDbyݟFFFؽ_x#kbSSe5 ibPn$ Au*ɶAɶAn/{lkͳ5mRNMvBG/NMvBG/Su*qԐ@ie\n -wڐ T3*@X{rp*3lSlT$,b8%ۑsPmqw l^b #^ӺE'LmH-i1ݕ!KV0<x*)V(NQ-hC)YQKcQA9`F@8ڬ&d*XFe@Wd㌌MvBG/NMvBG/XJDazv<I6 R,rhfj#)2Ψ%iэз+mK:^U,m(HY Eb˄w!^/{ ⽭]g5希kq a1,k+efXK.TK "Xo-ehYRex"Xfl8 &;!&;!`@ L,a0^Ј ]k�ֵ#0~F A0GT'&;!&;!{9}w%Ҧ6=u96=ubîXc3^5fbPçRYqJDc/R''ڍR7YMA@c% ,L#Z 80,w+Pm׵He.e PCnN;~FmNcO�||`_`_'.b3ivxIBU"B5듶9G-TA:Felhv �XI(Ѐa2ֵXp+XA=W{^k A�>C}q?G&;!&;!.D3 ԗ10n%A;82(6縍,m8geBqn:ʉ{8{CmZ+_^VgT�WɶAɶAa�Bo 9>dnH l V yH [:apR�A ikR}vPaj 8A^mٷm;MvBG/NMvBG/_xP8Uj@ I!N1_^z{^ְE{~-7J-{Z{M06e[L/a�;0 맮=xלcF?1sӌ ʣ96=u96=u}^",V#8c(I6+ac0۠kUv QtPؓX@�Dn}^{Psۜǭ sd1Qܛ`_`_3x5J,PDyW(yEC�ԕsDB *YCDjEN2\Ж5Ւ $wc 0\{"hrWn�]g+lv4<mtÕ2gd rd r#epRkacʹ|�ָmq[mjS&>ْ&Dm,dje%sG%>!K:W$Ih,qT '(HJ,p|x3?Ѓrmz9~rmz9~ꂇL?8IJK|*E(/1DEܐSR~@Qz! ă g 0Bu} B-BY`ppYIʰHpP99;&;!&;!+L,j-aUuŽ"٨V^Sd: W' oJ̥^ZrWӤ55 U V/ :и ,gN=K`�q4 \Fbpr{Q`=EOmz9~rmz9~'!ϝ?cRށHJ5:}g1&vHF[psIRG%(pH2KP%謜ܲ]Q �`nfB"jf*G##x%O�H=dY?,+Îkd rd rՎerYqm$d"^8)Om{,Ŕ][s;dR;I9 vBJ<F p0Ep!um{^@`qS؃4�?P#d rd r7JR96=u96=uMҔNMvBG/NMvBG/St*lSlT)Jd rd rDYg怹+h<n5ȓ\J%EĠ8;-ʜ$~:r6 Հ(ԞVvӿE6VxfURċ.DTn(QVM ~v5ȊR!eB^89-Jy))ϼ!'V8NK6U-΋eȯOmz9~v]F<1YW7LB'3@B.gkj"7.\Yo Š oA0c#2bL6LՉ^P[U7*H;F#_WgkDj"#mū,R1HOb9$:51R(1y1:hZQ<Xke*XSp N" I2O E];#`?ʎB1ϗwE Z@Z0b]Ae�+Ú'84Z3,FadOxYbF9#R If#r~iFs-ahop{Յd:UXR+ ?Nz'8C-0ix|>+-ɍx.!k#1)lHJ% k \gX'.K̓fKݟ٠NLM#Nig.0rTyb4OxV=Ve+ܩ:n#qF;7oۻ<mߝmmpqkd rd rReiB1{э"dq<r*3Q ~*>{ʲP$-AۛSqVFsDJ2 r鎣0iGeAVb]9L a�o I"et'+b|c( KL]$�;19,s*]G%6{pNhhfo*x K.InPY~`2ɶAɶA/%Cf&V)nNF3_e/g'Tɛ`չQMHJ$CZ=mxݿKlKèf&O=@l%$9rw|ϗÈoSv%N0J@搜Qeʋg߱G,2 `𥏕Wnnw)eA`IG�:rmz9~rmz9~oJ\Ւ%M 6wge,% %aO.^Վa+L%Ց,yq (VGJ%bC'F3t^@ۢXJW+@ȻTkőtpɞ %skJ0{lfE]FYF;H=[w<mBp粓 qڳg&;!&;!vEx;diQ BHR${q!8Tऔ%Ct#Xh(R $;d6P 'قD%Y X'uʓdZScq^4I5`.ʊ9fdP;H'Vs¨ ~Vm +5mz9~rmz9~ꚵk{^{l/ѮkP@#FAP`_`_Jd rd r7JR96=u96=uTZhѲ=gvv? vK(tX`A$2}c܇]3D+)2#5+9$|ˆm{vfO/e0 P] !5[;d<BA)2F'2'V-r#:Oi݋ /mRd<kpcm\DX>l`lv5}d r�\_5)̚^yE3W ¢E)luYGRVƩ +.BF;S~Q5lml@*oytm+| g�D[X(C jOc{lsisr$IQUX ʓ50j72B$E<rIʒeh\ (8$Wɶ �u96=ub|f+/ȴd݅3\vVb2]OnIHMpFY DPx,@`ܱTF>J[o&+!b=5amK:ͥ"vGd(]\R@* LԒ;K)JWm2H\G9A0+WL7iP<~ƥcp*< rmz9~rmz9~h1שyձdˑg%Sp,K{RJy/%BRDmg;(S3Y KvیH4up܇pN zf_fr&e>V _y`7AC`E7^<Yk;6|EP2@MvBG/NMvBG/RIզT 2�2,Єv�X`!굫r 0 ƶeaR=~ ɶAɶAnBrmz9~0HNJRY �#Q`{ 6E2�𿐺RۃAqҎ?)S5mbOn9|ַ=sTB;X�7mm)XO0X)ëpZW:+N3Qn]e;umշf}Z/('G$ApHެwtvrJɮɓEȰ7F%5_<~Fd!~m{x/~mJxo{wߦ)ZwrJ%R DiɑŘ܉K g9/qwyl"BF'쎺z۫Uo�7[Fn0кZE=\@U/ 6"$`|gIYIRU=8挲d,+E:a " ѭjIG4T#iL:U 4Q&șqy0% \0dac{chWMVÇ$B?c͸v@r,*� a3DVs#f,T=ѡo[_n�^snkls3[-WgI&pa=44h=1 {`UiQ#Dո-]Wl.icVNԣsv r!ԜoEyJ@ ԊRȻ6\E{u*8rFCu _J 1q4:C(c':C Ѫ7& 6d(xa?]f>;Lb1[y`3>|D JۢM^�5T,ih0v6QVBhYm*cG_ WKhy$fB>һV?I`abƣM-1 Y'njjnFPIH BL"r ,Cj~k[fwٝfwv%K3I'<o PD#45PUB ���uo.zj{kqۯxv[_^ݛkV�O޵6l78f%bH췇"2,2ED=BkbɬJ&d.Ɣ;ӮIrsV ?"$xq;!nm5_0ɲ`2**"Qf1Mͦ?ZJwիVGׯïz9UB G~�{0`  C-I“*ؐO!}{r#i_|?D ߋ7 "ʤ ­y5 4KEs8y<N^̑fHZT IN/ =d3<ҥCAA%ޟ[\H=&`KyFlc`Mqmگ׫.%Pv,ɞ�({ P^c$?]7s0#G ř@mn6LtR1$X.<S([8d!e3*;*i1"fĨPYZ[04jmhޔ%(`ny/T1;GF_ߌ PX vpn,>� �צmZW:nͲFl@Ql3v@u?+H NA9db}0;][dۑ K޸!^\cv1)b}'aDN6= dԡ"E^[6i@LL65"jp V//ҵ=3gɣ͓)uA-2E(/|Ĕ )ƨiեVwt)\ڝ"qn\Q"T@J40�W �t HСB# LXIL*b ,ɓYe�� ,�l2˨bBՍfXm2,B0L@n�"3�2s_j vcM'b K3;k]t\t#JZSLk:`Xe)C|u}16@zp- WJPXĵ#c}$'y\OnzX`EEG3ZpQ 2lm- Z4weD6ծ+z}:�dV(0;n6@h hcR6*#FPS!�FUyaĮ˂E:.g+]6|]sm%dI,x .uX&dM1:*xE< As5ʜ$1 2H&l 2R JhSQ>bni6;/fP( LSz[ճV]Z?7>ֽ}:ꬣvRnTGp$@BG`q\˱aV/t('!g^E΍ Г-43c<7OǓR#Rr UJU4mq5"‘<re:Z09S^)t/J]2 l`04h¤Cp{5C0gȁWhFam{vڼRղ:�7TF>eڻ~"D@'�ʰK9z6h4XI$vđDII&]Y~2Js$dOcdyu`Knu;I2<S7 L~*?'OY)!5A 2&N1I@f.b|i#7Ɇjs O6Z]ɕdv(M}'(V**E2ohO#{,V nJ-a�d^$jz~oHVpjC{I+ƫ3C8YTF0Usj .2Xüe`UNNZLx̜ Mqf[B8&10efezP1n<jV` \"F:y^vtWiXF~[BJl!k̎}#qT#Ϗ|ǙSلCCIbRbd�F׶�O\nm_ѳں[^ߢ\,L62F@p|a. HeȮ`xIF,ξV�Mv+jΗvc M#xL~o Nc&(�o"cIM �OcF#ʄJDEbȘ.`I,Fǒ 6%jphLrLd.,b\-$uD,4pwlM"|~_onv-V궿'j#r6K<\m 9`q12$"mEDv |`SK|3f7E1 B#6#B5>,pl%Y9TBG5"ix2"upqF'V3G6cq -.=5`'ɏ!ekCKI1Y].dI3/F3n^gNnmUG~NbHg(HFW|F6�=>9�-lg9h+‘-e4Nכ"Ǡ^e+&Y$3|vc-ϝ�k3n6֦df=IXޜ=66X7N p\ŀ@!qVW�կWE~{vm_W,P� ϘǥTǞNy} f�'ʸ\dJRJR)JR(oʕ}/3K;~17a׬&6bK@bw(tٲ�2¨zS |(^V:"\WP`4سFݤΌ`A%hhVV&K}HCe\飚Qtnq9 +vUe[կë]iϫ涫[nݿMUt$OIeyW(GBCWb՚hdg/J<4J6F܅+xZ!Il/o7egY5v+0t &Jz%Ѩ92hI1ZsF2؆R1l($ՓL"Pֵ&22a%.Hg'\'V*0N`-cVի綯n[WES֘,O�g9`<c�qsUF;x፭UdLIV? �BM4}ϊg,<hϺKa-"YcGcl.=&]l~(tY-.ozd, =,PXE:6 ;ѱ/O`MO$f6,*B Nw)Kљt-.S0ƚөJ-Vt_e5ZomۯU-X)ὖ%.)rq'$с'fw23<'xH�9D L- 2hʹhJ$&l1[y -ޕvvC]S;y)p>b\dKˌ"HI^TrL�v(ȓ)A[+j=JyTI2W$q~[׷W-m_76\MEz4ShDUU=IRc L2љ=e}nh 3lbIFTaבĎ5 l{uAG$r@SǓhܽ;ur9#6ssAn6Śq~ɗif9]O0 QKcNP{u+G@$p -HZ>UB(N ]r i!Q"v7#pj\ xed]ǖJXx}+#`u_C9Q8ec&<ueVK A mɌxC.{yQĵnd0%{7Py|ӔNZEcrs;NaǐvyÖ^|0Ĝ))sPeW禫t۫_7Vίm#l.rtF cfEOTOv\czMrHp&LuT3"H"X;ESXҴDMY.)]CK=KUS2, ʓq siq"s&T8FTK3?n[׶ˣ8)~}<�WNέw~}uͭoOwYg1JҀ r>$,x$Dve, *IJȓ6+`o{6 R'$'* ��'ϭ)JTTҔ)^:Ӗ 8XIF=d\](5=_lgIqxq*:3DnI{/\+d \U(Lq2Y+³PxhDqQC(1F$p\jw }w:5x~_5}}ui,l,lUnmunz:C kh'̊‘j~ԵE.akH-' t-#H3fU<U-I}j-F`PyMDrgWu-g5Bƥ {ibKU3qm56f|zÒ1604άej88a8&�E28m2A}e͵믯n͵%أ ɔXm"UPAFX:#w&Xe@^vk{[HX4[%y dZW&FŪ�4�\_ZOvo6`^=°Ch B 6>q#!9j5YDZN>+4Hb,&@"Lպ7[rXlqea NϒgD+ٞSՈJg*q(.ALrvG2:<e2aEӼkWͫmzU<oG u}9eYd]\Hb@LhY�wMYieKvחw"QхEKKx-cR A I-*8BNvD!As鉳0Y46k]UE&,niƦ8d8L!1fQ!q9:fW%ٖYnAƍXzM"Ea\.9԰oc*d,΀Dք7V+φMwշ_V}}1lBgUQ%u&=ܑc0UPyCB7^V%Օ%ȍmQw2+I ރ:_Fbb*T%7! .F+.2BS[aGr 1&K2Nɫmt~~ZkZֹ|A3 D&q$3f$`+t;_ >гD%b[#/!ڥ ‚@8g.攥+ɯj<�g O5�!t~?nJRo~nzy!&Zv =z7r&lql+X-`nwخ RE2ώpgg}|^JU;>;/eUz)T^,ﯜv|w_ UꔥQx 㾾rjY_9|5WjytW:ҟQx 㾾rjY_9|5W]ݵ)T^,ﯜv|w_ UꔥQx 㾾rjY_9|5WT=3ڕE2ώpgg}|].}{-ktlRx?iTn,ﯜv|w_ UKtzw?.x?l樼Y_9|5N,ﯜֿ뮺l_Ǜf%2xqjeT2ώ᪼[�]mM*eT2ώ᪼˫\Zu~kt[o �eT2ώ᪽RێNjgg}|8 㾾rjl?M~u{k׷y<G752?w?G2ώpgg}|^jjiTn,ﯜv|w_ UԪ/v|w_ S;>;/JRY_9|5N,ﯜ)Jgg}|8 㾾rjT*eT2ώ᪽R/v|w_ S;>;/JRY_9|5N,ﯜ)Jgg}|8 㾾rjT?AҨY_9|5N,ﯜξ㳞>oeu_]_WFͷ۪Z8?o߽R8 㾾rjY_9|5W~}5�OkR5F2ώpgg}|^[_潶s߮?v|w_ S;>;/~^J^QsZgg}|8 㾾rj6_]s�_Jgg/v|w_ S;>;/Jg?ҦY_9|5N,ﯜ)sڕE2ώpgg}|^JU;>;/eUz)T^,ﯜv|w_ UT^,ﯜv|w_ UZ5m*eT2ώ᪼}?U_ L yX N-:r!^ָPiD ^0�X-q ֺK2ώpgg}|^JU;>;/eUzWKN__kuۯN;QE*eT2ώ᪼^O-\ҨY_9|5N,ﯜ)Jgg}|Xp%0J2T\ BܭW7\V],6 zU_R5׫^onJRk趿|N时oWUJ³"Mj&9 gwf pD�V}!LR{1Qn`znLÚBuiLծ .qlZD[cѸ!*D@(݀V}GĥNHĎ.XjҿLZ L\nM ׵ʸEFc&Hclj ;IM51/ [PYC��iH� b !׽z6m]5)JRבIdyz<lUC>w)_pnLH pSƣ9�RQg7'^I"NjL H -=Pc>촒*|x1#ml}!rVC&5-/iƩ4n6ݱ2ٌHnsb_;S:VDm:K4r2(,tprvH$gBtK. (rǜnЊ7:^<54=I1us}<&+ QD:d`^.;}mtxiF$p+c9@άɒ-)no|J$k,1=?>&+$9.[12x7JPIaBHڍK ::b1( 8*\4BC2ht#HCF!7is;H:ZN̞ؓqC3rcM5:IџF !vdbhO߁?ֵ)^;VF gD WuIJe@[#U_"#r@RHgIePm.Z q@la7.},!4ut,YehK�Am|kZ׿e߯mwJƐ;$1 DĬjҼ©Gr�cd;xcS4k,̱I PFXR8e4A* R]]\^^KVΛx� uu{կT;W3iQe7N7`͸%&@+# 'e r\$,1g Guɦ6l8̏*LIPN9AlB*ŗXɟ }Jp9j5<EB-$F;r.:;]fKƏ^N1os+W,U}շ󃆁+"6K|q9oa6ixHkqBȍB;,gN2kإTi`7EU,+lۀ9>VB`6bۊrvn" 6�@�ᓊ'OȦApadA\H& >%[8ɘ9fqjѱ"J$\Z[Ѝ*-e(*&v Bc,BXak:o}Ȇ ,0| |qKKۼLi K kf%k=7<JTr-*ɫӸL^kU,|A'sm|,H�qLԈ(wNeB7)Z2!�A]{;Pn $ $ɅXL IŪ,[%LFƖZKhœ<&Z!/DݘiӉDB�v 1+kkCnൽYd/Mi\cԿf䀬4Yiޏ Ǝ(5+-D'7:ƴ[qXv�6'.rL1ؕ;'9qև@[N%¹ @. Qh`x5c9oG,:c< �Eզ)pX ,IܒiD ;2zR1 69b|04c4NNr1ڃCk4pFHeOf[DAmo)H)m8>Eq\Y+&LZjA{$0$Ō<nj 2`AFVEOʙU1p4mO2NzőeZ*<f�HYF6E,V%XI'A[qɑI2bFt,omd3/V\/ܶ%mH \jnGiV&h^g͓YjwG$;x$>JŃEz"SSflH%@m$0@Z9rrGH,B>co2ಂK[pi$tJ#Q|ifCq|F!nA] \f,o!LycFk:cv(i)7L D;]3ePơ 2"\%ae5} JԜY #(jtubYHC@dA3^1e.5qBJdJ*,Je9YEcl)HfYVPbرTXG'/u0ibe@saFm22AK%z>GCh ҎmF2{3I_B|!)Z[fM$"C*IL7P>1i-X2v4V<#u-l8l`)H[@d!&NfҎ"G(jh%K2\=D-LclNq>6hE7+T ws j0JdLj)"topd6-A&ZJ304 `_%.6S Wp .c')s~5^{ڱ4T{tx7giˌ\.9&6-p$̻ 2 ;LBAUNrYMwfcz~X.\1Bs�M1{Fʟ!"g8$"eu' b!sy [iDdqBy#j(ὠu p D[%p`Lijpk@M3 W(`l8Eh!" ľ<L<+>Nc⥮E>7Bؽ}R˗bT*IB21dSY`M48>w wK M%Fܞ)@  nB^\nRs 8(7I)_2ٔJ+O99i ܍TGKM!p19G%,l$Yj 51bGug/Z=-9󝱌hҥ{t SG r)aQv[ǖl˒ZqsrYDɁ#tw|h6SwB %p/V_'q2LenRg<ЩN�ՙ@Vd3#wDZY KIH[“c:dO=d3qD6vCIʌeip3S\yx17=88NJ'R#k|x T!A41muY7 & �/wNx+H2 6r0bR𭙩[ZfW-wgD'NF@H!0\.ڂ�tnKҕN1 }I8RO̓Xڠ,@;���)JR)JR)JR)JR)JRiCfT1E;дO*َ|[[d!3# a(ԞC.n>Qg nDdMsNeMϑfq`ѫ\k*!Ȕy$扸׉]c%kq!F'E&LM1>wuQ$N7e\LDZgWroRB('4Q%&]RedE[^09} ccoP j|wm I ^0YZw1iҙcl-T\U &.pCW aY\9mc`Ees,A S)rp~9l2I!Y5':f\FmĩZ.҃OJ_XGd2FfΦ#W (RFPHs,9:' 1} 䦎=94(&AK2) *(ɂ2l[;Ea쩑Dy`_rbotM1F!(MK�jw=^ .>HVwb27:=0y A-(kf#qH% q;<Zݗw9e0g$񭡙6^#xETB9q`-l,qn~y:{I1"2fչ-Soh&65Xb9^ .V$9N)=)K2x$_ ȓl\ BN)\x:eR~42&vFXL<담Bط"HLŅVHXtbώ]dHH&|Nؑ Mo6#ʋ`{$[g2,tva՝e zJ@P023#R�)Byvu_\f~~y̏jGY)x1$ nSӞ-5-х:BlpVfel\erh~$978c}a8V(Jc !aҜ<A\|1>sH=yɆ&ͧX!</}N%'@bdqD]׎ 1-&͊L(%Mhh- E42ő,""~e< ůt1V=dE+el>w|pn7UĴwefK nw3=H60bfN`SR<6E29,0rT9R.~=#2bƹ[E=gs#L~L̻/a;'mӤQĉĵS֑d$nuU(旚Fu3 G6YG!Ш\&:,&.)fs >.D 9=Z@9..>Sr&',l#1*^@n1p)!C5; LLneJX#H6<BlT!!FGr+acym&8dFx/!qwv|ni_(_g8BRE puxHe7Hle!Sдb9_6X#K02),M8lu8]^?e&կ%8;̝Q<mboB�LH陕5%`&z6*V 4?őF'b?cd05ŏ`c!lA-q &Vacy2fd3ȬCMnc'F,#uaJD(Z2Gg-0S2SV()\W _0=69̇ Lױ3F m{:q.Sh2h,H ȥsHSʩ?ú؀YF!ڢA9KX-Oes2!m |{8xToyd:M"k I L 5Q? iɚ/ 29/\MHƌ3KyÙ .=G$C!yȈC_%8[ZLH{C5pYH'mUMf0YJk7D5Xք#j˔P#  a2N#@ێ2ڶ #0G1 |6hs08&=ij K(8#iƊ6$%A.T<=ʀ-Hsрv״{k_gѲWkZֶW5qҰ@B=€<s)Jʕ^V�+oe©% 쑎b$-uY!խO#LD38)=@0cH<k9GNZ9Ű]d,G\!9z-pLT*@)I5 4?Eug\go �!kB WXngh8\%1i<VG"z|k,8&8qY:GK+0-jt=}ᱣ6o"o&"=ͤb,-] ԬXE+{3S#kSi$Y5vљs\LkԴ$[ ^5,O H4E�#LQ!s9[RB*Á4+Q,",sq'疓DnK[syNhLO/] }!D!v=py@ڼV*c%,NF-57An U`מٴ ɲ9c$򤋝[୳c@+"6q [82S$lD5H%pP w}1onIZ 5{ZM[dH=H7"(�[PAzm"4m'8gġ:7 a_tef$d>SkOj3]M-A$KъY,H!VUTP@HXrYY02@m2{"'kqt-i :Qb ǎ}3ĀsP82'yb"(ʱ`2,5yRVUrPӐQ5iT7F_-L .JXgdG_A!e6tFa "69'NJ{v �̋QCcc֛~MLS#M ɮ߲/.,e+܍Օ{z!DWGJJpnZRY};GPj֩mzsZmܱDvU[Y|_&}q_={i ڭ[SnKƸIcuEmiL|n3Kdl肈%HnG=F]Ghc{S2kOM6H2QHVReĨ/g2B b$԰Ne)fZDEթɓ+ DLa*9!Hַ"hkdل^z<dD%*cT+#BJ%G-G'HwG%+I%Ac #F~4≉2p/\Bz匧\# Yn% T RnvToCH6w q{܋M &韈t-1�MrZI9fV mAb=?e"4K蹦cI L J\~Sbg_/<:>B2_(k!Tڵ==GU 5(,i ؟E{v%IY9c&no RsSCHN v ` 5sI^θ }|s$ܼ\V.5ڵ�Q(̒\(g ),hZ4Mr.ﺲ2 H髥 9F JRiJRgۃAqҎ?)S4Um#Euӫ!QbyA2ˑn7Vٻuw6kRhcNMvBG/NMvBG/JVKcNMvBG/NMvBG/JVK/}V{mz9~rmz9~RU۷U|Z�_cNMvBG/NMvBG/JVIe]-W5viɶAɶAJtiɶAɶAJtiɶAɶAJVu[krmz9~rmz9~RMڃnGNֺV4d rd rҲ^uZ96=u96=uM+%^mtֵmz9~rmz9~SNcNMvBG/NMvBG/LcTcd~Y"mÛ/�6}vm^^~s^&;!&;!MdbF{6j۷g5]{٫Wmz9~rmz9~SK5xux:9ˮ&;!&;!}j1s5-_>g5ޱ&;!&;!MdV4d rd rԥdV4d rd rԥdV4d rd rԥdV4d rd rԥdV4d rd rԥdV4d rd rԥds+rmz9~rmz9~RUeWk:sׯfWܛ`_`_JƜ`_`_JƜ`_`_/O+%s~y6=u96=uM+%[_V[:v鷃汧&;!&;!;}%[k_W?Evmٍ6=u96=u)Y.mqkj;y{y6V5d rd rԧY.96=u96=u)Y.96=u96=u)Y.96=u96=u)Y.kXדlSlRXӓlWB/VeA#Jv{uv]cNMvBG/NMvBG/SQsk%_G5c^MvBG/NMvBG/Q�5XӓlSlT?JtiɶAɶAJuk~_5z+mz9~0FLRbfAbqB#/`Up{ڹJnJ8󎔥L+�Kwq'�״JV>~Ɔ1">;>l\n)pRDMHp3QILRnaù%Hx'}dT,v&Qt͉MZOIT~M)9A2�<(\2L;6pZ^kuL#q^N.Cs`^o.۫o?N-)YJ{k}WͯJ_t+m_ezyqJRU vT:{}V<򉹂m,`q]mA﷚tL!~E‰'j[N:dEI# G>u~(Rqĭqn!6?VWZys$Q2Gs4 ɸąRGjWV5孔Qc)fv,c L2$6KQZ"a.^z:з1fīnID%cVNFmc]ZPXZ'v-{\^k6KtxʏyYEfx.?N1b ,Y|8W68ZQB;kӓXߊ=|壴dRr՗ XV&8Of,/9BPBi 쩄> ս7yYnQcHfDQ/,ZH"mo]s Z%au ӫɈ┘wF*m̷ܤIZVg˯mujHRMB�#{k<!<.mɕ][Ze:8Ic(,0Q4e7ר@. ղV8~1n9;ۻSU@dXs`9E0bn 1a-c'~3HqvG^/IJX#PJVs6жZQl& ,-.Z;&Ipsz΋XZZwt$x MQ"LdhC f nF׵뵆GoYIA%A#'FHaDWϼD fr뱥:yҥ)XW'itY"ax,i"9-{\s^C#.Q떥"Ds jVAf gvˇwݍI �+l#B1EuQnmp_Ppʓ<T�(7r|$͐ԡ|O#n kU z✚+<qR豐@ 0L?@G V0|Ⱥ6žpz{?6c1<[*d\y1P[(*i`| AY %=p2;C86lRcA4Q'O#s4|b;׻l ^"x@W# nMb  Z\Wk޵f&WW4|Ÿ10\聕Bơ rd--9L3<)$K_ oVrxhg:sɱFp!zZs2[e1.dfƖWoF&*J:Mq-Fg<F$[9R9jZpTvExWĹF҇k|8K Ř wA0Xapת7~q@2F+Q4 D-3lfjk۪Y?1$o7hD6cZF[M+: B|Mh3mzc*s!6(BIƉyhFr a)ѧ3"L; Brö0t:E l76C͈lܴ+EWSwKmڤ6w[âorUBOYsF ]Dlr\ش+Q L Ba92w,ieִ,ꃺdHa5T]2z(M-O#B)yFʙRXEH(%;3"AԕRtC *Y"'%c|r("ǒw|{'O~I\d@l>©k,% ga\5%o  sF.ew0D<<1<,|$/1a4M+Zo7nsfpG׺B$ʒ*#388]FÝ mJ$DRx#rHq )8(t";w6t1bR,TYkI0i+ -{ZDgO:v|7DfTijVx#>3i"ķp.yBT΢tmPEV3< t%ͳctAɎC/F!z'M(5LJ;*l?!Bpd�lm#+@xU" 2Aef!W(ގIж�%UcO�o!Zgpp)N3 N*j�{z0"X"{붪ēm 9q&%ctז&8Jc&>zy}H/vUq.񷤷iiFJ F:z `3Km96z[MdVr,6BBCKOOPtTJg's+FYVB:N?ðZyJǠ&+6s9CAB1o_#>S9&!K*1]x+Wf G"@T<n_�2G�K%1$AP嘭y<D 5IqtYbU3~>4/IxL'8E% 3 tij1h3O.MDLwŋpe8X@=p uVVAtHal:1gD%:l7e%$F. SDUDKr5%:JMσ2z v*1$5F;qOF3KU#F`;4K9*`@׽ WyUs22:.KB>.Y#dٹI] dDV$Q۲Riw&,A݅=.Ljbn-{V {W7&v5 K Q0Xa/]ǫv \#9XV}uƬ)oro'h§!MtDiay\A  IKiGVX(s+V"h;9d;:'>;Src'1L3 !Aji>P'vhz$ilP+Ȟ̠ic e # )9 DK=Y86ʡl#vg0UoK-oNM:ĵ T s JH ¸k*Xw{nm`k]k G&-[@- ; k7^zGxASw(n&mcZ~ɳ UY0l3bG۲ކ8$ssHOƺ%&؟FD1�޶2[T*+W e#ݐ}o#i9٭%. @2@ &rkV݄[[<P ׽amn{Xam{lUbߌPT!IbcrKU9'd 17&6wFO<rjzǻrtY*A+U5奬iɿ4y'$vS*P*_3f$bXi'ݥ!)P�IC,6Ib4u GزJ1rk"`ǰٞ?lU]TI. &:xݘe81*䘥T(7:D`X$-w] r`I#a,x!w8Jw|Bsn ގ,} 3{omׂN__^u>֍'7L"m(Lg ˜r6Fn{1t&I3+=7&-j[eiҨRF4l^ϯU鵯� z` g%,Te@V I Xp@UÃrg�"Ad,�ڔcYҔ)JR)JR5ի~tiJV)Yg怹+x]7IFp qNeN`lmqtP=r9#[z%a! 5* nwhY{<Lx>J!|eU# R20rpfN-kR-m^BL΃D1r! řLgj")eP\>l%0.žB&Un#0>S0fDطFݤƌ@C%pxfW&KN~fH:1D&v(s+fnIͶ 5oR!wY(�/R)&_Q#ᲀ*-`D,ϰ4H/tF́#2Bl¶ÌLipV%YAdU\Z%W\TIH~\e N'1|ۋTY RGF SFIs0tkcb<k=B˻aco *@bM0gb>4L&$Ną{,mcXӭH Ni(|,==3VS&(n^?4*.?N+t&z)OHO6)V*k+. hL{�;!xVc;#�P#{ղv$"? P1&,J dАFbVHbs&)-C̘Wb1$hkXJc?6үeɁhsݚDȱXɢ4晖F&r 7*4ǝVB_hZX. YZ{R'YI|3ǤIk pxv/gKc5l7/E25L@V�[rSq{C^_qLω =ũ$3jnZn(y3/qSbQT& ŖesՀhC :a8yd0UWz+LTdȒ6ϘH}\dUVۀa-I ˸-<b+~Dx&5>@T}秕e7,7a:9Ym͹(V5S6å Xuft+!2|$Y(-'iX-y,>91u0\ݩD = mshi4r'vK6ri`oJ@;3!$>0H$b<>GGL$k. S)HC ا"LH;,1rqedCQ[[ d)9"AWc$!89m^3rBLȻ ܹ)IibDN,3 ew@Htf-ҥ5Tq pVąX2 LQ$!\7 im\xu٪c@2RX @6wyd<F>gnmrT i, kiUMSHL9)Mc0Ƿ\qrE),|<nb;8֋:9!ٚNTjMF_2eZDFS}-bg53JJX1L?yj/QJ1w9d֤u 3[#dA#.'#bN6lA]w QYP" dBI$nmB*kjK1<+ (13#BmHHf-):N蔘Q|!rމb1DLl #Ʋ3 DfϏSCknUGoI29.d`,imvƸ5 1CH6LٲE6̌r ݹdFell{pR*j**/$ɲ;:Tl;ZĖ7*NdfETi gj9zɡqke="u .Ni*8 F;.U[3eXw6BWATo i#^@ ڑPGّbșVw|7a"8*_dn$47-St) 6G*Sa'L| 333'8_҆KđR,hzƫ qjT$- P`4q Z;q֎ȡRpXP(fƗ$++D|XZB$8$U6&ɖDwyx;CfƬl1e$/KcqiM F"Lca 'qVJ"E̋źƎ{Yp;\T@>#(}0RNxW`zsU{ o&}-mV趫W4=;zV#8p34)JR﫫omX+e6m[,P"ש66F rI; r mgT-صp^D?)8ݒLɘ[1aP] wdgpˍ(\KFӒ:XMF=c$ ySJ Gě&3G$8<8Nbw@=!nBAU4WW8,O1rW sNAhcʸe0ƺGtz=fS ϔAR#0:0l1&@5Bf^73jPjZM{mۥ[Jmdi#I&7 `+Uu-nkk{)# 7d7 tq;"!V +3 p'Y̚|hU&㼲G5RVȩ*-Z k*ԁB'3cUbŸ=ãi[J87J{X�҆; $K~j)F0yMDr!hWtv-g5BcR}RآKpD@ 42f֌xR16.4b88a0�dpXkUljt= JLԍԬ̈́"Qb@etħrj7jZwG&K o%^(ˁ"$ EeM#1v|j'*ve>4<9߉U- RZ"#b.n.P 9}Dކ.:V{sR"sh{jrJݍ'v$[Q%X,#E9j+2YDZN\].U6T OeI oc(]rL(!8`=;dX s&48M%V8CypoȲp8˫2U+t`rsRX%Ԭ]^Z64�%żGm=īgr6ں߉+RK].S6"{KI$ԖWrS4RDb4d<Qխfˑi&S֕=R]8ĩLGOy|mg/4UvP\=1FYAKvWp 8<".<ZuhQq! ]z2fK'] ,ţ)0Yɣ0yY4Ǭ`9 r1O肼a�552;�V?蹚PLj$)[R8{A'ͬ$Ζ5EIڸԴMhfoT�&)q9iL>$q#E,pk+h8n^Gc{E6\,w2Txg"%mN*iT�1ig#ۄW,B܊6Uֶt\i+RGh%Ogw^zIQ\I*4t-!嶩<<$I07tkєxM\6wik} D-&"Wd6bFVGuRW݌|Y#OT29 T0)^E{t8�|/.jy? +q?t(p~?:R3P'�o.V]v�suno�:mφ-mV;~%6IiDb;% �@dWUg$x/ .}c.-E�:oh_GM?(/̧2mVׯn{ׯ|LqO>)?(/̥*[tmkT2S}�4Mϓnnn{9_^[5_'OG^^M}[*g~Q_N)G~e1ךT-7_VjjNkttkmujz⟔}S~Q_JT.6zڦ8e⟔}RboooULO>)?(/̥*6]OGϮn;*g~Q_N)G~e)P}M|>sy6jS<SqO>)Jճg7Un~~ ͖S\SqO>)JM�=q{կëgW5k~Q_N)G~e1J{]}zZFޗU�_]\k~Q_N)G~e)T.o6lm׷]~5?(/̧2 o߯j\>N{_o:o{S\SqO>)J}mm]ٯes6g~Q_N)G~e*�u쾭Wm{m~n}{m_]VPx\H$>- eP!gǓYFsˉ/vq0,qZiq )G~e8e #@R}H |3r@9�Ƕ>;3_?kxum׷_E.u^ Z⟔}S~Q_J~}5SU׳{:5D2ST`v1?(/̧25J⟔}S~Q_JT=*c~Q_N)G~e)P)G~e8eCҦ8e⟔}SJ�E[U~j5?(/̧2n饭׳_N⟔}S~Q_JT-kU_m[oWS<SqO>)J]s|۲kWׯg׮e⟔}R ~mUUj\}6yk~Q_N)G~e)Pj٫o.=s߯ۮ3?(/̧2m_U=qkjWGUk2SRSSqO>)JLqO>)?(/̥*stxm9xe⟔}RCZگ{mkͺyn-5>[2Sߠǯ>� {[W7ͮ�zRUbT|,&>FPR 6pL˸+2SRw6۳7o&t^kF}Gӯ]O>)?(/̧wݩPmߞ�]m^U_ksT2SzT6m|[ݪ)G~e8eCҦ8e⟔}RSq_]~<SvX;smV\۞~붫jJWp~?:Qt*f)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)P?)JW����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������flask-peewee-3.0.6/docs/fp-message-admin.jpg��������������������������������������������������������0000664�0000000�0000000�00000141675�14605757052�0020670�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000�������������������������������������������������������������������������������������������������������������������������������������������������������������������������JFIF��H�H���Created with GIMP�C��C�"��������������  �p���   ��!R1AQSTUV Xaq"$25Dtu#%346BCr&(efsvEFYbhHdgw����������� �D� ���!1"A2Qa#Bq3R$bCScr4Us� ��?�bg>s`ٙԈ։E%1xTu7apdҹ1E K^ bT"6es閌dvFhFҙFJgbn/=:@rd%̳wTR�OHyK,qX vjR9q,vM664 #ϘyeQ W#JwpGoJs)9h[$̥1Ƒ'f3蕐 F& &.=˒(H[<v$y5imPX*%$ʐeBp%33GceYHRβ""Bcl $B*HdQѣ bїl}cyt6q6DiGzcӛ4n^Q\?bndy?5"l6ʢѡ wL i9թj]^ڑZG*,/w|KGL1SuH`/…D2XgMYd YhV;:S&l0HV<pi~0x ;dǹ"].8ҧH|Qr; 1p))HV&EsN:8be`H*ZNmzQn*r΃ab6V-cf1,ARʨ@Ty/dx&$5'92k^ e7uRSV,^ԼfhJ.FoX!3"${,!rʣ4:ФĎ-۠tI8+ir^s<w)�HM򜷢]۔�3d2Mp͛~ضO`;59~Ӷq C;HƝTC$Şc_&by_3x$6 9abg /dq̐bb2BK}RvV(nZFQKtnl$D,D(ȦSeb@̙6Vxǻb˫7"R $]Dd sXKvX$)o ̻oq"ܦ`vI�ܳ;a+mv{zKv!hٔ~8&8Ϧ1,=Ip=N #qҧGg+Glr J%#~YF\rDf~Mn$QK|&K8&(nRy*@mR{j#My_\M 26S݋a*6ܲ Πc:]P*4{ {E(Fq]dKEq6^kX^ c{@{_aavDomVk]ű{B!^؄W{v6\G(h+%H gm(hwM"dCFzVW2I2h~"IV{j D؄)U殑6r8%1BfRԅQe}eXL3ǙD'/0!/Pm#܅ pOj3nd’~8q2 ^[v`QnیJ:q uϟbh>nl"K 4~V_@RMk;'[BZf p1 &"CR jk! Xed豲dq92ƦlfjyP3Ae'cXaGX@'6�Gs'۰ހvݷ>u)[t 6 4{p( iQ֙EvHHBU8\'1V"NFɀ-|MggD8k'ł28<I$3GhL.[ʈ[d-dP,ǐأ$T}čtO!R݃&G^LxvLq#\xe=sn mqGMn0}((z{:魰Ms4v8Ч삹0А&b60'Oa*a/PUF`pG8#8#ЃV#FA88>QS n0}(mCxKo_ԽZv`QnیJ:zRv`QnیJ:zRv`QnیJ:zRv`QnیJ:zRv`QnیJ:zRv`QnیJ:zRv`QnیJ:zRv`QnیJ:zRv`QnیJ:zRv`QnیJ:zRv`QnیJ:zRv`QnیJ:zRv`QnیJ:zRv`QnیJ:zRv`QnیJ:zRv`QnیJ:zRv`QnیJ:zRv`QnیJ:zRv`QnیJ:zRv`QnیJ:zRv`QnیJ:zRv`QnیJ:zRv`QnیJ:zRv`QՅ*vr[=ۇn8OϯUU/VS"S_dmoˆ�ǥ*3~[wmv]u�ַ~-{Wn&z;72dr4_`E #i)a#~p̝)Ӝe1;,".WVV�-ȑ|=/_=Rg6N2,=kdb<slYMl?A0X K&@]\1FT +Fܒr:J`#dʫX8O:�?�OsWSۍoMӿ|Qi lKo|y-`ϲ(ܖ_i0ҍ"]8Zd'4-@24f _1Cc,!g9ʚd:3ӝ{0= 94c͍˒ȊF֕IWu%A$9pE!#* )j;u#Y: B6IA9U'g~ޚ�~+b魲RkUbSMz;! 3I.W(d ~GE'4ECT1-Ygswk T l{\ARnz\<~XqF"@̤haԉq>TF)=B2DgP@"9Ssx�`U7ënیH;z[Ue 4FXb~!1+02XA:1Ǹ:[.iZ— :q#&M 6XiǕ:)><+ [ aNJ?�yYFPd4⦂Us|BE6)&nfxvLIl�[cmC`�p1$ QˀNk 6G\=mnW{۹zxGmn2Ru3ĕ,L}:@ P41,L%ȒRጆxã݁$4axrhI >)c"nVijXev?uHdNB1,bTxg^e(N "4ꤠwHJXxe Hc xSx$!r;8#gEC1d:NuVP{*R>YIƍmZ18߃ʝᨏsdwf `NGΰmx6})�GmZ,=.l23#lal#*5F"gk;bٓ\S\}Ls#K8TƼe=u?ϲek{R8F gvmew !k~C)/|K[?p_Fzi͵0uN1A$ $a;S>S?\qr>;Q%w)"k$1 ܄0MUxb;1ӤZ]]$4ectwte? �:JWʁU"z4I%J7\ cyL %5* _f1\*ض66@381\21`}:O&^4$GjWIKI&Ko1Si!F-{DS<0Sݸ�Gjm,Z`hLn_ ʝ.&0LcB pH\#PlI]EvJcDД>k{9:חmUƼ,ѽ)9$a \R@rWF0>'qe`뽭pjaݽz;]~Oi}Ʒ-6I d2c6T�8?K?CDB~3^ogfIjVRIo !Cs un S&An�on/J|�X5OWQJ]66~GTm{ /b4_%tji^;ЛMv<ҧ{?7VZJ4iSw˾ױ-&+MeZLWF>?#*~w�=>%l4;sk؇pY|Ѧ-&+JWģM?go'gyMo^0^;<7hy1]Rw%l4i'gyNz|^2nwhy1]n /b4xJt۰ h{U!Bx@+y co{^kjZ|IiSewhy1]n /b4x|IiSx˷poާğMT/__�xOC,KCɊpY|ѥ+{OͿiSx}w>%l4;sk؇pY|Ѧ-&+JWģM?g|m>%l4;sk؇pY|Ѧ-&+JWģM?g|m>%l4;sk؇pY|Ѧ-&+JWģM?g|m>%l4;sk؇pY|Ѧ-&+JWģM?g|m>%l4;sk؇pY|Ѧ-&+JWģM?g|m>%l4;sk؇pY|Ѧ-&+JWģM?g|m>%l4;sk؇pY|Ѧ-&+JWģM?g|m>%l4;sk؇pY|Ѧ-&+JWģM?g|m>%l4;sk؇pY|Ѧ-&+JWģM?g|m>%l4;sk؇pY|Ѧ-&+JWģM?g|m>%l4;sk؇pY|Ѧ-&+JWģM?g|m>%l4;sk؇pY|Ѧ-&+JWģM?g|m>%l4;sk؇pY|Ѧ-&+JWģM?g|m>%l4;sk؇pY|Ѧ-&+JWģM?g|m>%l4;sk؇pY|Ѧ-&+JWģM?g|m>%l4;sk؇pY|Ѧ-&+JWģM?g|m>%l4;sk؇pY|Ѧ-&+JWģM?g|m>%l4;sk؇pY|Ѧ-&+JWģM?g|m>%l4;sk؇pY|Ѧ-&+JWģM?g|m>%l4;sk؇pY|Ѧ-&+JWģM?g|m>%l4;sk؇pY|Ѧ-&+JWģM?g|m>%l4;sk؇pY|Ѧ-&+JWģM?g|m>%l4;sk؇pY|Ѧ-&+JWģM?g|m>%l4;sk؇pY|Ѧ-&+JWģM?g|m>%l4;sk؇pY|Ѧ-&+JWģM?g|mZɶs+v$if7]#GhvVPWPaZ <k}u,KCɊpY|ѥ+soȫKnd";~EZ\ۙ=ȯj=eZLWF<)^+;~EZ\s'�2>kV;~EZ\__?^ԛ<7hy1]RW>!v6fOr*4}+!Ec 坣_,v{P^ֿnmv#pY|Ѧ-&+JWģM?g|m>$l4;s+؇pY|Ѧ-&+JWģM?g|m>$l4�.+؇pY|Ѧ-&+JWN 91>VNS[ r2n8)$k r2M[�G�e6׮W-&+MeZɊj:4 jj6fkFdǔcW qg_cGҏކRGK#K6OtӲwi,]1C!U$�Wm޴_�,]7kMn<t,�Ŷ%,KCɊpY|ѮwO��.!W�ݧӮsoc?4,3?8ϧ5ۻZk_�VUθN gA-*#K~$796H,|ɹ. 2셕C`hy1]n /b5a p^4W677F#)r2W !RֻxZmm[4 CZ (@1|J4iSw˾ޕC,KCɊҽo?s~pV.)qܻPL0�%_a#0w,۳XW-V ;"ժܛZ&G6뽿WoR.7~Ee \kw�vȸ켁wi.;/ ]Z]s~Ee MߑqyjJRۿ"զȸ켁wkW)\ߑqyjw\v^@ڵ)\ߑqyjw\v^@ڵ)\ߑqyjw\v^@ڵ)Rf7H(+'FYb ,Yǩ{X0kj ZUn�kT=0/ґu+ `n/IYN0g}"aeM,xl 'm5Л\R叐3`θYX78!ʴsй.[ܱ0,S,F̗='D(ti.7Zk/fX&zUf⏅;aI)F+epQ-'2Y%7)r�*z&dGS Fc߃>7HYIM B.X"JBem80[:uw Y!={q;m 9 Ɋ@ q9.#eq <W0 ThkصVծ~ ^w_,3b͆Ă|"@9L[tF<Bܥ "$fBҖpXװ3ȿH39/]44G#hR2^ɦZ.8<%psY\�;?n|TlӇ+t|-܄Y4i pT+#l<ʡJ .Gv �l-~}wwo߷o1ot :L$Zg&:U3u̥)mύ90 ԛq2$[@L_ُ_mՓ|YLβ6!1#S<E;IcDؙū-xB-) 7 YA$l輲ZZxqnFoiK@J  m6F�=W*쨄8BFΟWS]~;W#C-39MLi9zYY4bBtc@3]C(Ir{+uHc@]z$8ɚ? +@\iYq҉v!z &[*]'Q80Y;SUMMm.z4/) C`6GA$4d}{yaHUEAp*V+g`]m졿n!b2Z>z^kd qI> DYboCW#J޽IזV-dHcDy b#MohXi#A<VxO$i 86>$PTAO}v,vU $B"Vb$5#2V0X]Aή0#r;IFX.05HqU((-Zuhh1ă2pmHf-PԺ>rP̅Y*C)#ybg<.-"]k^~>{Z�m[ O?'F aR=L=Ch֤INRXޏoX 7Zx6".gd7Γ߂�9`YL,t<e靝 R˫z lz4NX֒/ XdRbiUVieHp.!f-Dݸ&\A;cڠV)&2ӎ i?DDtQw&|щ:Aۖ= ZybXЄ!\u૵IQdRQuۿjFrѻX.i5-q݋@<!ezf\f j;]]9ݽĞ>5>h wYV=G&<]2iI,irl"\<[! \r]@jDL0qi"RZ֟l 3`I[%FYDz|wl- lҹK"-$I]5`x\lb뷱7tv]dM8ڨR(?k HbbLo0ĚPhrMlWI'Y2eHY##nBMdi/gDzu~q KtC̑KN;?PDgSiepXJ2$r'5M)L╅L4+LB8B鱕p]wYIi^q]' 癜iyl":s0qPRL�PvrM?m {|k9ȹԸpd&6fĸM8,oc*$2Aݖbf+mz?޽k]|=#qv#iExk 싓id BV{x4)ՍhOwY1@rDpBee`~샂*4 m #RE?"**)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JRF$�)39nTM-?Q[]_RkGus܇%%zVCE-A!QIQcmXSa1zI">Zۜr(9/7i1┈eK퐤I3XU0zhg0'VP�WLoZ?a^ߓc @ZO:.o@SlsT74 @\Aٟ.b9C+ 2ғb%.K A ܰMMyc97E!4hHskvGD|#y:$R9ufxy"&8 &i@#"YZȩA"!G|1D UH&%:cd,トz2U#?IزWoB؟\Zظh "^ϐ۞deDdEa@31ktt|*sy|fǪcq2eNcːS7ɗ #\@' 9s`C6ypO~ABfZlc6KF4YgvmjgjPl7Y,B'J kJLZ1"+将kƒu Y?FRtop@T끝.@~i&L]ȼHljvs0G%[b2p2,r0�xL"8* i>- Rq]7)# KbIC¦ߙ#;9<GF]AƏ3Fk);z$XuNG( 6e R7o8=iڄT)m0J3OH aƈ5ZFP䡒hR33l.heNHNc|CL|Eq+ބ�6L/,Sigt|N<~vuKqD> M!hnҦӻ1)#)H/;l$}@)gјIHY*m}̌2snŒ$vu?vo|rw%æomRWǞnȒ iā9j$F$w?WVzh+щFw9GEˁ$v`mqDH3?,9:P)}G-HP2[o~TP['ᕑT|J'�ԑpW+Y\9)J)JR)JR6U Gu:+Al]eNs}z K!2\m8s0N; u..C).fK'RTl Jh:9$N1N:4^39ܠvѐSAx2L.LWxuZFIe c]I[Oꪊ#QFB[h9ŵ1Aiܶ۲sr15�0Ǹ�Yt1D=t& I*e.9/=j/bh=8 aK$CJqtt9,iJGk ΃sf3;q҃G8ޓk\4ŸOQZ !HJ VjQc!kBCۏevtSzvWonE>ǡPTC.͹\Fg=P@7gR #2ceiH.z|xq|7Gמt[5b%#9(:'y!єMek!ZK(LC:&Ȃ�+�:h,+|[Z@T3)顚Se#ۮi4R6+w4.K{7tWonE>ǧev&tSz,L~f_;FaX*UV5�hv,O�VR 7l0 uM~ <ygYI%YH,NѦk,w7d80ssKFw^RH/`FLz9nu]n6Kp4Qڤؾ?fQ"=^Pi;_ᐉrZKm9O5GfǙ+K�t[O]I<<Rme*mzei {/*f8l݆Ha"R/THO NJ9s,$ш:IoC'#l|K@Sq謥 oJ]]UQKv)#�x67Bqy$mNΦ'MaWUaʝ fZv6 $Ί}NM f 1 7�wjnmrjCˁǹYhFq]k`A3mb89Dd><ùo#'%.-hƌdbӴo i=yZ3dmJsZ|u1ΦiYi\\@KiM쉬Ǹ ^S=ۗev&tSzvWonE>Ǩ0e@8BP*BIP128ë !9dq#KyA"͜&:+! !EcYti1&Ec60weYI٥;%c]'h$356NB!)spNz6F?G`hކɖA\D"L,r:7w<@3E].IVx pxw:)=;#scԕ*WU`co;BGrų"0ܲ+Iܲ)ϣ['X[&JPJ2Q;ҶTn`Cqg{>,̱ A c.㏂OG|`A3ذ�s A<ruHO(+%7o fɀD|1PC LC 'M$Ί}TDXv:ʘ2$ܫQ[<` 82y+!'-~�]z\i~A;Yt"Xx+J rd>*܊0BblMv1LAP4i"+,]IěO}bEPKm,?ym}YdTiTM$Ί}JҩݕěO]I*]IěOJҩݕěO]I*]IěOJҩݕěO]I*]IěOJҩݕěO]I*]IěOJҩݕěO]I*]IěOJҩݕěO]I*]IěOJҩݕěO]I*]IěOJҩݕěO]I*]IěOJҩݕěO]I*]IěOJҩݕěO]I*]IěOJҩݕěO]I*]I1p{)L7BÔg:p(l e{ +JRěZ&G6)CZ �1X!!W+WkZ}Z{/Q)li,6Zh;+:m!.@PlBdҨ<BKc +U~KfGr4Vr]c=J`f{@#9:, ȹT8BХG 0Y!B4xC7PxK611{[, qn.[4-Ĉ8 %T,P �j1aP,RQUyB� �$i1N\xq ɨԞCZ&fZ24mJBwB@P[$(d Mpq K v;]r}"{q۱[.Z>* TLSWF\SDFFc @"ـ\?![JzقVZ˲e%H[{ۜ.gݢD$9407�9 ~}crg} ibYKFZq4!Y9 m{Q"4<$*3Y7@L2(\$JB7P io 7DFCa>Nh)nJƱA T)RLԥNT*NAG S"Nr"P16jAI\$ 1Sim1c٤[Adl޹45TfYnYFRX%wt]7/xW6N%i<1#[.j6JGȣ-L4^7<J 5:Х{k羵B7 ,LJmAm-JL"[<^!FVako˨esk K5,l)g2E!4qq U,mp|ݯiJ=x)SJR)JR{`_ͪ?#AcmQ)NJ"1k1f1af9�/p�0+ZὯk׵|o9':Ad k__ܚ7kv�]FR,rV(A2ɷE٘ T, 廿2/VI /,&ݥbМjb8fyĆeDYLQ^HT=Yưsooჭ .RVc{ }rU4sNuA)h ꃬU%Lؽnר<�L B=ZJ0@�W/[i*ְ&xl=幽siJJͮ:'mZaV3edOev(z17v1j yʗQsom('2 9]~"o-*`b۽ݫ-f[yΨ:7󁓝Puس[/e)cB1{^}ad�jAkwokZ�yE~l-:.$q 2RTbsEkkڢ)[8CY*\8 f=VaDfE_O3JTF.�.3fh ꃬS|89X'{UαA8EZPr`ЌaKl,lqDjH2 Qћ0:L(}v&K,$;⺂�mma,V-wPFPXM*O ,2xЖPH)+3QI)�nʌE4sNuA)h ꃬVܓZԦhI`-p;k Wecځ}B{rJR,v(w2{}ځ{lڵ92GM>ǧ~c)6^sU1MSG<dTbyΨ:l 0n; J`1X&k0l+�~hqZֵ^mo[^�PUH#>"WYcrU$G+ubʰo9':4sNuA)mMn0=]:^yΨ:7󁓝PumqlیWNp2sMG<dTbf`zt6ӥ)h ꃬS|89Xٷ6͸tJo9':4sNuA)mMn0=]:RyΨ:7󁓝PumqlیWNp2sMG<dTbf`zt6ӥ)h ꃬS|89Xٷ6͸tJo9':4sNuA)mMn0=]:RyΨ:7󁓝PumqlیWNp2sMG<dTbf`zt6ӥ)h ꃬS|89Xٷ6͸tJo9':4sNuA)mMn0=]:RyΨ:7󁓝PumqlیWNp2sMG<dTbf`zt6ӥ)h ꃬS|89Xٷ6͸tJo9':4sNuA)mMn0=]:RyΨ:7󁓝PumqlیWNp2sMG<dTbf`zt6ӥ)h ꃬS|89Xٷ6͸tJo9':4sNuA)mMn0=]:RyΨ:7󁓝PumqlیWNp2sMG<dTbf`zt6ӥ)h ꃬS|89Xٷ6͸tJo9':4sNuA)mMn0=]:RyΨ:r:8`@p `NEa $e߂m|lیWNec$(-k]u�G*OJRěZ&G6)CZ,3HÒFy*g4w;G䵷ЯuJPbXAb8bo0AmO0 [ Ø s} -I#M 3Kwr) LX`$ ڛ. ;@V9"lH#ɲM.lgW3!4)^EZdL8#4 Njwjm N<I$qfnG qfH=x>e\ve:9u|pXCOK(2 6Zxt&!s6"d%񘬶ځc\Jg i$DZޞ&R f{_d+K݊w9}jfIZ@%EִgR#OU rMn7o2j>qU dVq6ɬjIǦϒjbf9BͼQ1>1D$.7>Ev~U>醱kYu҄3Cr.'}kevjlV!3}.u8 ZZxoxh['[لI_1\Ư,H෸%R%>?mw+TxĐ?iZp,QG[r-g홛]̵=k]ikpvݿ[X~JZԹ%6 'jH#.SVf#ZVC,ZtHL.%%c L;6|a'<.'AqGg| MFAݙj*#S`-4r O* wn2B =xHD)XR;dsc=UxCyGQׯzp|m}XFYUJ p1Z23wFFeV<P,ȴ,H|qἮݿgjaֽ{W3R5=!mP-АH?H0lf �1]twK=>/hC]dDUC p+ZRɮ)JR)JUZ=0/ґ꠱6TZڝu;-[6j=__؋%юq'q )##7KU<1g8*.q'YC='f:3b"7u7, 9AI%$!)22,a)SI1[C,'pݐыXD}ۮ/3L/omp<naPYRIV`yڎcwд HOqnC-m,LGtrH@#M v&lM3U.*(K&yrIH&fN|Zvl8s̖*t324y#-+Pۈ8ep{SE�ٹZXӗ,S63k;g-r9FPJdM{U8ϻtU8ϻu8@ X`%e;=`d" Q\ \3o & $wқue4$7em9!lՎA;?9YK36edY@el͍T3fJa7\*fm2Rl)qcLx�i3VMkYSyZk>* ˚㮱{@BbeG"J+9CEWND}ۦD}ۭ{x٬/)!0 N@DCA`pp%k[pzN ex1"HUqL#dZ< ^(]DHPc ]U­C{ '_.qG0'(J̔9e20SCJOA&Կ KeV 'jsyWG>yWG>7J5-y.tXGXtFX۶xP<DMr"+պjvun 3$'FkrKC$n\M RHtue8%йr\+oP"22 (dy$)K]"KMqTDI?8Yrm&̜B|Biǖ,v˅̎>+.B+Vo1 N2ɥo+sgݺo*sgݺrj*6:tt$Lu,t cxdnƝ"횆s{<1P SY\sQ>y.;.MȤ|^bKeH',\WIX30vʍ+ ;KU +bb\c$nJR4X Au V=Z3Ԝi V rO#M_ΉZ߉uoF4m&!("ߙd4R+˳�B|1hq. 5՞i'8R#FijUlmOXmOXU8ϻtU8ϻuA[j/j/:$~37:$~3)[j/j/:$~37:$~3)[j/j/:$~37:$~3)[j/j/:$~37:$~3)[j/j/:$~37:$~3)[j/j/:$~37:$~3)[j/j/:$~37:$~3)[j/j/:$~37:$~3)[j/j/:$~37:$~3)[j/j/:$~37:$~3)[j/j/:$~37:$~3)[j/j/:$~37:$~3)[j/j/:$~37:$~3)[j/j/:$~37:$~3)[j/j/:$~37:$~3)[j/j/:$~37:$~3)[j/j/:$~37:$~3)[j/j/:$~37:$~3)[j/j/:$~37:$~3)[j/j/:$~37:$~3)[j/j/:$~37:$~3)[j/j/:$~37:$~3)[j/j/:$~37:$~3)[j/j/:$~37:$~3)[j/ι4l2<߷{�?EyWG>M6SR,1)cp؂N4O Ammop'}lMWc٩RJRF$�)39LZ&G6ԥqH*&DsZ$F1b9BJO N9!q(# Akޡ'O1:sEH|cxӌi"ۿUقKdѸ&Z+4cUi-yfk07ve{mZԼ)BN'2,ruMk\V<=b1ōF e.S<C| +T;\ܕ(\j ZÔ{ 9!鉢2Xhyx\0(!1&zfB`|sc4G6;bG 4϶vs ($Dl;4qCG Bv˽kH\žKŮtxD\$neRըMjrVB ̣hfȩBGg2(D3I�fGX'eZH9f)D7c}=Sr 7�aRRdɤG(HŖ!l# J[h^KDi nb "G0:+!A72RrdO$Mq$д^SD'QDm ـqh-O^ L@2w2.xk0ׅ["]↰[b�7JoLͅLz{{© 1C&-|sn1HxXY',PqØkvë; vWy1wwQp$ji[qʟ9\m</y x]ߠ1'm 9yjp|&MwHa=7sn.Ia܋[WJUe"IdY!YdgXe1!;3P2ēVH`)'ei8VH$22Xh' R5)JR*jHuPXTJGSR<�$g�&^+ aP_&VC51B5D vѐ򘧼�4o{jn_VH,z#6J΅N_1:F\[Ӗn[YEɔ_ai2;g? ?�$@jӗ2S指=稸320e�j.YaeZSrW! K7XWc=y)jFv]Ƥ$X!ikԉ@R2n=7w,`gLRX֝CB g}Hy/<c9oěvѐ򘧼ݧ/46T=稊ӊA1w *sMrQq6:r!3% m"hR'cs15 0A{^ mW׵k??0AATd Y+SI! aL, h/<8 ծ??Jy0Cpl%\trѭBd"Tvj $n$03* *dpk5%ĩ DY*Ffb��rMb{IV 0ĥGlD@Y� 5tV&IMcɣzy:-,H(WgRuٜ|^QǨۘ^\0I 6B#pJ5߫ScMc]%yDk935޹GnksjW*!y{_5^S6;*/OftEX Gmq NRBFt, SO@TxcfzVK#%7ʉ0|/{[^�ݺv H Fe8i%A')a-Fq݌n ;mktxp  Ju]=2L春) $P IO 4 ,@0C[#6 گA`r5Qӄ22[]A;*1+B6I1U;^)o][|k{y#I? < jR" s|o  4E<PA53qF,@'<C%ĉ 1!yd$�ߍ\*΋:c֤9wIŔ1 \28I%|Eh,x28 _ \b"4䚡,JBq6S.ɔcqgunǓݴV4Uxf7#AQ*CAXS"!C2KwNtEdYA Jx' ,<nf4JeLviZyөү,o1M)sɰ{!i ʸ=Ios O dh׺H#XVpsk4W(xHCّЕe8E)JVJR)JR)JR)JR)JR)JR)JR)JR)JR)JR/{[mzM*INP= HC4)t_tm5Z{Y)J)FXNX0�Y næDfMЗr^0:z6<ܲvB !ݾBO|0,DY䄛ֺ^|vwH25M[2G!p`ZZb;KG3 #/2Y0ǻQY-J1d aL7-+2W76Sgb!y.�FMH$8%(8,D2'ssjF7Ѹ&l�,ԅSCFL4433.qTc05Yts[LJH"b7+ʕ mDVVեRW[~҂h䌰;w VIR+cw+٣̖rXsU\[ۥ!wi d9"0knHooKbjؤ@Ib4h,#L,\Zm^Mo#Cq JKE4oCdp#+.@ʐ ]. f_;eT6 dk jJ:=NҰv,J;`2ߚ0] ֽUBVjRi<00 X%[‚U5iӭxUs cL؍YqAfx>ᓉ᫳stٚ`EL J%1eo6`qT .0t-4N35BF /" FPꌬW9<_LE}ii#,lq:D̲ƄajUfo:{[aF*U^YJUۤ>D҆qPWrӜ$%ŴZG`m+XbKIĻ -Bh jQd~,ĩㆹT隒6z%PQ c*8#868& \&pǰH: Jh_ȑfKbk[‚6 |ymQ%17 {ݕOaqhҋƢ36v-@ry(w53I,Fy^(eh ZTǢT'}\ %gpHäd ; 凡Tk)TaidO Ns ǑYTc 8"$[/"wUCs/r2ܺ\K9LvX7NDXN3\'$ T9)`쪕-$na{�q Z�ŵͤ &R7hgRhhY@HdIS nGVNյ"xn`fh$IbfFUYpAu*6u8)N("c $ےm2ŜY@cK0Eإ)JRohڋTM-?QjR)JR)JR)JR)JR)JR{`_ͪ?#A#� �;~/ީ)Q؇�jZz>A]fJ${w~:J H@c5#$ ݙ@YJ*@[0P�\n7:!D6i%N)b0ӄZt@#N XCs 21W˨*ma2zAO AT|�FG5 V{% W$PH1bݪ3b >%`f1R7ngN'2-.iGn=h_$+%A)H LyrkBc J|�bSj f6T$:d;:s 6wy 6NFs"|@*Tq ' vc 7)^,y7b4CZDu&-6`BL$ڙͣ#msѓs,ՑlqFT (,�m �`!p! k[kjTI8}I I5@�Q蠐HQ  ?�?JYSHecdɉKPҥwՠPxM(N0 ,ܥlLEV R۳VrC\61Ra.ñe!SOh.'g[y0IvDލmt*˹ 5{xnh."x\x@Y26UuV  + C'm)d9XN'IbnKbDAqLw87(Qw =EIN - DISLHCtƷCFBí%R1DW9/PhK:tf%8"T�2j)'tAuw:M nQfԮX3F 쌳+I}䓞Zw9ydfAٙmg`b @ FoE�� m;|fntmeJ . 43fW 4@Ä6TK1LH[2!6xJ/ bv|y0AƈjbnNYǏ4)RcOe`ݪ ӦSN;oX#XJ$ʑ$2i!r{hK46C+t=%` hȷѫoզ5HM#J)!.�8܁ЈIi(w`%@ PUڠyI:mPxU<hOi<W6Ҵ7: ȇ* WB%fth"0)�|~u-^;!b& f9*9ܗbޢqxXu*1X8K"<rM"ynB34$Nq$�fd!L漇'Cj 1v<*RNTO)?]e&,)Ojŕc؅y*G$Q)fRU8}G-ib$$a3Vr3#+fݍ% .Y*UIg2:4ϑH(ux c\!hL=6SNj©',O#3r,�e8><jc5X@B"*I@ 88W&ڠyI:mPxU<cɥq<*RNTO)?JW&ڠyI:mPxU<)\Wj©'ATtri\m ӦSOҕɥq<*RNTO)?JW&ڠyI:mPxU<)\Wj©'ATtri\m ӦSOҕɥq<*RNTO)?JW&ڠyI:mPxU<)\Wj©'ATtri\m ӦSOҕɥq<*RNTO)?JT(cH])LTU2Mщ jH%Z@z5ܢR3 hHIscVe8�@(TmlBZI,.Fo,Hg<4qkƘ ѨC]p-Tɹ/;TO)?M ӮiVƐJȩv:wH[q�DQLnAJԙ.<цvn4 YIMX*Dp+Lmm<9I2<C(%PHݤscDQhF㨔!l@`iJTI]nil &6=^,694 ,H &\/DzGGȰ}QMmJᯇ=Iە4!d}ӦSOաuy jfآD"V iUT &L҅XȅdLؗ=YBXf%ɬ}z5ű#sJvw05X19D Tih˛|['%2.|Ri5e^SbonoFkC25aj2y^%Ϋ*;TO)?M ӭk^ymK.Wlc/!cƷmlmlHV$pYbD�R=s SRt䔜 , I$ QE Ya �BֵkATtڠyI:׭ b+9E،Bv\$kTP(*{ d ᶬknЛ 6%pB$uŰLLH aPvˤ f/C!SY6STO)?M ӮXC5լ <0L+#FdE!_ M$e'M%{kY &]YTFWr39l+;_$y{ƥ19:i RAǖ}tsNʈUcV%$ 3Kz3;+qDe#jC+.a#2VŊޒo9$DLGPŘYd51HE/Ӭ+M ӦSOHu^x5 Ld}U7W 0IhRiB`3B-�'8 mZ4dL,6jd2[`-|X*|rn~2tIr AI*'KS"Wu›Cc"%ȰYa>85vg !|3<*RNTO)?YHxƬ+JZEG$U_`,3b./tNVhO"FQ>7O t7OۍshߏO~:/MՎBڊ=TaPL]4'|` 8"/mcRܑR驤S.zss[Uƕ+ԔĜ m Bٷ V&۞SNj©'w}w+y;\O A$2?M4v*pIgĐY@E E$"n*�('0+*T!HLN9 DA%I%%Qa ek[~TO)?_ebqg baƌ=_]1 kk׾JݭRSBQ@ dK{,A47.�aBl 2wqĮ{k[JR[?%rod�(Gת[JR[?%rod�(Gת[JR[?%rod�(Gת[JR[?%rod�(Gת[JR[?%rod�(Gת[JR[?%rod�(Gת[JR[?%rod�(Gת[JRn8>0خYel`vCD! f!+lJ.ŀDen)J=Ԧ<K0O )@Qp7=ږ+fNmv}a7L#иYY&7'&�V0*!Ɨrnaͱ*T)JV?em#X~u F[漖Э2X&.FsR[K'Hb%j8ľ-1rЄ0谶cH79"H<%ϣk¾qĮsphܤohoTTpG�1睦I! 2$ypy+$v܎vFǭgm*a$0֐fK#tQY|@R ɫy%51DUݒ@0ǧ5?V<,_|-}Ո#d�A*8 <֔EM)J9.(9gyDyT Y d1*$/^Ԏ]]Q)T^{ki.!!5/$W,B噕TeF ,溹aW8XK;p =$WZmg"]Y "a܂( JPr>.wdgx\ZVAY)JB=0�$*(2slv9*Vzi-MeodOLKD.0i2oW1F 8$fsM~]:wYTGk<I҉a9-Hh$iݥ8'/ _mF7g2Z񼱉hx78daS Zi̘ܚ̭-0+;(vIJ pvVbKѩqHc|m::S{OZ2;dWd,9 !CvčRtomnaDBU(O8)- ZY='QӢiD*W{"F8َ"n3 nX&(LմFS ayoyUC!6HrA!�joJRU֥)JR)JR)JR)JR)JR)JR)JR`JAp+5FY3suK; [.o^*1w -Z E. i"n I a}=+FҬ彞[ɢd/6H"n4q-v(r<F6+GbDVweU$g]+dх*ܘfL+$—2cIM>1f4Se1Rʳԥ[xH~!9C$M86 :ܡ6DÇgN:[V2כIr4ZLCP Ld \VlKMen %ճT0J`}v7UHB#usžHeʚtG|m[k"[u_$2UV.:rljVJ=WY, "R<(Dt6e<i'KJJrװ3rX6bc^wd8"mڟdQYkS4˙ٛ\!0ilQĘfiVjz&N#hoth\M莤"bF!zW;#pn_G؋gU8guȉ3 eCӐJj)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR/PTF:$5-shue ʺGBAbcH%e1BV٘ %+X*4a%!f j "W#t]3w S:nn }JTo N᛹iҕk~sHʌ I1<Dr6KrTMSFJL%WDKZ8톺5=QJD|1s[[lTCZZNzh&& A5cpE5JSܜ˭vS�>jt3o S:@''dxȒ�@ #* >2c8m7) |c1qk<JmQȔyRB1 ։8V+Wtmkp�zQmvڻAO�wwUk.)XqN�QI€2}@�z��T���2I�I$O&4xf@to N5x9QC%q iM}bFvD <7^ܹ2�e{᛹it]3w S: Ȓ4.K)"8VGF R WKG4FM E,R)I#7]IVVYIktщٱ4f]._ө禙4h�l9XVSe 5!^;q{y.tSsiid]9ϲQ&%miő0M[N2څaǘ# L:Sɋɍv܁OK۶sw S:P$O PVW �C @���+ᢏ4r$CZq K6噙X4(ѱӕ�\ !8vdwj[,oxVaYǯ=Aˋ�+Ƨpce(L:?!XQ"xTu+BJ&(rf=:B 1{,R rv@u;_]3vv�p)N/҉]pm13 d|# !+V힑iaYY@mѭmJaS)q!A2y,sRTVN�\>SV᛹iօtjSJ])=k.))RTWtkڿ)~᛾ x>k�)JRۢ᛹it]3w S:R4xf@to NM*-.)7E7r>ӥ*SJnn }Mv܁OJҢۢ᛹it]3w S:R4xf@to NM*-.)7E7r>ӥ*SV!ǍӹKK#~!/Z#oXM%{%A[s]LkwE7r>Ӧxf@u)烫КXzшHbG0MoKRlR4|nE# O:ucY:rxĉGM˃s  ʊ=xM( $s~=Y0-q/t;' C#P!kkxZBRSt~1I[s؛Frlv4̹%ãpa-CePPG$SEMC1^v܁O.)vdO_kZk<n2Y u9�$ r+A4UŁAd(�T. 8K3�^+ŮK>-9rYG.'ϏHv--;2Z썠D ^TӓxBM<*ܽ>s uHn&-wZkտKߖ' ąkѥtBYo N'o @7R_x]!jZ֭e7wquJ$97ܪp?>cqӯiemo6<Ԋ4}s.pǓRTZN܁O.)r+RTWtY�{Wsl܁O)JҢۢ᛹it]3w S:R4xf@to NM*-.)7E7r>ӥ*SJnn }Zno?Z*E܁O?E7I6p)�:R4o xmܿwծxf@tJiQmv܁O.))RT[t]3w S:nn }JTo NE1 "BS,6b, Xl opJҔ)JR)JR)JR)JR)JR)JR)JRU!ptH6洧=m9[z4ɓȟ0#Dik))!/ `+p*oesr9!_;cάV@@DrlRDX* ?`RiGU׵l\'+۬JSzob9!4sX@z3v=r(ANj ෵R4'QH!+օ�Ì9 34&Xs+RRZY]iLPc%9YfU@QT2:—Z3kenTPyv2dڑ=4嬁$kLa:='mB[&�0:65h\DudUcbtER9$pdjbFYiSq%H`(0v);l*:^ uY9:J,Nl!ˌu-PehȖZ}߆%4˩²U<t Dm07}yJēLnignnG-cL0ȔIOveN*c|i~60J.PԘMhXc#kehdm9Sk@(Ȳ hӤH%aRl=c;ksK+aRʹ# c 1^6+"ӻ8`k5#mjEK"xTi[BMoQEMN&Bdr(6! D&lR5m@&T}�hѴ$F@i11[rft%bmɭ%Gڑ;ݻƊD,L֌ -?N<qI}Zu,7pвG2IDRq*<JRRNBcNqT>0W)RN$b <,N@TQ!2Z-pW6Zg$\SȢ!a%/LԼTaeksFɹXCcи%J))NI0"3 |dr({8)"WdeGǮ0AW^8c SK"&9GEhA>,i*faːF$Q) )<o } vCq䥊Bik2FX~69;;n`l%cilE%'`ZEM] rNND<1EJ_vvi̵1@5ǣ sc3{ 2&ԩS5,َ ĿA\3\Y1mvg"rH4(ZlQ8J$gۺd;4l} bıȨaO#'� 8Gz6Ĩ94ʦr u Ҧe3RYܑvHLPRuL5؞bM/S)ZH.6idcNJSseyxȓJZ3ZBaֽ,EDlOزk[$\oؔ_\\^*ؒ5Hܝ$Kw G|,жk fEC8QtC[(Z@KxuR.*Rb"6?N<ĐAB'>p2L8Vxy)*\6Qaꤶ/>[tɍO?Q= x4ɖ7f}RBHo1];Q"Q2#c~C"bi85 tjCDW=$Btk>d1Ъs㸱F23\ŊkDg-Z0`Ll8K1}@ό-c?|hp1xnIuJ}6M65,02 X|yCXE˙r  n`) 9#JdK1`d`=M~܌(I!AClN�X`6nbviÍ9T, B"ߠeFr*ӝiPxRZέ.(Z6o~ΩJlr7e-dFu=Y3WnY-=0MXAE!xAblE$[3\a 햄 Ɂ{Okm׳ŪNc1A1EߌF2 rG&R܈U\줇dyr[b, L ͂O#eJYB@#i*eq1ܻ\68%R |csPز)>bX�]PAMWS\@R%Ն&q9jFXK$4vi,j}=^FZ3FEɤ0gڮKvgDr!-M[֏wfLsaE/0h�Z\In2a0lA"<C/>R3vHŅ2fn &2oa|,e{9:u[NĘUx|Bf⩰ ]-FdkRԒXc%�A6l/8+m0<E#@O`P'\%I1i Z2.M�ltV7B3l DY2BӜD,Bn̕ɥfD$lj8X$LX5Dѩ[NbUT7EbV6-dQF*'%SLD!iOe2d&r݋e 6tU =)lo4e}p~ W<øo*qL4ri;7--ԥ1=.reYOϥ)a;yon嚌ar]c?ԓ.h<+ ` bT�YIVXcX(e#[0ԐgȜFRֶe !7ոl#JP&("cU95!dp.eRR=f;x릩[#.et+*)<LW6Uh&6֐#m1Щkl4RK6N:5-DfLވ誅+b#Fֹ:ccK+W0*JT6])ǚ19İ.c!PcxeO$ [[ `FkbJ1㛂AVvR sʐ9 efPsU6sy!�1m#*; c2lK0rXOY9ǐ41J#-oiqlT60J40q�7 Q&F66,쬬R43%)kSSj"D܈@RJIIӒQ%V 6I ~*;� c rq=)JR)JR)JR/߷n޾k֐S$TV+KS"ƴ!t=Y5<ɏc1v'kآ@@d6%4]ގ>Iy.K$==d7Wx;Ɯ㎒21eNnYP{6bQՁ- FL2gzM8e¶*r0 )[(XUgYĺ[X4:WƎY݇o!ѕfEǻLN-)ԁƷ!iՊ0 l7N&^ۍ#69'H=⤱Ȗll[Y<Sv {̆4*(4-ƒC#a#ֆD(fhviJ`(xG14YaeMH.q ݏ "4Z<3B:k LgBqmPƄ1s TY(lQ&"8fR_ym#8 FS,٪T>]7n`2![ɕP (Č[W/#rX_=B̊cDۖ%ݝ$Kfw6 hcf9$kÒ;x1o/'>cVJ4h' Svc4xі&7ogsq=v=&`_-1h[ě'sE <䑨lN;"w?Kk@/wnDL䁴7!\rK-.ԕ8;E$ <\xோ!1O0 J'c[zZ\Ր+ *PaNm=H\v#*|(B e-0��9ڻTA�;I-I+NbFGU0k$$y78aIcpI3ѐ?dܭYM,a8떕/4/24B ?Dʐٹte'Ƅ xqP4-H c®PR̺ , "Gʈ"Rx*V"/"La/qU9*)̵-epZyiBj"2<GRXP&Hp0dXar*-ę3$Qݰ)#lhP%*"t߉wI0TH xPUO,o2L[@郌Fr @iGR9A#-"晉\31:0rFܮ${DJAßކ% eSH2RC_q (�!B`Z\KRDW2(fm S+"Qb.K52xJ&JqknCJQ:+-%k2bhӪ-G\ hw[_Y#/snmi]cӎ :֪No\K?;I+`ty&&/|)uR6pR#ŽbJX?$PdAhp,�M!UB-j[o)QV)JR)JV;~s%(IB1S Lp&6|�>KDr%#xTd#ϑkxG OebɬvDf{fu5Q3:+se%cqKؖgMct{ghg2B6HbIDDâ0F+k*G$I K|cyHO3X}5`5т cy,a�V/2;!}Bԩ.qL{9{ 41|%Wc8"\8nAQ\~'$9:%Mw]Z\4@EQ+�ͧ;*o8y|PBRV{1cM 2U-*5<#T\W ϣ9Z98JgMyNAK%Չ"VI Zԧ S �V^hicKmkm*%jm4-.wڱ,t~(ue{t,"ą C<^C29'XZ}yƊ LL[dm~ܺ968c~^O YJ\~h N=mU -XvlmlR^JA:W~,-H$Xق,TLHU69E`|A6i'J(+l)ȥ ԥ)23G H)ޒjw"`*F]7>/gǹ$= wvU=˽ˊ-Pz5B0Ops{y$sF7uHøYΫm:O78O$EK,Q8i"R6^eC);+儹u42}3vE y 4|aQcE7Pa\QRZq&PƧMZ*gwjP5!q(lA٢`qsR5kpV0k=X )myk״gHm rv;ssc'gz\*xcFڅT Km)JVnR-"�5N_H�xM)UR)JR)JR)JR)JR)JR)JR)JREgyw;o}R%n*+Rs,Bb`ecu\u8 ?fHEAe%ʁZHXmrI7k Pc �%ȽF�,Y0E"ԩn8߯S{UתJRlw~MqWs^}J5,U塨e<)jsv'IF+y*ZX%eV\jˆgt)r9lj8z77Sm RG"'ec`,!' nf>^K(^k햝$ַ-2C0͹+9=IDkc Uwnt uxKR U"1N5dLȄ2$1 b}7]z8jxW G◴6O�gTĭk1SKHyf+FSy$2(kk\IimeGEWI1WP#̧V#]A YbfGn7#UrpQw]zlw~UV*T]qWs^8߯Ujn>K1(cA} ň6S$*CΈM;HʦG0eeNRSMR@۟)c_s 53ʎRߎlw~MqWs^" &N{q!0Ջ߲Z Fbh;-'rD(pÔSrb~Br]a|1k"`'&pѷxTerv|_ "Httxg!PCQ..g+V`Ȳ hAL?a*A(H T24DA쓃` \\qWs^8߯W\L #d +`ɖѣ3_(Nq:Vz@ik[qg75 wfAdH#ώomLfօ:4>80cR:fmtF u'SрnVmM)+Ke^p ye0%�fWB ʣ*8 {vbo}7]z#o251)%Y^!irr7a,`yof[(1QA"S *˱=4,mK2ڦ y.8!x4wiUJhjlrqbҔ�m v=5  #sv 1!{lWk^8߯WY6sNڰ71NoqXHw`=D3A}Q rMQ`ϰP,{T%d]{%鐦nHc6dD8Y5 !C@NWB=G^⦨r^c*X g?LKc!<7qQ`xʌHeo}ש*wwՂz~KFU-)eTS4]7N6uJ!UvT'YBu×w=Ta-'yr8-A7 @s%ͭ0&[.+|XL$s紸-mS�I**q$ew2H 2?$ȃkmqWs^8߯Ug{jϫ޿p_ZҦlw~M6qWs^)J}7]zT**wwgw;R.8߯S{UתJRlw~MqWs^)J}7]zT**wwgw;W]KIT 1=cX , d)B*nT,*p[֕]cswF7X0qe6ps_"԰{{9<�,ʪ 1 F88E.`,ĐTf!T*{o}7]zܵ?Ù ':qMer\'n]1'(ij' &9m M/'mthdF$Y$K&RQ\EɒY<>};M VRgҒGm))vX f h%E26<rYBL<\sn 3kqWs^8߯W_+i{3NNP,EѼ 湗vHG#1 k)F4TϱPW Cciɐ&J<d|"ɠ0z[h[F.A!PyՑXriF@{MirpA&Y "D@!27d )=qA61]}7]zHM&2%x:<bEW(2R~[4WaOqXV<IhK[(O ;` $K2< ̜`P|ᰦY �ё]_+™R|)\%"q]ema %qÙ,2O8R e\ǂ\ �gaq)*w}]}7]z׍i_`"&S;DbbY,xOf-y]5,D^R6:9#,dV #N'%qԉDa$\t&+?G22bIƑ܆3kmyAf�lCdwgxfQ5RT9΀&2>Y+7»Fgw;o}VJQw]zlw~UREgw;o}VJU{Uש*wwZʚNJzRFpVg~(qzwt9%݋U@H(sHٓclk$5mR>ȻzO^x{^(#s$ѪkV\1sdl5 ICQ$ fFy߯Vlw~]IGr\na4O E2 B/Rw|;a n9wo3#M"qA;2")i Ւsa@>OYVƛb1P460;ӻ \iD' V9 1!goF:qZ^CW bxn  Nn#؟1� YxI"gY"Ѥs F RL]]9h ͽ*wwgw;eO)4mD:xKneM5 *\$i!_4W,kUKjopvj=d̘/v2U7Pj&NKlT%ppGۏJ7cEK͍1#!\Y!:6B%&Nnc4I^4]|{.z,eH*xᐨFI g{Uש*wwgt{&gĔ0ėiAJ*E!6/ q-Iekez#/g>FYX (YI  W7rVh:lnV� }7]zTzڪ.8߯W%+R4F\Sc]ʿf^Hv{XJN,"��|,`mk"+ JRƪR)JR)JR)JR)JR)JR)JR)JR\KqBpSZrX <v#JO80 Fڕp F@H)L] DY$L3!UBNkMiÿY{ԩ*8sZ^4njǿ{Uگï_oۇ^}v{8oݵENíw_5^4njҦWv�M*8sY^4nj54BspT Ɯ9íR4/k_�v{^8sZ,p7o)U4yY~;C\ɍA}) 31UtdF�AKJ P_4q::Ѝ 0K$3j ,ʰSXmQ6׫m8sZMu8pn]Q >8}j8>Yx?!SM\7߿P 1cȲy6lwz5#d]s/BՁCV^KacDBfv˅|;�޿6"rqή 0;:ϿA�=io_^j|�8sY.[Wtzpv|MLw5^]nۿs|jn^4nj ^nMÇ[\q^)SM_=�_・_U5|__nP̀eÜ:֗RWotz�?>SZT*�sZn8sUN;~?JRv�eZS`/p7SJR{xӇ9ulN֩JR{xӇ9ulN֩JR{xӇ9ulN֩JR{xӇ9ulN֩JR{xӇ9ulN֩JV_W�w_kU Ɯ9íVxӇ9~[gjԩߎwomm_�o_5B*p7R�8[p?]׽1�5�/Щ_W~ݿF5[{];p�7Ц�ֺX"pnݷMíR~_?𩦫k_]_6z�]֨]+j}_nkm6W4n?ji^zkZ_j_jjNM÷nXN~MiPiÜ:6spTM)PiÜ:6spTM)PiÜ:6spTM+M]8sZW*p7JTc~nsݫ궖,6k~p_6 _~8_q?W{Vlⶫۦֿjk_U^}Wpң�i׿w^ֿڭ^|4wx5[۷}Vڽk8axӇ�NڭvRZϟ_) p~_ kPiÜ:6spTiJN֩8sZ*iJN֪Pv ( 8XVkXV R*R)JR)JR)JR)JR)JR)JR)JRgVƩ25e/ S2)Ȅ kYա[b5", 1w0"uU="rNY#e0ɂ)eRf)F�H)]S9+RJI!2`G5qhowMtn͈\`2\=!IFG]76ȨS4qI9<0D@JH(Pp\q�7Y}lտMJ%rVnxyz4&U*1d ap() j++ÔmlS {P9:}TB!q ܈60Ɨ&V=/ i08vM] q4[\nWrVr5ܱb.�/}zo_Wibߘ.꽵jvݽ>; (폇L$9I*ʁP!۵eYV<˽F[aХ Pe+!U q`v I0SbΫ^4O,SY?YQJj pnHP/ԤuhZݝ⵬17 +Z7kۇگ{pV\Aj~z6wC}Vܷ �띩QjGYX1P&�Ȍ!X%U+RpwűofiEMJITI•_V�u6MvkiU2Kd7y7,`NbB5ˁ qB0 L4S#9xʱ- rrP*t&lտ_7� Wwomvxu__w5[\c9$L7NEiXa"dw]T2 p y1 FDMԘ�dMP'T"G'DwL,Ϛ^ 6RGɚEiPˤ;0b'w }i4$+Y &dF¦2}elt.nQ : ,EmoWk_w+K=î߷}}s ْX$n]Tb9gL$by b@۽mmTc<+F@& g!J7G̒9*_>akyZZGreșbmәt=FYn[FNKx.1$6,73Ng8g(iw*1(ѳ-7GJّdA92rUOǭhZx%.sEc[[Xon�kkpvrppZzj`ĒA& ccP�ê�z8G-ݱ)̘&> \u0i t2byIDDIfkM֌|Sicvg5R#d>&DoX+ҫ;Qf0!W?R1ƨYj.2f%wA;$M|`|<z%Q?`jY_�WmZקc~h߃_kUohM˶N:1!Bڣ(Q^Nd"Eޜ{`[ ;.T㬿,oei  Α'=8ҧ"#5H%iFcKSk;#cT͝4܉"IڨaT Wˑ2(V+݉w6%t/g&ˆ] JGo=zz7nտڵwWz\w�?Poڵ5pG~` )^�б @!;c>꼥EP1X#G4ƒ7dxyzE8s/B s˧ͥ2T8eOy򴭱̕h4Ҧ+//OW;(!űC.dZQ=R0{ۍ9%;7J&3FXcV7�7,zX{"nVw#v0JdG,&� `* o#ϑ|.9b 0bf9%B"a. ybo!8ݱ�ی 9y0[6.Vޜ"\qԱ;&wa0W\V}9L@6,}0D(t010ȡXK3#hp.(;Y&;K ٘ 쓌b6ȥt8�CJ:kHC(rq%%/q!BJ`(*0$ %6\+�+w�6?u^mu'%0\KN%L`BW,w3yYryrH$r @* ǔ l84IR2_>@)8yNSHKf:R$㹼l VhcسۙH`[ֿ~zlEGnï`+/= IK7�n9�0�P n��(p0{9<W|Q}[/i_[EoS`>(Ri_[EoS`>(Ri_[EoS`>(Ri_[EoS`>(R/m}Zm+xs2 =&Yұ0:ذVc~0rWHnA33[>I)d1) @r[IL@{z-;}w�ݽ/ڽvv J味vBpO S4q}JrW$z!HN�v!?4<Ȟd9E$M]8P.D04rKCHraŲ9$sSq>yM `fGt 㞼h=- /xdy=#d+DP&1"o~kjv�DW}pvZ|?~7[teޥC2fpcWc\u*jP%_(<gL}B rf=rh:\ӑyim1j|<"YS <`Xd͚%Y" 8EcI$iˏ5J3L޽' +OZ]^4bȏJB9Ԟ)Iqt}Glx˞BjMuOьbO|aڻᾭW[uv~krů8u^�ܾMYQ$' H!wc o�z lmI-&4izC.oK 1#ǝgf&8C2C_,yj\1;`&*Lfz>`"2L2 iNfv`Đ΃l^גe8eG7)K )+g"GxL.ZppV-n }kc_nk]ꑁ>|Lb3"9�fQf.g.@MGI(K>1 P-dRrC$'I ILo"Jej,SK%f!M__$Ɠ+f!d`f2E7%| 씍Ue24ucΎd2ƶt)6:N"T^%IT75.`MӰ]2)+}srŏp _7-~Zߦc[m�g*dl0y R6@$?Q̠0+#s$N%֔M5J/EoRJ/EoR~ rtU҂<1PKhӄ]HMsEy) b)=00ˠR,P;$_�u|ܱ�+߆�{j׮�?Vi;KiOj]m4Ȳ V*ű<<jj0GWr<w%wLR.$;0zk:`g"AFW6!<bxݞ0SngFQYiQ'|$K!1 w^ҍD:K1 LTRZ5c),f(@,pys@̑ H�+J$ k_EUZB{j{[UҽסnHM:D~Q"]*r#ܺ;݊'6Yë&>F+1KM7OB "Ջ\ͼr&<q;ci@^aFIy>[S hJQI+E PLy#;d!mIoy22 FXܦG.4/Ns}#%5K>9ǏbdAOeP)|J02aݦ?c� pڵjb {Wjn_xP|-*2 i$fai%eYDTav,F+}>Z+s%`ǥ gHF4y$"Hi\=h8y�ٚY-'9~SxnK}7MY%CccBֶ,} گV~v/]MqV+�FB(WsmD]UF�z}Vp[Kw=) upŦf,Ns3mQ_V�u6Zܯ�`>(6VR+7�)UR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JRk/_^gWTH*uȄRu#HgS"4d )>Ŋd{+|ϫܮ '̈�Ն)%GǓJx^iG M]S/sxZRYY{t+l0m< &Jb~t�/p?wg-W{N![7>rpA(=(_]0 ܁km Xf$.:q]1 1`,#S|(+p50[ջX;6(!1IT) %8̱\$&<#>#޴�q⤝Cn}]|5Amw[{K4yE=P*:P3IK\\qd%,ҝ�m0{|~]_}p;<lvyٹwXw5�ګNۙb 3Z5yn8$0ʼnU Bڥ+}e&5(&$V4(4ink#{c?zz5p;<luvlDscpQ7=j$xTzHPP"51g(�V#Lz!+uD#"XrkqxBaNIFJ6o^s+QQ\BW�o�&*ߏUS G>AHZ6־A�j)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JW�x/E/_U׷~׷*3 �3"6׽ RJ>qv9GjX7es2b( Ec� + d,KII�J9A�),K%�mn 46ώr]YXF Z;<.t(LpFO^#8l!"Ք?CTxh0*͕!HoꝕP�HztK KJp=;IS px>;unoynQ;~�݀>TϮAϮGcOQ`%q=Hnec.Jg'ei;gW".v!z�$"+WJ}O46ώrQZݯk۽{]f�OϿ{Vw}Z^AG!bC h5* mLȗ7;%ne$J&֩Pѓy|v46ώrqi}-X2E9A(Z48 ,3A. qKɻ*D ߙpD%m�sf|v땠㜔+lL!K�,0Y" }U={O~OjWikj޶ZҔ)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JW�������������������������������������������������������������������flask-peewee-3.0.6/docs/fp-model-admin.jpg����������������������������������������������������������0000664�0000000�0000000�00000053162�14605757052�0020335�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000�������������������������������������������������������������������������������������������������������������������������������������������������������������������������JFIF��H�H���Created with GIMP�C�  !"$"$�C�d"�������������� �[� ��!1QST"2ARUaq34rs#B$%V5Cb&7DEeu�������������8� ������!1AQRaqсBS"#$23C� ��?�rʏ&p\-y,82609&�6NFarRG)JʖS),Ƶp]."00z6 E؃ìݭy�EqC趒h|i!�͡ Culhsbds\&qtM5]3"}E,fB#-�ZN�\xah~%޸}.?==LT9M0jjbܚQw|rf᧨?tu9#7�e s\"qYp)ذpL%ldiw$(4UӺ 8<\1{ kF0l ຣH$3Ϧ)*s8V雷j..4.'2\p8*_A(%.RMg:$<qHmk1&Jh>{wkoCܚC> E1A.N a5r? _+)?#H#ˀ췹6^hԚQ;Ѽ,69=5ml]Lle`@F]mi:\SAp q>վ6He3Ѱ3\.3:,��/2يI�B4m^a[1O4}[7c#cyBsv1-fNoһw q#ƢuK Į}$eľ"։Mi!4Ni%h*裢iȉ`d^$6ܹ93uMKSVï-f6`iF)$w]�9Z5<.'[Itl}M- DlÕg86c!v]f%#..}9~5O9p=t1-hT )嬧앦hKu|ۃqqbFLbp9L}/A%DxlWPjbdfeN/y6 I M]5$XD&q9o"v(Kd$7f_Y!yf+pLšǧu{$:�<JCmնٮtWM<M'\LvS!q#ٯ$ |Nr<V Q3>6JEHS9QHS9QHS9QHS9QHS9QHS9QHS9QHS9QHS9QHS9QHS9QHS9QHS9QHS9QHS9QHS9QHS9QHS9QHS9QHS9QHS9QHS9QHS9QHS9Q΃cEŰ[Q> !d!FIpVZ<T�o]qE��+t~|Z N::i[$1}tmqۓ޹#ʽhGE۔F?]wQjDLn�h<St�yާ3z 85v#k O{1� 20llVeHPft`Hyp7-DNV5nc=o]�L޺YRK$X{\�lؘ3F5Tx|&]c\ە$DZGjoI6~<'CvUQG,[W(3:g B9$g(()ҽÂ{OQ~e1h'!QA "lFwDj$t$q,mؽOj}QN> |S  eFX3eaM`XS-Di|;qs%^c̵>s>eG]TTf!'5Y³Tbe HۂG<]|tc̵>*5D=kwkBWյmT<`e Oj}QN> |S cV s[`&69+]|tc̵>z?k6\й?y{*�{! Gjz?=` ܯj=SN~|Qs`NְW5r>aO]p_^WU>|t = ql^c̵>s>eG]K ^c̵>s>eG]sS?{˹2£|t L.> |S w1SZxTux7?3W)-O*:Oj}QA^c̵>s>eG]sS?{˹2£|t L.> |S w1SZxTux7?3W)-O*:Oj}QA^c̵>s>eG]sS?{˹2£|t L.> |S w1SZxTux7?3W)-O*:Oj}QA^c̵>s>eG]sS?{˹2£|t L.> |S w1SZxTux7?3W)-O*:Oj}QA^c̵>s>eG]sS?{˹2£|t L.> |S w1SZxTux7?3W)-O*:Oj}QA^c̵>s>eG]sS?{˹2£|t L.> |S w1SZxTux7?3W)-O*:Oj}QA^c̵>s>eG]sS?{˹2£|t<|b Y\8یZw 'mt�2ws'>eG];8)5O*:i}(M'yGV/ު?vAtU-h-Es\ \$AV5MGYU%UN#Js=o zSOj}QNN |S eޗK.^Y:=:t�ûP+bq, �%>N |S w2pSZxTuUe꩘GzjgJs>eG]F? !5@.uQ)E7_|tA2xԮi>sMxlEKxN 83F#54uELBFF E� ֝E%e<tqcFFqFJԋJO\f 2T ܗE|BtDjSiF.#̫al-OOr3Riގ>&cQxSP9ÔnB9ρnVL006vCG{X[FRECcAT\HFv7;c66VcN;ĝS4MVƽ'gR>n-8N<S{"iZIC´Fqj( kj*!3 {$� P_"Ӧ"1ѝ';ev/eYkWn;"+\o@p7FZTB5pk�Wf^=h#d|7 Q;NH B1 ǰS6 p56$m]6Ѽ>(ƴ 8z<W6RvZn*(+es"2-`6/ &%FkcW2\[ݎyg _7龉atQ9d,k.h 2 +l>,G @:zR7 """ """ """ """ """ """ """ """ """ """ """ """ """ """ (XEST,_ؠ1>sMx4+oG8[�K?�Av( ЬH4[œ8/�Xo{3p.u%dx-p vu\V ` }CNyQ~{�'wp<2EtMpͯlaӘ)Y^ڮ <<L)c5DXָf\ )3FK"1u5&WY2.61C*ol?Hh++.leZeSю~{gz9b|(4KIt*fk֗:0cpA%yU& &iGšn4vES}E1"3ދ`nA]\h>]xuUl``7 KHoe* tF`iggq7\Nl{ `a9,nFKt/pWGfs~mf_3< Gi0*+Q3h9Ilm @4G삹i%1a˝mmMW\+L ]9\nv;Eԝi84 6WZ)$ikZ}kQ'3A#xbCAdUb'X5<_{΅Ţ&օaCs6&p&26rx,[p)# Bi4z(pQRIR٧%<OŔ d*Q>ѭı\8;$s;q.�M� -VGYR(!TFJ[s< kWoΫ2L0f-oBY[f͉3 nF {/anHHչm %mHؿ:ј⪧pVM<h-;Ah?~薏hv.pc<־Bqs<M5BfH="˜K]!d9v:21s^a+?pI䐴;Moz6l_t ǿ|.Hl5wnjq_v+R]qTx@M{gy=\[薏S<zMQ2]!K�[_ҧφC8_|>zûsuwlm<[uI/| :GZ >!Q`=@�?]h7AMj׽5{qupOehc v ?daLȓ6k=m #o ;.4I6:}Lu1sz6J_x5Z+s0㲶6pё p#ĴU⁂}kݭ,aD4KGJ  *DI&y�q6$mD\E),_ة/Q}PADDRd~O�7#AcZr8~jSý=U ywyw ywywA=O3S=O3VdiSý=TSý=UdiSý=TSý=U#NzfzfȤiSý=TSý=Uo"lA=O3S=O3VA=O3S=O3VA=O3S=O3VA=O3S=O3VA=O3S=O3VA=O3S=O3VA=O3S=O3VA=O3S=O3VA=O3S=O3VA=O3S=O3VA=O3S=O3VA=O3S=O3VA=O3S=O3VA=O3S=O3VA=O3S=O3VA=O3S=O3VA=O3S=O3VA=O3S=O3VA=O3S=O3VA=O3S=O3VA=O3S=O3VA=O3S=O3VA=O3S=O3VA=O3S=O3VA=O3S=O3VA=O3S=O3VA=O3S=O3VA=O3S=O3VA=O3S=O3VA=O3S=O3VA=O3W!7 6[�(XEST,_ؠ1>sMx4+oG F;k\%T85$Fj(!84#$ )r</lM& uK /sLwxٱrVZ0r7Z[Fեhs d<,v:Fh#g]}6=L⮲,sZvs.cle(ͫmhd=SN۸k gXqXEs5졣s\.V}5,%xlx[Qv4XGt;r!`9F"Kݹ sOH"}{c,J:h2W5�6^ݠGH<bm mFs9\K\x jtgh?"g\.M;{4ƂH2Ď1{zBj*?+ !%va"('|@# nfN}"DL#'sb`{CWz݈Z&UEOK+LJ=.!6�\. +AJ1Z׌&8\E[0t b M#%cZHg;8@ZYA􎕁4 5ĖgfoF?Z-MﺀD?Gg TCz+Js�p=2XHs =a;6jtM>E}WU xWx`_66ܹO|>)EL:?W5mpsh曋@A^¦z:4Qq.v<kAֱ}3idA ɜܒ3:m#Ľpa?|I�Oj3=tMZ+^-DD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DD�$*>%�gTӿBygH.c8i=VnLVmp-X.^s<1ƆJsKi~Mg}oB,oI3CARqޚ<9NpA rvSLaUu50gE@c[~2lvUU=-4USG3`$y=OQi.0MM ve;rCH4&9%[1zWRl; /kn=I684x+5t# faS)fr`|EI25xnC$DH,_ة/Q}PADDRd~O�7#A8  H�z_+ M_tbv>W4܆I +A5L[K1L[#W<NH6a&fOߤ_zBb6 ۢ(ȹU5UN{boN"�ק9R_>#GOg>猼ߤ_zw7Ņ޽=qʗ#{?<e"�ӹH�,/vTOh/07 �mк7Gt[ A*fBe-˜bm*gqбk8[LSz|"7O8r.9R`o.9R.9P.9R.9P.9R.9P.9R.9P.9R.9P.9R.9P.9R.9P.9R.9P.9R.9P.9R.9P" )cʣcNY!]rI=ş6*9;I06#pmpyP-mȖ8gffKkCj%5<GT 5ki_JѼB1TRZ5d<mvVݮ+ᚚ&# -5Qfk,WUp;a~U \3:I"v6wvΫJ`F#f2N'5kHq_EAE$$~SA,5Hc�n洖mlj_UM5s+1U<DEUD@DDD@DD (*j_yQ2xԮi>sMxe'oQ/Z /ժy Aqy6Vi|_?oAμsS{G5㚛>*~%OE&I1@�z֟w[&a1ӺgF�;Rr]`I\86.@!}MxbtdH[Җٯ{' ^9M ^9M ^9M ^9M ^9M ^9Mʦm"E4v|rLJSkIv@n@6`o pj2V淖]_5V5)8e$4>=$Yi_N0kZɜ.E׎johTG{6�r ԡM@` eE|mMx)X?ލ0ß`q[͖-b4|fG>&S\l|nYvmAM׎johEtx| mRqMxqMxqMxqMxqMx M26VZrEiiZ3*0FZQ"3s<{Mw~ bP3U mdjw SM3TG9EUE13+zO-w|D"apF2jIݏT&+C/#^cAv*—M0ɦ j,dY"v};'Ʀ�3wsoIm6GPʺjŭW�]hh&ش'ҼŪ*pF`s#&6{.*j-%jeڹw2]\2]L{W({S/ /wr8w2]\2]\Y!A$ܛ#Vk<eVK0N:!1#ihk\ƀ@f2EeSD,Zv (ays^E|,=7F].UzSISQQN{ lWkS6,vJjm,Np@YĂv6UhvGcHQX l q`Wް8q@~ uU_lbX]_OP@[sc1}$}b))MSTղ9,kj)hs\|�l"{|08ͨ�(p6Q4t',PDyUVT8VߥF!,#�R :<R�p,hx\QV3\27k\(n깉UvSogi5,L*7 Y h Mր�-emQDDb�E~MP?b " O�7#TxԮi /Z (@KwX^#B) ;7+!=AFava0\#;ߩ9^ɛX,�kfh,Nsac̀P[u�J![SZG~"z;ַ߄%5w*b o# MkyJ![SZG~"z;]ppV\=oQaWVOU04CFCC!o}e;vq/qldQ>#$oaF9(nAQ&C{W%q_|pq S"tZF'1'(16ݯ1yFbMp.l,@ :XFg|r\;nַ߄Cַ߄%LDw)o# S=kyJk[TAZG~;1Cַ߄5mPGy$:F[ChVHq /)KYP]lXS㫑�1kG‚U#ݱsOs܊,9&cxDc*|DfԺ]kL9X�[hޝ/k~#0haj/1iZe~S9Aa:GRڨ4J#ZZә$ ;]Mðz>y3 .{];I.9XZ˒IK2E#@" """ """ !D<H0?iߩY wVh#b2QUpIU$0FA+$4zOV-R4HNfYx;m~!R@V {c(: QX++#]JɌmy95;-e-vs4~DOlW@%2desZopHh&EEY*9g6M hg{\x7)*J?dpi1/p8-WkEˉ8-sq<"c mߚVOvSNLjcKFfƲLoɲb-9Zhf|ۖ乧)d;3p}1)Cr,xJ,_ة/Q}PADDRd~O�7#AC־7]zRǮ$A;E6_s'0IoXI��w Eeube]֒tN&!}aаsNm0X9.6rbR56rɛVKFB].R݂Jݝ~zKj!ww!]抭?[qK>L:o˳+ӊPbTUоJ\,8 /.&IAEe=k_!!$ٔ'oo�OzV~,_hU~uE3ɈQ�LJ�LJB uhJ�s95�˿/p*!g>insXmv׹W忇{Ge:U/gu. X$a{ZC",=�_U s΢ 4fJG.35s}d𵷿�j Qq ypdFKJu|[rMĤkH|wsX66A|v tUR9q+,FZI,!.o-H�@EHqZR>2ݶ;IIiŲE6;v \<[l"${K2iquv�E"U43Ób jwH[#`\ֆbd�|m${x*fb:f _1r{Z5Ĥk^;/܎?R UX5t-ds02ְbbFfƴnc=>9dp 7Xm7.>2͖F4Hq;-\e*\RI|ߔ l6�[m.*� i�0 |h,VicZd .A$\z7>|4q:ڂb*nTf.l!/0\o՜kƒekmzqqE] UELE/}{86رetm;!-q[72ւmEs<F e1k/q9GC]6q}l(.VEMR#DxoqCec�MOR Q)Q#9.k] qK@DDD@DDD@DDD@DDD@CĈxa~ӿRXAԬF(pڪ L/Ll|FDGZl&Һ#q�qRi)ښJgUTE  62Coآhuv%SVxsZLι,ctx9|XuؠI4r,2�\De4�n.PU WQBf|�@,$eܻ-bYaW3dJ|S,,Iًp5 Qa5ge/:v4WcnD걷S߹%3!dӘ1ͬ~R/e4W<L\2΄pp`.z�tϦ c&-a%$ eZژ /] hԖ vekE�T 'PFʑGnVxc,nbc>n&&;%r5 /Q}T (( " d\}^??EM'}J N!]?X4}3basVfk}+$6ֹFдi5iSz9pXEL06/{ *; v5zUauSRcR{h$ �,Kvs[ot&m:;Ua-V= YSVSG# VOŋE3FzW~(g{[n4L3Sn?3bd8"kyh<B<LJVdb29ivwO%5OS-\>yZH/!4l�I�Z~!z<؛q.F]f>5�RZ56o%K>{63#˘Q;qp$N"%�q D.Bte ҹ]EBte ,K�sA\xY]._I\.f m6Ye1-W684H|kkd{$Lsٵ-|K'1`cqq}+q2Jte zW7K(Lҹ]LֲtYrK"].t%K"].t%K!KANJk?iVX尰زD1#{ gj<loKj"1 l8HB/b�E~DA+oG詤\}^??D,x#ykag.4Vocg&3ɓv 7\o"\&M۾ {/kIw̭LXkɻw5dݻ<LXkɻw5dݻ<LXkɻw5dݻ<LXkɻw5dݻ<LZD`i6-ιL|g s<7n&L|g s<7n&L|g s<7n&L|g s<7n&L|g s<7n&L|g s<7n&L|g s<7n&L|g s<7n&L|g s<7n&L|g s<7n&L|g s<7n&L|g s<7n&L|g s<7n.;"<m%22ag&3ɓv 2ag&3ɓv 2ag&3ɓv 2ag&3ɓv 2ag&3ɓv 2ag&3ɓv 2ag&3ɓv 27ag&\7n ,8+8=,_ة/Q}PADDRd~O�7#@h-u5t{&3_.@ێ[fo $=ng Dx@LMYM3͖9Zn[Ŵ)*:v+$ 8ߡV Sϲ-S߰݉u8op%~SM:F їn"[W>= lSCllla.sZ&!n8؋>3>Ik*2 p$Ϙɫs1�pi$_`ĥ"" S,l�k͖ZH>/7 L mtOai9<_jb)r#/؛SSPD`f'as %+a:/%+ݠs PPt[LoN6b*s�%8]ۻgu.Et劉ĩ}C;.FPX5S1~P,[qk p$q*#V[E@ai�Ӱq\ibLqܽ\ܘ{~.VFz_gG^]ii6vh**8fGY/2y^l]8EST|"b`׺{%1w^큮,nV4Wq?殺&;rbl.0%x.ë+dcY"mS5<ڰoc㺡^afaXRQy-@-xs͚'p qn+ַdDcmTDOBf1slMtk  )i+!X> 溲W_wf̵}`/_pf-LDU{sL;٢"""" """ C.?Eлd-b�E~MP?b " O�7#TxԮifo +-Uka^Ŧ "Zn.{û'n>˿Pv-7Gv\)� (P;û A<�*<;M݄û شA`btxwa;û%OltZ 䕗btxwa2NƦ`O h h@Zn'btxwaE_شNƦ UM݄Zn E_شNŦ UM݄jn E_شNŦ UM݄jn Ei<;M݄@Zn'btxwaP;û شA=Ŧv-7GvOZ?ߥ~Qû Si)Q 0 r <\do"NŦ Be btxwa;C'ބ�`v57Gvi<;cStxwa;û,W57Gvi<;btxwa;û,@Zn'btxwaP;û شA"]{�S�>} """ """ """ """ ""_y5B/(<W4WSIRd~81ce顖IWΎ O}ҫ ]Oc0^cki؂<q bᒠI tV=6=}|z&RdKA6q{N߲ekwӷ;>PP2z vOͩkI4Sq.G 9$m\Qս2:7yie.'tm.#!۵RZ(E1fu: "==+]UN$QE+*c/1fY b ^i?Ai!vWW9WcrKO`mڞ/W3D+NNf%,b" /�*M+1:Y0XҚMNL-!s͛ Wq}(:Me<8S\R*rD1)\^V!:ő'Y`]|_J!S*cU}SlOuL,\.웻>'!up_ivK#)")l$ W,%#˴Ljb=-\5qCSs`cdnϱh۸q:6TB_oE=45(ͫח>3 l'h6C @Cp"H<sju_ɎNh6>C֊cp+-[yOjhꪎ4SÄRJF8\ku$f{@Ll,|vf)fSAjdaT5B4Y+ H.6<{R;_K&`UUU<U.FkHFs $p~J~18,飊)ek$j׵b䉁{;z`Ӎ11+Z`zgñF)%0 sM16capl :O1#.mK*y䑱<0A 9{qlgmfhJp*+VTST!g".8>f7X4ȍs\ܥZU|].WHࢤt5t#ZKI'3.h6ҼWHUDh"h9SQHlq:=qg} wK!+0=mDY$pݮ4fq#[dY6 E'Dʸ\:ncʝYܥF7vPm>).ĹD@DDD@DD}nOgi[鶓Pic07HbfJ2c[-dwlpFJ f'jV2j#Y9^\ g4xmMܓZF1\f,Obݍ]T6(Q>/{nv qI8xֳIvZh^B:sGf]�a9/ I.gěKU's쭻gq7Lff#V+#|oe$>Ƿ.8X۷&ڭfWM4qzyN#tQڇ8dP9!B},omEYGW@?>m l`qAd`s\$kFW=v_|.8͈£.Iq<b)TV8FWC#NY,ne.7i&9ICTTQgt Z&|uY#)Vdkل񔻶;Ppx.Qr(2~O*B\TD@DDD@DDD@DDD@DDD@P?bXEAc'}J*i<W4W#3.G|8:j~&�W4FL>jGW6 W#6VT\QL=]=Z٦wp@M@^O~c ?I|Rq�>> ĸTwK{>/Wjjۛ6g\ q)Ť�I&t%Gq~][[?} &\wޓO.;IJL�Oڑښ^Q:O�.:'mg1mmEY#}AO5^}7&"q]SSr->ӨSSr n`Isrj:r~ig"cg"jȲDȚy+$Ag'Dcg'暶r~k$AjȲD䦭cg'暶r~k$Aj:r~ig'Dcg'ǜ.�& VO5lH[9?4ճY" ulVOd1ճM[9?5 VO5lH[9?4ճY" ulVOd1ճM[9HE;d-Eлd-b�E~MP?b " O�7#TxԮi ~]WOIB0`�̻R~&tE)&jx[R䆼=\cߋWE3UU,-\"^}ь|aS+VS( C@ozvRiqX4KXֵA؟snm1|i94�a{`�M|~#+&{()>`fmq{kl1kP3]nIAhl%�I4?=0oO�UFE=*nQNA1 Y#C2nd_ah eQ0:!tt96x  �i94 :�_ä›K@kY ^Wf77x0?Y]??fs7�]vbUcҾ[h\֌ /Ļm]*:jΔ<(4P Or޴P Orހ /Q}T (( " d\}^??EM'}J fB:z )>Jz .rUsnOYoDUsnOY2UsnOYHDUsnOY2UsnOYHDUsnOY5u\R|;L|;[|;L|;[|;L|;[|;L|;[|;L|;[|;L|;[|;L|;[|;L|;[|;L|;[|;L|;[|;L|;[|;L|;[|;L|;[|;L|;[|;L|;[|;L|;[|;L|;[|;L|;[|;L|;[|;L|;[|;L|;[|;L|;[|;L|;[|;L|;[Gf]IY """ """ """ """ ""_y5B/(<W4WSIRd~6";2w#j-V▨j-V▨j-V[1v_�AU<�<�ڋU<�&ha|s4A!" """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ ""_y5B/(<W4WSIRd~8l-+-S텵U67G(I qgwCnA$ 12^mf8`M"wjɴPH7n۵ 0(r^H& w٭p<g6}#ÑnvwMRbTq#{CH7/SXˆ$Η4/7xYfGVpzysrk o=H,\-4�OS ZG55Lԙlnn}RZ=<D0-scaTlpMFTl{ sn o^{8.H9 9M|^5!�g}ӿBsXn�uxSN \Ĺ@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@P?bXEAc'}J*i<W4W30- ZSt{oD5St~MT!߄|AU7HwMGoD5St~XVNَOB4j#C-Fn> )7F8YhA}KDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DD (*j_yQ2xԮi#T+tU1Fk2Y*&oTOBfAhu= ;gSЙPZ"OBfN&oTgSЙSu= *&oTOBfAhu= ;gSЙPZ"OBfN&oTgSЙSu= *&oTOBfAhu= ;gSЙPZ"OBfN&oTgSЙSu= *&oTOBfAhu= ;gSЙPZ"OBfN&oTgSЙSu= *&oTOBfAhu= ;gSЙPZ"OBfN&oTgSЙSu= *&oTOBfAhu= ;gSЙPZ"OBfN&oTgSЙSu= *&oTOBfAhu= ;gSЙPZ"OBfN&oTgSЙSu= *&oTOBfAhu= ;gSЙPZ"OBfN&oTgSЙSu= *&oTOBfAhu= ;gSЙPZ"OBfN&oTgSЙSu= *&oTOBfAhu= ;gSЙPZ"OBfN&oT/Q}V&oUz L6$��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������flask-peewee-3.0.6/docs/fp-note-admin-2.jpg���������������������������������������������������������0000664�0000000�0000000�00000042557�14605757052�0020347�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000�������������������������������������������������������������������������������������������������������������������������������������������������������������������������JFIF��H�H���Created with GIMP�C�  !"$"$�C�*"�������������� �U�  ��!1ST"#4AQUa2Rqr3sV$B5%C'6Ebcu�������������5� ������!1AQRa"#2BSq3� ��?�r8Aw952SxU^!$Q%D\#gFgڥѭ#jhjat-E ^JD=:QI-)è:e#v4ݮ�\7; zZS,AZ&7׽] +],/1Lt,Hc lAcw 6|C:_jXv:`Fbaa|b?4Z�&v`V;0h%.q _0tEs&F&;kTFBgtJ±\X#Ũ*(_Q*bl-/e¡4c n$in& -]Qr[b vh%+yVyiiufElP5%K ar j 4N" c;2-nSvaw:?ا$/(`x߁i|n?ũph*4KG!~7ؕu\{b{fb'EkH0sfZ؛9m*Yf7]$+͹|߇Rf*:k7$j7H6t2XIlmE_bu/_Nc)-x!rL0lkNp6Nd+n-hC zd%^8"G7Fi&k 9,rG<ݏ17c=ctd]>E4E5F X{+[y\j.JtfSA7OCq#QQM iKmKk!ev%:C7Ȧaڻaax^LrX4TMZ M4!ŮygS5s\ō`SYaT8|51F"Cpdmni@ͱ+B7w[Wr�3* <fYZ#!E9yXAeϿOnYLs;E<jrdqOTTTXHBYb` 5zk lFda1KL!Icg&^8g�rhOa6TQ,dFPkJ:3e7bHW |J jiTGˑ겗<op33g+_8Lr8Arlg)|3g+_8Lr8Arlg)|3g+_8Lr8Arlg)|3g+_8Lr8Arlg)|3g+_8Lr8Arlg)|3g+_8Lr8Arlg*ZF)L60OVp-QuD.5jV0i^1cAhl/_L8A�7]s;-\d&OAt y2B CZ?BOш<_/~V֙:AzO-7va2Mtks>fޏ2HYO<6M#iWj),3SF}!,= uNXٹ.GT|^>{<`4�Of - ;uCfE>ٚTj,nX()F4`9@7Qȿ�&lmLNiT tu3ql3&p;Mp5?{sc4q �{ɓT}B)ꧦMM<:ՕtuDt y7>G*>QƞL|h<(1 d J)ǹv�5S&)ZZKMa'%Gy2rQJTq{*%c{ m)eke~y*{]);-ogG*>QƞL|h<"ʹۖ24y{|꩞̏i]ϐ=b'%Gy2rQJTq|Y$9qsJ�m��eo&NJ> Q 5ዒw4u"�XTq"|mk6+cT}Jy,rA �A2}~,rA �O%H>Q?=lݛͽ.B|9 Gj'$�Oj �p׻� `U�oFKG*>Qƃ0/y2rQJTq'%Gf$>K~L|iG*>QƃiG*>QƞL|h<k~L|iG*>QƃiG*>QƞL|h<k~L|iG*>QƃiG*>QƞL|h<k~L|iG*>QƃiG*>QƞL|h<k~L|iG*>QƃiG*>QƞL|h<k~L|iG*>QƃiG*>QƞL|h<k~L|iG*>QƃiG*>QƞL|h<k~L|iG*>QƃiG*>QƞL|h<k~L|iG*>QƃiG*>QƞL|h<k~L|iG*>QƃiG*>QƞL|h<k~L|iG*>QƃiG*>QƞL|h<k~L|iG*>QƃiG*>QƞL|h<k~L|iG*>Qƃjz u<uZ~@G*>Qƾy2rQJTqRKE[/Y17a�R~;le�&^J> Q4eP^v}:c8ltX3iC+3XKs0i-i �us WAy(%G*8ɗT}BV=+ծqTϢ3IyCo^Jf͗mo&^J> Q 4d�%G*8}MmB3Hb{Cd֮m31<k~L|j_sf_^qE�'K ?4A޻UT޻UG1QJV44Xt\rW7i扊W,qÛ&v<Z(xw*\{I-hpM3S3cm\t*"GNڭUSC& ,&âzgor\#Q,imLxTQ=kCEOFGt[ĵ6֊y\ O^,\m]bX-CGehUt4UM9ˬs:-32*{p_T}(piP .*\S=+Z*adk]"r;Qg)ZX&ZDD0fz/[Zeո:=#1694ԵfoX{,T@a:QZ0Ҹ1oGda12VG4w�qobߋ-YL^Lfg*E}@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DD9W%SM~rDA7oU޻UB[G@Z@#AѮ�ef;!?[cd۳}zJ?GtZ 14V;_JL3V| /i5TPRi.! <؁{:ls6  :} �^Nv/+[A41`k堛4q{MG\z?2hXKllhtԆlmwgB8X I0hM?d`4oSh趏hF%56R6냅덛OFĞ"x|<dy6QRV玩qI ׹qe_n-`G4m^:� +.xS ce.90l;E^ 'a)f}sFQb"Sh/':3Qx$tu6I!oy$k^ *,KSƘmQ1+\ s?<*}J '8ƦvŶ�crz.[0"q'lZ3@'#;v{°O+Y5 LXM]vtl*Dc2xCϼc^rUV<ZQg};Ta>WFpUYMRCL0YMDTE6K97cMI}]_ɮWh}.Tq˃8# loAFņ]5È?\TlBK|ٮMMͬ/`�u|i4oJtMa^ܵ2wHI6zO&i"se-3@*% mq9:42m kp)II%!|ٳtbĴ/Fq90, 17-nyaj fw|]Y�^�rZ]=E|vX䒴D5.{6 Ғh6>v :Q?#˖f$]+ : C각&]U.Qđf'ڑ)?#h}<nq=$ৎ8{`(""DD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DD9W%SM~rDA7p:=7p:E+j.yzxT꺘w3u0O AzxS=WS\ =WS𦲫zxT}daޞUý<*dAzL]L;¦DaޞUý<*Wt_AsuO k*wN Uu0O k*wN Uu0O k*wN Uu0O k*wN Uu0O k*wN Uu0O k*wN Uu0O k*wN Uu0O k*wN Uu0O k*wN Uu0O k*wN Uu0O k*wN Uu0O k*wN Uu0O k*wN Uu0O k*wN Uu0O k*wN Uu0O k*wN Uu0O k*wN Uu0O k*wN Uu0O k*wN Uu0O k*wN Uu0O k*wN Uu0O k*wN Uu0O k*wN Uu0O k*wN Uu0O k*wN Uu0O k*wN Uu0O k*wN Uu0O k*wN Uu0O k*wN Uu0O k*wN Uu0O k*wN Uu0O 'JIF,Tzߜb&(:o]w*t*zo]w*t ђ(g%8k"ak^@$ofUCOA zVFg{fM@Ʀ\vcO\'HS|z`XmOco4 o3wop)9aZ=.yc /vH|m*Y[ nula>4G1* fy] UsUY6a` ˛1ņV UbTTX4Օ,u2ٶZ^CyoQ7pV*e4Թ)suG&\Җزkq@ԾxX6 I+\5cl 4Wi�ѲDN#.۟V'y~*jilQa#ZS5{�rIzzG1nLZߴE3蹲q^g8)#ܡ׽I$aJ%(D!2uX0Y˓.>I&'㏧cҵä:�eRgIs?6HᚩZZl6]al<ݖze̬Ѹ'ݬtm/{rch7kppj촷\y{E lQ=.k\Fwi�oQh$P:Hgt ,1t7OU;$ck#n -9ÜcgJo @m+X1͸Yb<ͅkkgvaCں8Xkڽ~Ax7`A Y�XZmڽș=):)&s=gδg1H=ibXjhByP硭E-� |&ŵ58kJ),� Q֘l9Wѻ=c35< mn[ؼcAiv;3[ъF,dqͷ!=XȟX.<4gJx߇kj)WymX$Lu#Д=LKN@D.mQԍem[22 9ظ7H0RcUc*!:bj`vphd$ٷ#5%İB MԸieCfBDy?:٬nIz2?WbQU!J`-}i{ӜE+dѻ6K{q"" """ """ M7Mʹ*oX" vߤЩvߤЂj<`%A�P~ϮGY<&X]I'}g '|_|N7s8WLnp]ҽ:EX SY߈B,lͫ-9lHt=+jdSw3|0Iڦg /4Za[/YK͞M�_|q>+#Mۡ+=LnpG=�?#s^lm?wM�n�MLnpN7s8S(#{ax͞M�n�ɷ�S�)Mg }�}`l=yً:VJh Hcqv_mmuF 4pS'j)Mlm{g6MCcC\e2(u2š{\XS"S/k)"S/k)"S/k)"S/k)"S/k)"S/k)"S/k)"S/k)"ԕH*ߔg'{\A2(u2š{\A2(u2š{\A2(u2š{\A2(u2š{\A2(u2š{\A2(u2š{\A2(u2š{\A2(u2š{\A2(u2š{\A2(u2š{\A2(u2š{\A2(u2°Kkϐ8iX澅%ޙ}TzGOcx>UXFSkmvϝN*Qt0V _;+v?n_ONږ׌]:ͭzMzWW`>;lUPUuD3Yj}X.#�Tq*pY MscF O>Nk4^'`pV35^Ph-;KhU4ޱ7*iboPb3?~B?~B� \IT<h q}o&w]E&wC]b�tKOR?;K[`l˟` eAED^_9ֵ$5:B81]qr6e hV %�`vm͢kkE+ud8f{\:6~6N=fzx3m5׵ccCuS9}<{vfi$txtk@V~6@-k{t#Gus:3"$ClpZs3GRaRS 9!nP1X9>j띇ۻkץ?Fj?6ulW19̀c u{=\ Jjj`;<e׋ c{:6E_ɖR 4sT1ΚY'sj5^e\bW)°/y!l]Q$hZ~|kz3<S;\"Ǟ nao?)UZ_IE%+ mINe5r57=� ֧?W1X_##KIs^bE }9Z&MHy\nL? k : KQ<:8Ʊo^OF5SO$3VZk='٢{ok]e$Rje/vI_+]6lII'b]�y*"L:g[WNCsXg͞"em~V+Wl3ùXщ5oK< M yk  4+I%t&ynA)m%iCA C$"Fk&-- ֌�k`۱\'eg>G� MSZ,z(4ksǻ,cl5ocaL&|"^Xd|k!s -9HNUQE=DX.ƞFҰ:"\m$ۤTr`5 h$pǨi%92KI*-*zM!jjjvQB|FsRiV[PCM\(PMS c<4˘.8Wb1]WN)Ũ.I31>ے�fڨ<F:X20:h7#^߂.Sl:i$OGS1.wX[(cv0 )oHG&)AcyaV_vwf6v(5՛DM<9[]uryUSS:jJ<>:+!o7G[%>wtGB+p|v*观({}2E=~d.o;kj4sI ՙDDD@DDD@*oXrU4ޱ7(1DDzIWSzIWo쭓#V|~-X?_6w-wUM<:fŹ6fx?A'bޞ1oO c<Z9A${=dq?S~-_W<5ϜOŽ<*8�VTMUUOPꨝIw:P3eAXik~XʶiӅ8zxSOŽ<*ˣ'E3ZTU4y ܫ(iU &y֋ĝ�ot[׵'bޞ1oO ~)3 *6ӴC;=u©hb蠤.yjߛn[Gk{OŽ<)'bޞ[QtF55;Z}S胈 .ݠ�'nh۩na$ff65${%OGnt[9L[ª?5n)#w8m;u $s9-{H~=F+ECQQCW5PI;[#{ei77q([f38zxSOŽ<*KTO5%AjApl A{iYWSS&Q#ccgc&<%'bޞ1oO "8zxSOŽ<(~-Nq?S s9L[ˆ'bޞ1oO "8zxSOŽ<(~-Nq?S y2ӓ{$wM'bޞ �kc]X8/pkl~\ q?S8zxWf >J#|l .-y]mc.'oȭ| t 77o ~-Nq?S"+'D5 7`�hn6/ -Yě4Q͈?X%ϫclٶZ>-yL[œ~-T~}dj@3s -pkH6"t봗}-1f#h7%,.z=.9L[œ~-U5Eb҉X@qe�K\Ͷ6_kq2M%3Ia{" cs9B2I:MyL[œ~-T`xuF!OY2)0fUTn$49Nf{:yc9vhh{ pEH9L[ˆ'bޞ1oO "8zxSOŽ<(~-Nq?S s9L[ˆ'bޞ1oO "8zxTs+ֺ64kcOQH�XA """ """ """ """ ""Tzߜ9A" Λ`]J*zo]w*t &�w-1-T/y^HsnI?+D΋{_}'R oKy{ݕ.zA#ڶV>{|Su/o u/ozN1�f'LIΘWP 2;o|YǬ _jk9mXb\7sQU_S(!v:z"5dx6kv{A b;pj.z,ܼٶsKln|_zN='RNѩ336}8.<tzhX+qLxyp|f%7'NCD<XG&GR!pqnW0}evbA [:KNJԎLs=h4xcsQ42(E'0qRWlxVY &_%8{cRKs]8mN='RZ2iv8 Ӽؽ@%`7E FNpZ3qmĪsD4hg˱׿+_ou/):VvYe҈<2.tԏA-[l:Kє 4S8IT47fpZѵ6+IԿx_<R6gric:='R.̑c:='R>{|Su/o c:='R>{|Su/o c:='R>{|Su/o?ʧLp|C1&i-;eC,}$obl$Y= �x}K⃋h ģ|18iub9' ־prahqe  }x s#nlp,#'_Zu/ozNADZ[Q ]3J$dq/!\IfPLzUU8ϸ �f=+NOIԿxV<bl:l<Bs#k^r$+<sG%QY8&zVL2@1 }lE礿_<Su/o;MOEpWG2詃5o9kslgY qՅF#*J*U-#i2EXĶse_Kqcqq ӢF<s3t3�▆ P M1RNOIԿ*FHK➓{|PdIԿ):HK➓{|PdIԿ):HK➓{|PdIԿ):J9 /IԿ+ esF=>h7 DD@DDD@DDD@DDD@DDD@*oXrU4ޱ7(1DDzIWSzIW 6lGU@6"]lZm1>V#q? ed��ja..ZGY ؽVB8H\;1ǫ0JUa8blkĄ8mZ~Rf8E8 c{3WH9K+`^ӶF�Zy;GTN Q%i{d-e\K.M. #V&#ܣ^gsᏃIT`׵#\#cv#XJL/N݃Q_*ӪcdaRsIt\ V1ȺG1C&C妅t#9lkc`k|'O9n[Z#vS06VΝ1�Ǒ`Ii{1_Yr]iMSP!)t$fg\caaب?eiUSñ:|NgUecb-ToTּ<8}b]3΅Z?D+b.Ѽ'J*%cj5K _Hι2ţ.X 5+"iM3d )?)\_G ÎSwLNd-1,l�(9z.tRb/?EQEtl5`'>7/6pF'i)'tk#Rȃ/xmn \ j?TUf1XfYlύ {6۵ՠChƏVQMT.<tݺlOd4gCM.q3b6(l/:4:@9ccM0ѩpJZ:&2{L`\]{!Αp 9=]SN>X顊hrLL-6b1,7qMJ1 FE]DkKv9k\n`HItgK1`V1tQT&E3a6!s 'i+ya'PV"-^Ly_6˲ DDD@DDD@DDD@PVŏ:-, "@DDD@DDD@DDD@DDD@DD9W%SM~rDA7p:=7p:@][?=NfկFΑkv-h##q\. mMDq@q &b8N"о{�8GG~qЏVB%t9eǽ ?:ߨCğ�Uh!N}{NS?'';kM-qЏVB$�8GG~st9NV,qC%E?#CZWBI'�ү5qZHSKRцݛLuQlGճT[ؙZuQlGճPmdjeg>҃k+}MT}[?5Ql=T}[?5Ql=T}[?5Ql=T}[?5Ql=T}[?5Ql=T}[?5Ql=T}[?5Ql=T}[?5Ql~9L@& v5]h6PB>e /PB>eL}D@@5ocaL&�iboUTzߜgM~.%\{=7qA'6w/8rRIYjl/�ƽ�]l^]lc Q�?|^,z?+f/m~_3is_٘ �0<48%i`ӱkiiJ+395v`I9.{)+Evΐ:2EDV4^tR'y* {075ń?e6.T&|ZEj<OJ_[+%4홲f繠77\e#t$%7!ї/7S~i|t vW6K6,5q?,L\ 9"~$VU:b溍!0 ؆fHo33"o6a nn2|O.l̐�}\w5!8I}WK 41kEϴ١zA/>:�-w'~k<36N�r^DDD@DDD@DDD@DDD@DDDA?o)0@DDD@DDD@DDD@DDD@DDD@DD o[X�XS(kr DD@DDD@DDD@DDD@DDD@*oXrU4ޱ7(1DDzIWOM~.%\rzgr=!f5KK^Z2gc`͛$ _�uŧi]U/]Hţ.>խ_lK</bW>/|4.+|۽>GLy?_{O' دt|+^wNi]Tzw(~:c�+ y?_{]"˾sH➩OyCg-�T@ՂWnaԐPa4-&$`/4.)"˾맥M?dڶkMyp|E4.)!˾\|4.(1E4.)!˾ Qe!˾sH}YsH}|\|4.(1E4.)!˾ Qe!˾sH}YsH}|\|4.(1E4.)!˾P HANkޛ~�߿9zmPNkޛ~�A:(9zmS߿Nkޛ~�߿9zmPNkޛ~�A:(9zmS߿Nkޛ~�߿9zmPNkޛ~�A:(9zmS߿ܷsX3 iPL """ """ """ """ ""Tzߜ9A" Λ`]J `]JU4ޱ7*iboPb3?~B?~=5*sZƸXi. =K~°?8d,X˴6O�gR߿&𦥿~O*jH\$ h.s9z 2uC0 ăj }K~š7V P^%|yk;c@ۿ_hqGWE 9dfaMVb b [keg?$,-YMK~ªjiCE.C.?cc 1 dtQ4 {}HAsoߓxVda8Mt%GM$Lds'I=~�U4ޱ7*iboPb3?~=`]J5>ńG#=[c`܂]E`ܜ%E5orsX: IOY4PHͽ5or lbշ9[{Mkmt_�ݫ.kVpG1 �iboUTzߜgM~.%\OK~cJU4ޱ7**i}b_Pb>8^%mt][?ݷ5ս" k{kmMuom~|][_o"vVݷ5ս" k{kmMuom~|][_o"vVݷ5ս" k{kmMuom~|][_o"vVݷ5ս" k{kmMuom~|][_o"vVݷ5ս" k{kmMuom~|][_o"vVݷ5ս" k{kmMuom~|][_o"vVݷ5ս" k{kmMuom~|][_o"vVݷ5ս" k{kmMuom~|][_o"vVݷ5ս" k{kmMuom~|][_o"vVݷ5ս" k{kmMuom~|][_o"5#4_,-r~gھ" �������������������������������������������������������������������������������������������������������������������������������������������������flask-peewee-3.0.6/docs/fp-note-admin.jpg�����������������������������������������������������������0000664�0000000�0000000�00000041357�14605757052�0020205�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000�������������������������������������������������������������������������������������������������������������������������������������������������������������������������JFIF��H�H���Created with GIMP�C�  !"$"$�C�,"�������������� �T����!S1Ra"4AQTUbq2#rs$3BCVc5E7Dtv�������������3�������!1AQR"#2SaqB� ��?�2A );*Ж(E<E:18 ҮɬjhLb'@̄_�. 0eSGKM;)%5}G^<x1ױ\s4x`Y=5UsᩚX)PKYd8� N@_1b5pt4HtrCqi= 8yK*jm;IWTuB$b):�&q &,+2e$KbҐ;e0Q\ bc& ׂTGBgKMlYVvZNmL"vߕU&ifffc=wy市<&̴h2HeJjr]q 0"x `6L;6pmighlV[b[s[89ИJ !t2fF1ð;mMc#pɫJjz-8: 4BG2pӋƯu5Ovek#[(c3PL]^[yMkH3Sb*_?~W ~ͳ)KGc01pB j3y?9ZLZ<z�(+{ɵOleŕfUQj&`^ sF4Wfd%eWgS[-VYcCS#%y1lXLn)-ʘ{iZ?eٖKmOOSeKQPϛ[N<kCuξ19(ɨAMv$79<fg!,Mp-T:,$淼qst.˜WpMeTڵ~h_<TɎj Nzl.{7$<a89m{uWMg[L`x'lAFx+F- #uG7VX-}hlw P$[ny췖W#Zi&݇/u7yMLe}u\E[ nv K#ll�8gɋ*' K_< މKDL:/.* ?+z/0l}꾺%6|sQ |e4.ećH:1eIv#XFa%i2u/rO8'Lec SXc21V>0 e1&0#Lec SXc21V>0 e1&0#Lec SXc21V>0 e1&0#Lec SXc21V>0 e1&0#Lec SXc21V>0 e1&0#Lec SXc21V>0 e1&0#\86rxY iB30&d-ל:8ij_ZLTxTt?5ep▮7畑DGTH1Z4 Hi_Z 1]�_[ZSq_ZKx A銟o_"׍ es/ !ڞ^t A:))jIKt4 po{/Vyߛun#=/ߓBbƴ[ش\NlA+ ;:Ҧ 4,n_r6;"_�̃�]~F-f5kvbg㱔V8xLaxW謌e>01>?fL_Sf˪ăo!=eb5_?? RR' [ZB몞^ꙜH2IyyOM=<&NJU m:,Ҋ$3ξAv{UK Z \G ݽ<&NJU *f9#W��;kRg㖺Gga nJU's%~xQ Vk˞F ti(ʇ;yĴ  yJU's%~xJj&+{s{LĚ?s%~9+sKMUq q̺-/~^H Ua?w*Gj ~| #H� Ay#5Wiܫ'As4wйo~w*Gj ӹW?CUOƃSw-=eIqs,zHП[_j~~$.;;y+MWĝ<&AB^bs%~D|H<1xw0W蚯;y+MWăSjs%~D|H<1xw0W蚯;y+MWăSjs%~D|H<1xw0W蚯;y+MWăSjs%~D|H<1xw0W蚯;y+MWăSjs%~D|H<1xw0W蚯;y+MWăSjs%~D|H<1xw0W蚯;y+MWăSjs%~D|H<1xw0W蚯;y+MWăSjs%~D|H<1xw0W蚯;y+MWăSjs%~D|H<1xw0W蚯;y+MWăSjs%~D|H<1xw0W蚯;y+MWăSjs%~D|H<1xw0W蚯;y+MWăSjs%~D|H<1xw0W蚯;y+MWăSjs%~D|H<J9.{D|K.JU)<z->_u˟,igs%gDKG�n^}/0QTtRSZTL@]3{a#o ۖg/Vw1rW蚿;+M_ī܉TL-fcr^S+eIYC 0T2W Ciqc1rW調Y�j~~%kګ5Z"3{9gMz\>ڽ_j~~%90eL˪ i~Yyxj/nw7re躯wM7wVt-=7wVă]IFrowAcTXt|ﭞHm\Ox qګ+7'/2MsB(9Ms0ݣƣ'nQleaSndrq"/Z˻z쬣,B'[sJ{bA:z L/E\reevAGsMGfFyNkk!.w??ViWsK%EIOn\n+r;FdàۓSAKV"x4\�\0sb'3˿`[6bК^ѥiT^믡&jYܖ}nudk.kލ_ґ9BeY1-! ݣҳir&jmXEeOiŦ:A#7<~K/rmvlvL=tTޒ Ea^[榅]a*4-_H# d\4(~?}nç N`+ni[t [�k2 ^?>=1ͬOIJ*(_m(⽴ {ev^�ޱ^̬~PYƱt)䏛~=A(EdZQAGSmasq1t:<Gf?^Ϸjlɦ�+A74q]}TbXpC6KdI;bkCa4]W}'!E<uf] Hǐ9; ҮɜLڋƱ`ZKfnq.vvh$<3q9'tMhϝ3P,q-H E|l]*u3ɱ$c-}B++rZ%%_7?=<I%�渜M qV&y3Udj#Thu +gLÅ'K{nix)濼gp'P?bFe-fZ&u- LCaʽy)`啒'(]YDɛ8TI/h csIN 6Ҳ,FĞƬd}E;H2%4M!R#Rز-9(ۗJڱ"ct �`i;E6G\h^*X)ŏ#lhCN@jL&#iBXst𸸸\^47thUd%Y5a 2aQ)% \C"�?_Tvy<ӓy5aO)eQMeRkh0GX+�9Ҿ(2nDl[29|عq]IɮEUNFSŖTYs'bk_iczG"2b6 '%f'C7_S3t�]?p�|=O$6M+-wZLmغnp@^!rZ[BݴeSofns;ګ�$jr"<.b.s(cv?o#yze3|�&\III`*ZXfccco&p= iDrBDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DD n~?}hti[дi[ЂPF1?+u[UU:T{C­DbG<)UJz jQhxUQx5Q cG<*A^:T{C˜5Q WU*T{C¦}ːAA^*T{C˜5Q UU:T{C­DcG<)UQX5Q cG<*AV:T{C˜5Q UU:T{C­DcG<)UQX5Q cG<*AV:T{C˜5Q UU:T{C­DcG<)UQX5Q cG<*AV:T{C˜5Q UU:T{C­DcG<)UQX5Q cG<*AV:T{C˜5Q UU:T{C­DcG<)UQX5Q cG<*AV:T{C˜5Q UU:T{C­DcG<)UQX5Q cG<*AV:T{C˜5Q UU:T{C­DcG<)UQX5Q cG<*AV:T{C˜5Q UU:T{C­DcG<)UQX5Q 厔籍'�@KUtZ>ЂDA:o ﴭZzo ﴭA$QOhIDlֽI}&-ǃn,7}Ku2vt#)2bܴrޢX 9 fFit �;G k(3J-.,F.#\}ʸbK(8lI^ ]z|2s'jMWs<fXɦP#wHeֽe8eS!y49 خ7]IcIn|UMeFPKgJS$oa\]wEtVBݑQ=Ml>XG%s8I+mvFޑpN7,rS?EkF"o|ܺٞsyGqN\OW JkOfh*z؎˴s ,Q-7- ʬl ^g(x\ooEvݢa-%9_<]RNˌpy/3r˔4ٍ5 |fZhV.tgl!J�ddn`.yxp�5ܫ\ܧ-N*c_<hshI L$tݣ�C:E--;7-ttk(k),N{bhkX ZAayMeC.yx|>,'Cc-l?\A\ݦf:$Ӧ<x+3ISJؠ2D=i٥{r}$q6^jF:jw6`k@~[nMו;)�/5Mjbg?#MTz&=cVRF%2! ύdԿc%2v{]tq;tCM} m`Nn6ΌePޛ+ мc۶婗yg-ylJz*rWKEv>E;W Z{*vJeMi+kl*_;(hkE9=eTb�\/+2UADTMem9 p^^G_AhnJUUE5uOQm+#{)sbq-hayzVނ۷,+-*`@,%M񲕦7"ao˟v@}�SZiYPTۜ$31 !8GyK@t"2""$DDD@DDD@DD n~?}hti[дi[ЃWiUKR'K׸ )Xۻm˜D5ݤN<ֻ7 6nx1u4sXwnLֻ7 6n+6PdcTU2[BdcyKIZNG}N]vZ抢 LWL<,E`YN<5BǏ saq9Hv/&ǔ>7疞6�yi{k/kԸwnLֻ7'CP{]yi{k/i疞6�K{kr{ɴ<qO8kc*(@G $/O"8$1kr`~pkv]cGh20?Zpܘwn\.C Ɂ{E ֻ7&]M0?ZpܘwnA4Pkr`~C Ɂ{E ֻ7&]M0?ZpܘwnA4Pkr`~C Ɂ{E ֻ7&]M0?ZpܘwnA4Pkr`~C Ɂ{E ֻ7&]M0?ZpܘwnA4Pkr`~C Ɂ{E ֻ7&]M0?ZpܘwnA4Pkr`~C 2  =.*7_z.Pqqq$֋+2X5d&ͭ9vb=)9GhՏI[fQ2y)_|8Ju\(r[j>-q][`r k,*\]<0GLelq{ɽhʰK:Ũ}KU-<D3\ M[?Q<4�N-y7%’]" """ """ ""UtZ>ЂDA:o ﴭZzo ﴭAC|6_zs%UIa塯sΏ)ee[?WY(y \ c\?xdYJlS7I.cKZnq*X|Sӈ呲?\yʲURwk4;j5RCYM=ѫ�)4{ �kHӛSvNChANV"s*MD|<70?\.{nolt/#5e|o=[&ܣ7&/Q eM-\{|[+҈˜]y?6ۮQnη[fNeF=1Ůc:[ >97Hy\8I.:@LDB�o'�й\7r/7z ZE+eIpcok􅒉'( i92gdΝfql!x7hq zoq&Od<ђƲ|Fq9oUyilZ*jW*[>:gasߣ7+̩,)%69OD%Ü�In iҵs1TgU"&bf60mx4`{g6Zzqѧ]gtFZ3I�q+-<fz+ByRKY3F#Èw.xy1%Pвyd&i14\c\t~ckUQLVƛfbKCޘZ|TPE7 ,"Cm3,q^]VH49STWA-ٞ<F@" ow;_n>GBp4u QWGj*:hB 6kҷi6kҷ$rI#+_/<o*YFQl\3\5M,�~/*5O gvWx9A <J QqQjxQ vWO5CX!q�OX«cQqQjxS}e|qDe{ccsph$" gv3D;S°a왱6 #4kMqӠ%Uj/8@<m$aҭWryFLQZ4GbZ֝uCifB׸1n3xʈ&f"3,QqQjxV͖g0vJ&t8$~\$YՑhI5O3k"x`Ӧ. w*DWL2gv3D;S°-[6GS]r42^ @V-JDȣd,sM~{rgLv9FLQunXs%}mM: cpkIHdSK U5I9"&(i ?F]w3D;S™FZl:{n:5 Na..5=:�\o*V[*ئ艐;C[{7~JʻSgv3D;S´tWaNvU95} ~22ˢqx-I:uaF0W\ֻn文7F+uudvT6yFLQ fȤZJ6Qjo_tCƠru,ԗV;[7C/ŇMiQT]1[,QqQjxWrTj!ڞ*5O "qQjxS8C<(FLQ gv3D;SˆTj!ڞ*5O "qQjxS8C<(FLQ gv3D;SˆTj!ڞ*5O "qQjxS8C<(FLQ gv3D;SˆTj!ڞ*5O "qQjxS8C<(F\:i݄:( yzG\? oBpޅ" """ """ """ """ -E_Oh[u+DD=Jx`+p:adSW1-\/VqV\?gCIȹ:lݹ6;_4N 7J1ԓfɏԓf$8I6nܘI6n܃Ы;"M*0;ۺDZǒϴdί|g�:hÝ d]ݦF-zZůNiWO%?<^in+}^=ku$ٻrcdٻrӤy#Zdu5d0fwhp?A ñ5ڬ 31:G&y4y#zݹ1zlݹ_]2˪ZppYm%C8A uWiٲ[ 6RF:<eq]qGl^7nL~7nYעn'dԓLc9%5c@t,m%}U-ځAM 2V:&p\Ck@7/:lݹ17nZի<i-Gcmү,Z> ak݌c$ jd$gdS �9C'// I6n܁ޤ7nSEZKUNf܊|tniF8:'w19hA ɸ,ɉZS'rQ4K@xY6n܅,�r.*il N!Ue8: 11=t,K3$jlڧURAmkHpn F.:/ihс}f?R]&?V])8[Ó"zvB-JFP*YvkX)$/ߞe.i~ ''=f\t"k54571`�^t\n_u$ٻrb$ٻrjx%OȺ_ĘaE[KQLuIkq^ y9UY)$ gO6ry9fͳ}'�8n�о&ۓ&ەgSvg3)5g:ͦ|..b_wzh@$'JP:lݹsԓfjjic($ٻrc$ٻrE~7nL~7nA$QIvIvE~7nL~7nA$QIvIvE~7nL~7nA$QIvIvE~7nL~7nA$QIvIvE~7nL~7nA$QIvIvE~7nL~7nA$QIvIvE~7nL~7nA%7Iv:# ,#;f7roBç-Ut" xl}nBxl}nB �-3Zd) 8ockHU*JifZ"x֑ AİK/c"ñd\okd!71f \<p" U ӿ�]Щ� P_p\\5W&PIOAD<qw{^num 5hEb[t'8̈́�q8U9%eU<jaC Hqoʃ-f*aBakozԾ/-z C#r]pK3(,,H{nΆ1,6u7ޱ:z{*c*#-:KHi-=7[O.wD|Qp\[ٌFUV> gXFwD]ƶG8&q 윧6tRA2pۡ_}zĶMP5SnK p_ʹcms[nc.uدхjFW;)k`\EH.}#u^/.Jt٧;Uݫ+ YQ|OxBȮl:{$^GKXmm'�|&C6Z晛/G�68oBc쾮]w#'mJӺ1iS#xp,7_7бlQڴukl1 K i%X?8bx~+ຶRJ\eQ:Hts@7p-i }g?;-t6ś8Z@4m~#M V\3s4K p]mbŖ4dRASC :Ό}y踬<re{e/8{MWbË݆F3jq'n p-NNlMg=<X66<[e1òތ"\<\<p" \<p" \<p" \<p" \<p" \<p" \<p" \<p" \<p" \<p" \<p" \<p" \<p" \<�SPP?oBpޅ" """ """ """ """ -E_Oh[u+DD=J=J3Mlg}(9tLAaZV%6Ϥ/L37_҉Ct� _d_z~7~~b-7n}*/s$/b[̓oM:*UH?t?+AI^y'{"ޛtuK0�z;c%jY{kZ٣$:V6xa"sZ `i-L֛م(g\` 5xa3Zo7ffRji-L֛لW&q='ʰZo7f5xanuX i-L֛ل0y[07ų3p,ji-L֛ل.h>Uy[07ų3i-L֛ل3Zo7f5xaz, ֛لi-A5xa3Zo7fgi-L֛ل3Zo7f5xaz, ֛لi-A5xa3Zo7fgi-L֛ل3Zo7f5xaz, ֛لi-A5xa3Zo7fgi-L֛ل3Zo7f5xaz, ֛لi-A?7 5xapiik `<{z+.Pj*:hBۭE_OhAZ" 7wVĴi[ 9<5�g^Y맏{N1<1<MO>R� l\˴9R. ?zd']9*m3D�&G/#r֤do}\ln~4OOEQTV|lqG#P07]{ZoqxtiځKUpHg$đcv;�i鿽oߧGſTN"O!N>JYt9Qe+Ʋs)8yUARZlc 9ڰG\A,e9Ϩc%] *1G~Quuk d j[RhJA f^>< T"޵͊åM.f_L)p1yn;e::?pu|>y\�nq79^4AWr*G͑,H>97o$Mk~#h[ofp6:y7^M5O fS5vS[bx�"/" """ """ """ """ """ """ """ """ """ """ ""MBMB .W \""" """ """ """ ""UtZ>ЂDA:o ﴭlji6kҷ'uo)|ŕHru4kg\Z[sه@7x}CEȣrt܌Utiuwjĺ5�5?u?9ré;G=#皟?w<�Ʊ�ܜ?:ߙH:5�5?u7'05nNg{ôs>yJ6Yb/ &b "2ɤi2ֆn ;�=w7-m٢wc=^1לrArs�嫉S]�MArs�E>`uܜOw7'0:nAS]�MArs�E>`uܜOw7'0:nAS]�MArs�E>`uܜOw7'0:nAS]�MArs�E>`uܜOw7'0:nAS]�MArs�E>`uܜOw7'0:nAS]�MArs�QCV� K\DD@DDD@DDD@DDD@DDD@Z>жQWGV'M{] OM{]~?}m֢ç N`+p:`+qA,O6uIw"瘗'3"Ria25�/nyPYK{œľy?+օT➖ Ӥbyko }/a~@F..??m1A%Nb_=-"e 05,m^tHoh鿤xm>~sMk_]w@{dEd F1h9E W�?o<ľ{?)Kµ6DU,sZcltC n{h dZ <HNb_=tϐ9F͚Iַ`|AY'.�ڂD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@Z>жQWGV'M{]-=7wVt Lj&�zc/qUN7]{Z~9zڝDC "ǐ9ne@?/ث߽38;wA'SӻDq{;or dFC^Obgnǭۿz � �Q Gn(JDFy7:(zvtQ'oP߽38;wAs_mp*\_9zڝCLȟG+]D@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@Z>жQWGV'M{] OKJD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@Z>жOUGApo+EmoZޫD絽jLOAn{[֧kz�ުD絽jLOAn{[֧kz�ުD絽jLOAn{[֧kz�ުD絽jLOAn{[֧kz�ުD絽jLOAn{[֧kz�ުD絽jLOAn{[֧kz�ުD絽jLOAn{[֧kz�ުD絽jLOAn{[֧kz�ުD絽jLOAn{[֧kz�ުD絽jLOAn{[֧kz�ުD絽jLOAn{[֧kz�ުD絽jLOAn{[֧kz�ުD絽jLOAn{[֧kz�ުD絽jLOAn{[֧kz�ުD絽jLOAn{[֧kz�ުD絽jLOAn{[֧kz�ުD絽jLOAn{[֧kz�ުD絽jLOAn{[֧kz�ުD絽jLOAn{[֧kz�ުD絽jLOAi#=;-\y>U ""���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������flask-peewee-3.0.6/docs/fp-note-panel-2.jpg���������������������������������������������������������0000664�0000000�0000000�00000134767�14605757052�0020363�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000�������������������������������������������������������������������������������������������������������������������������������������������������������������������������JFIF��H�H���Created with GIMP�C��C�j"�������������  �X�� �� Tv5VW !347Rs128Xq"AIQwx$9BC%'�������������C����!"#1$2Ta37AVu6BQGRv%SqĔ� ��?��!V=D趁#%E 1]^P34!V;{c[j Tz J $Z&1qh^m3*+;UPYUUQԳ��$@�u9VvTE,B,zP:I �$?p2oWe!km͊6s>S{\N@nIU*Spi&U)e`{@u YIeGQܬx D2J�UCt`>k 9ǩOįfSmGv%ZNS%TSԇmqjRq"GA$&.: �Oʥ@2Cԕ>^\2f���Aj} opoe++>=3[-oyǙ?9~tG@ cڠvb ߠ?̀[@O@I �I�=9/%TrdQ(!b5"2 '<(+} $س ]mvs * B>A"ee )C)AA�N!u]obK(\}>G]) JZwhZ[SA 9j A䓮05,ʊY*%UP>I�IUgeDR*ǠU$��I3(P>�~ >]mə5Mdmާy c2`� Ɯ\`8Gx D BBB{�I�ө }"YA� u ��}ps>���1€ՑWI՝8W<$y%eEZ0jf9tV47kč<a>rRdQ{~z̮-Ⱥ9Q`B,[ג]r&#pNA^Ҥ*5*‰WTa롺m}<=:z/N:>Eue^TL :JAʕRdɊ0 3BH tN86Բ(v7]4]lkDuW!w ʞ a]*2a+5k}pse~fP)~fDu_vIW`=  XPp~U [1RE==L ��0���c�!#xUJ`vLQh'ք"+cCq1 skI9jX|}л8R Qb$^Pp~W(}"Ppʟp�nT��1� `�����1� `�����1� `�����1� `�����1� `���Wp� dZ|X#ǿh}$`Oxh76/9}ƛx)iJ\m5+XT PsùQ!rE+Di6IqpK+ֻ4^يmԔV9oTiNP~ 3L69[_NgY5vZڰk$sb0q5$^Ug7N) 3) o-%x_Cy'(Ja27_R3.GcM<TU(sƚ,ű흼 mdT(4QyjQ$VM7|enakv83ZFp�b; nU2seG][0u++ks$Q#nH^:%sJ M Pq[3d@'&N[+)(6Z}1Q5Tb>Q?D1Lеut~CtmJ,G[w'{i;r2�(�̳4^:NJ,7qejr2̊J5:ǸNte'毭EUnfgKVȔd0f?7MH9 :SM uk:F&rjOޘ^- nI ]7*Qf_,uMooA. qNuJΦk+jguʬ&Ca-fFߖD[<Xl}.Kj1F["\Еg3(\}+.n|R/Y1FZUvBSQ($ݷvr,~ֻmGa1&<>I]U5"@vkֺՠ:0y,VZP_VU�Igi&~{2(#h"CfȡSЕ1݉ ==<(1şGh9bN�ΖvI}H kjW+@$/0YEA(gc kkZJUџL&s FlDHš 5oqrat%SS[IBKU$%r7"j$r"ߺ=_eMDYّ2CU\/xni)4?%禴DEN5VoweYlʤOSrԤWeԚ*JD2<z7Eq}^XiZn#(K;JUߧ~A p/{MHlm$pUL)]SrJ%;ivf(P)S;B3u;eiżs'-[sŽ=v:^_C<hX tvRJ>a VԇI"){"BWFg29FݗD)G=RĤ"LqXory|9o?Ks3FW~�bI-ZRĕBJ&g؊V3܏)3.(=KP~n,K47[Nl[VwIڭٯ ok4Û"ef[ Be&dD9;Bj>ǧewa� LQ("2�nU5rx=nw-CZ<ַnsdېyڞq;Xڷ5q> � y!ԝ!'jRCXRXz2W luuvI3 'usUHInZ/XyMلy-;:B!߷UU\%_KQrG!v*tfUjty"ҫ.oޥ+ҷ[DʼIp~[g}3+): R((.M T2ǓA� ~�>Dsɀ)η!ͳm+1~yXZ yC93.]מNE/ō0j$wt%)Q^tuDWtgT@Bv_o)@秩B]yzbf5Ys5pܯq泣F. &7~Toֲ3+Yb焪NI%7s\nw$jM7s�ue}(T/ Kw)=tfɲ&R1ȣDCV)^>#>GX_/6BE;Ú˚vl>Z#N1Yz3LF~5LJVg}4t' +i�>A7=.7v1m'uo}p{6|OpNMkZi>6a:t=%+3|c&G,ƎV v9;,mI117 NeN;bI(%:5 \ॹ KQvSF{7DC(U41:Ga:} ѩ淪rqfLڀZ4(<'�~̴/h]K`*~IleyBۖm]?9&6i1CJAMص:ZSҗ,\eYbr&Kbl}B1}c56xݰE!<ϭg{V,!41: :F:xi{uqu:}rgnN<uu#ӱor<lQcU]~/KR\`zKE><+t;45ZIZ!uw3zʎ8[ BJt~o#nMwI+Hˆr4Áb,oy|L4/뿃L}BcȞmZZ k\R ( k&SZ+B b5fTڭru.ݲMR7ӻ6a0z:+]/"qv₽[N6'ĝHHZDqQ<mNcХ$+hk\_ZsD;[SY$,Yj7l[8p#qw{c\?eݖ:njT2=*D~!i& TĆ1%bXRWKVŽY;lYԐfgkC5v]Qtke|ke8IwGdcG9TIe0N:}1M~BUGOY5_sa HT<RO#Nj't(HJyI-GSڗrӃ<LzmfuhPե1$6tQ8I WEZOȕ8S J[}[q?KLi=lc[`aTl^Hk^G2gUy4V dt"v krW'—Xگ7"'%]Vuw+;gǮxq{fL3;,1#lsۤlP<.rz6f7T!\JnAO07O[!PcA/yƽmXJ6靥)$w8!L9#~ Aݭ] 7rf/c-ҥ;}sƔBǍ⛾<> nxFw_!,'dtٕKL<uj(6>[r6B5TwyPK]jZ�\鿂x}5G4bs_b-n M֭4jxUfIjpv?ؒ M4hRIO:ny]Z(xڲ#&D颧-Q3.J#VFګ^ܙ&ڟۛ]L473r4[k#N{ݨM[ ZӺLPĉJeZˆt]s K e|~�EMa[WNlgھlY(eiDA(t$ SSt9zr9)]M rpҺ ִҭcJYY(}** >nƯ'lrFJ|/Ƕ?'^OKZ݂8ʭ~-uSӧ@L4ZA|vk*RN$k}o?yQb3Um6M?48'gKR&vJc9!r^vڦnM!td˚nnS+_ 32>ri!V8—:n~066eJ"ܝR j9.(PՍSAr }ej>*PIJ*$mX扅*c|Nƣ4ӒΠwA<񲱒CڒGjhxIl=_\ nkHՔ *M|6Q[jjMR#OcS:!ڒз'kM|GV�^eeO (>./W[m=hW_sbJ:`i;nWG;l\=ܛ֢!i v*B>n[vԏsw98&m@NTRV�RĮ{uĘfF;)u;\R@鳋}H$8cfYnaW+J=& Hay<hp-{/.XW2V. MLbb#.YjmRaE^By#}5)d=hTY[BGJp8c88*s 3|mlm9l9sЯ51Gp󡾷1U-[OauѺIfjgZs9/:!g+UًQj(L1%{z廸Ǫ4AbLv=; Ui/5 t_ i.P353c?¾ qUY JBER(=7c:Ó'[j$dmjԆB?յ&DPIQ>H׻jE)tc*)D¥RӰgw28 :dDM.SkҧA:^2ys^L#5il~|ԂLǼ֗ɕJ0rY6nf´i˾%$Kmf^t~:<)^a5KKMYq"REbi-J6 ,բM#UZ-2%9PS/Mo-۳J"RDW¥q3>)VVYկl\Q \V3SGzn\kˍ)鈬~\([@<':]qTY ^S8t2黚*7{3oNi4 /UɜPN] @quv􊣪aɍf!nGaPϷ��*���c���0���c���0���c���0���c���0���c���OQ[@sZ|X6BB;}4m :kkszlf\c9w]|9!oNN 9ˏƳSu ٦.ᇺ >%nELWJ٫ șۭkHiMHv1Q&n�BS|-YohwUx:+h°vr&{ʎӦw鷥2TU.|[V{ I; u4/|qkSBs`jjw-[ev[ŁBy'Kb\Qr9gLa&#h}򗀜V %udYc>&Ep)4;ἇ%g|% x˖ _A){#kͬfZT3DW@KcDCcvTut&C9{7qxӧ./q`WIѩʠn$|+m=zDT-cwBZ:2/)pHznH@Η [*'VhS2)aWhoĚkcf8`/H{T#gq8k`WӶDP:H<a[k^[}US&5T]M ֆҗOSJ^~g:hےvG*VI2N/ޛ2qvE}{9=K})mZwbA^Grq&3?]?2?>c<qq;{Xdl5"XñݏY4O=; ",irC 3( toM4chK_{$kK)1jc@AvۏO=LMq w 5g�u~o3s}r&q6d#ej-.sa{@RUky-/lc̈́SӌO3j\v涆zVcv)>}m7鼷G!),toAnr؝N0TJ{P!|2>!{gbeĕ~\;ON`9”u~j8Tզ+|K+"[I2SxʲnA^giZKԎoΜ R;Yk`f(cL^|,96͑5/?,xNACɧ4Ӎ$6B[6tiG9K2{Qv7]UM]… G Kf?58-hj {#tm'R}&�E4]Lf +;}b>,%*-o*jUxK:#\ tAI$j'ŕ^2}gƸo \[s8LJPP?ʹ:#'o%3c, mm 0XG_NZHiQVbASB"3ğGk ̦ߧ"~"b/VUPATи.x~�~[؊&_1\d2͑75,pm,Q36 yO MÆ9sᇙReȝb5W.FM-TM0q*qI1!vRϣ#joֈ l{Q!k7 [j摓k7c9$)5T WZ^z"D粮J%jB s؞_*D}du\~&B28y7wer5ʙծy76+qNz ݭ[zՊSnk+Rν4ui&"1 Ju4)#*{g $ll6!Ԩj6෴M5N'#[ogev殁A ]`m/ltޓ[cVmhM^0c2PY)vٞ>P{Waj*:LF|IIjGMk)7W(wZ^tL⽉[�y}F,ŭH 5daLx*}>q#&Ugz5FXRke7g+?'z:lk-YAݙGXL Շ=ren/Pijm�ABΖRʪs kvgP9F,6N�8s3tGE[=(jR2B8o\Rw3s4\ROdRFs}3} ?NiUkzDoG>!kV:ױ# HI|"zJA<\Woʼnﵿ:잝(׭b VzL `"'pEAGj G}*gѯ/ͤƵ2PmtnOK7m;C<L IL r"ş*K=&҉;zӴaXt?6Yr(ʻov$ӺF⵸tuGklo)wNKoWk񾳅JoK֋?/d=@]_ ZkbM\/lג)y3 @ޚe18CQB \ ^]'wz{~/6-8J)$Й4ν-tyT,ݟ.B'X1YpvV2u{rUZ,![GS2 ~ obN;qc`Fhfyuy4Sc.bugu~*9^qb ię3 Y2N%Dn^H^ Τh%Jv+GL.O[ZZMu[ j=RE*@$X$l.%ѭPA6,@jT4S60Do-Wmgn$죠֎ [ZjLyFd<Z_]uu飫H09bT .O N_-YS=&cdxdCT1㨗Ɏ'+z%yHOb6->ޢ<QJZJ$+v1SqlU&71RCҐr}=+m%?h%ݶ%g)g[iծq@Z֘�ɕW-mjVU85ZqqWweť 8f1.tepUdNUB)8<Z>݅PtShLe!li[e?'EϑӐ^Ħ,9% ,zkRͭOc-٥v9V_qT&Ad~c@�^]@(jzh *v{m4UӰ ˹{:uDFW|9qJN4$,=> MI4>ByZ>B[tkyQ㺺{F`N: ͩ*tk r~q0v_+KRD ~zl_SKNӬ)@$Jq:� ��c���0���c���0���c���0���c���0���c���2�c$*ǿh}$a֟=D趁#3qI6В7}I$gR`41hIqx4/M]s{P.K=2 f;چVwBY@CoH, Ȁ1j}ZE g "܃"�cmit%6r դ]Ж{;P.K=2 f;چVwBY@CoH, Ȁ1j}ZE g "܃"�cmit%6r դ]Ж{;P.K=2 f;چVwBY@CoH, Ȁ1j}ZE g "܃"�cmit%6r դ]Ж{;P.K=2 f;چVwBY@CoH, Ȁ1j}ZE g "܃"�cmit%6r դ]Ж{;P.K=2 f;چVwBY@CoH, Ȁ1j}ZE g "܃"�cmit%6r դ]Ж{;P.K=2 f;چVwBY@CoH, Ȁ1j}ZE g "܃"�cmit%6r դ]Ж{;P.K=2 f;چVwBY@CoH, Ȁ1j}ZE g "܃"�cmit%6r դ]Ж{;P.K=2 f;چVwBY@CoH, Ȁ1j}ZE g "܃"�cmit%6r դ]Ж{;P.K=2 f;چVwBY@CoH, Ȁ1j}ZE g "܃"�cmit%6r դ]Ж{;P.K=2 ew�|ۅpzzf0KLbL虈ƣ%N1xnТntvvvtkDў|`�npdEwn(j$f8okZ5*b!:V>�?ˌ8 nQ(HVqJյ(C^/Y3hv5Z|X8c˖'G]qqS7SN6u%[D]squ|>OsA?һ{K�7?ïJϢ?9/"?1>mG>nb|q֏ ~D_s߂__gnuۘ6iu1>mG?J/9/�ҳwK�7:ȏOn4:dۘ6iuwoWYG;%�w�G'ͷ{hOn4:dһ{K�7?ë#�λr#sۍ=δ~'ͷ{h]E=%�V} ]9}mƞZ?lsۍ=δ~"��}+>�|s>Os@}mƞZ?lW}~~ �u~Ds_pD~nb|q֏ |>Os@+|C:JϢ?9/"?1>mG>nb|q֏ ~D_s߂__gnuۘ6iu1>mG?J/9/�ҳwK�7:ȏOn4:dۘ6iuwoWYG;%�w�G'ͷ{hOn4:dһ{K�7?ë#�λiCgWD7 p<</?ByY*e-B˫#] Nm\%ILhaau>}KϫReXli&ֺ%a%Ylk֍GzӞ%_^C{>IaKs^蕆Vr)*c^ִm@����c���0���c���0���c���0���c���0���c���0���c��9f}zdrWW�2-ϭwE;�Lwֳ�?ϮlK7L9M1 +.Û+ 1v10sǤ jm0&^Qvvw_ÿƟM]Xa}?�?QC>>gMizoen㴶wwvt뵻X_gbEFC??o Niizsen㴶w76tMݚ@7%A=}yZ1O_ÿƟM]Xp~A8Ԣx=aӖ D7U[ P!?5EUE9Rtm)#fB|>�xӦO\ü:q#L2dΉ#Ce(ItZ\ٍp<B7 h7)(/~tK[C[Ӿܮx7#_QI- ])"<MJQ]_[Qv75�%Z-F[,{!Ej8oV.Pj]D!e:U#L0Cr1 #ty)#\R̚,l+5G`qr-ӢXZҼ`%XW20icUp{JsQHW PIk9 rN^_SzԽCRy##dgB90fq]2pIrőzONoV<X U[kP!+S"3ϕCѭ&6K_K>n}7HpO!OS'r=5 GocҜz=5 7]f4ƖTUӦ|tydM..:2+S.b2PV>d;f#W$yPkz3R]2y;�??yK8cUi~3b9Dr$w^!8ކ q*M#N5N+q0[IƕMUkqbSN.ۥj4VםU}<9(+mR^ۜ'JS1ԧRH,U tAܶ C/c 3OzZucNGӋвpvT]fm@ԕ8H[U]m%VE{^\pƯ+ŧ%'BO9sCBAa-ƾg#luBZA܎ <U+)+'4) j=S+`NBT ק9./NSb*+@ gM߬bBTw$ф:驙c7GM[gA_z]id⺱8�OYkڻ*2 VHbkT"ӳֺ.{Ů5tӼRZ}ChhYQK5jMHDޫUǨ%:wg;qh-q gܣqkjӰ;u]crzcҴއOMp</X ]؈[Zu}9JRy^2 qc*�D6tN%/%%`\<Dث*hތҟcN2[4yvgogmNy^AgNmm8ѝsgVqqEq~,r#ɩ7?RPyfHb4L9!hKR[?foX( T*tqJf@Ok0',.PS*$N:q~IkRGn V�T%?OJ_ Z8V>J6zp1/T BlN5كI$kNޝoY\m6XSKnra=zVc ;iU/OO&, ?oLw88��653�i w_ÿƟM]XY`oLw88��_q�;iU/OO&,淦??L�wx/8�Z�t4jW}VX[??濦|?�q5w` w ,Gc_? ?>V??~;iU�s#�OG+O_ÿƟM]XWGt_h3cPUG^Wڤﱘ#4FRBIٖ'D^O|}hqx -ȴ6"Vw#tRZ56!I^;BK7ym7&[NopYE-͂;dKB׀1u=x�7z"[OE73+wZط̜*MmUS伲EJY8{�lGK?w<Kӗ$j<t}`4*ijЛQQ .UKUTtT9q?I|W8JZZ&dTCB DRĕU���z���0���c���0���c��f?_7ԛ|ȹNA{_+#)# #%j 4#FY 䔈uL^&H/Z^\"aՄغS3:+cL#9v]nكKdq5Lڿ.9yD^˥]\qR}6T\Oo|Tt ( ^xHЏVN負< 0ͧK\ o% +Vd}#Dc2橏d(3ѥ RTU;U>$8-9g>UhK %Wfgxiu_[N6@t[7|9]E>ܷ 'Sf1& .2qW $ٕPRԬk unN=Iʚ6u*і TP"~1Y b3yι>XݹSjKze':28=4:bPF@=y礧Pʥ*dRS/zَ5-GlML/6imEEsDJ, TKwNj.5UeӮlWR]ff=c(fy%2qͨHDr?䔫 'u09 xSkX>)jiޛ[{)z:גi2%){%b|zn:w-LеOtrbX#ASZ XTwmq ?U"W"#9Bmm+zkvL8 KbW} I w [u$.s7s!eI'f)JPvILw<xK.ҞYwuo+?B뤉+3[>V\D #-gRNB'&qg9ڭ0ZS-΂ \s5dVd_ũc{*؂-ow�M[YzNB:O]_AW[k7 o&]}-Ѕ:64^EWsVr,b=7"HYWuB_j ;RڠjsD.%^<}Ei UV41lLO&=27ywY2;!G)ֲ"zd?GxN'XMo^0'o59 "oX̅2iRcI ՝+PQuchAxq.W 썥dJOKB؝2]<B $<RQEzkuQ̮4_sr+zA#Mjo+5ЉVe蓱&2f}Tq\du;ZEV{[4ңSW]v6ox5WV@Jv5]u_DV;0RԆm"kdc`O+9kw]gxʧ&uD-\BO5" -Vdٲ${| U$6@N C>F<^Jdm/!bitk#l{ѵ|86#JW"G3Hc&$7cʓlӍSFC{w&*t- ~J ajnKѱ ՙ/$LzC^ä=hn|g<#s/T\L%Ym2R&vz5O0鷉NmL~ [}W_`Ѵ/.˲R+xOiO6v-'g lC0 wuSc_m-&9=wHI9\J|*N+fv|,ݽԓsZۖrc]Z[\I78/%f ;Ntܖݒf-f ?$`ߣlֹg&zW#"3Emj{>?sf,Dž4ż-g%]!IѮ] gp24ٝU8e! m991cq9ÑfV;~`~jS5^myRs7 (;Sub']MsۦTihސ ]&H5EJ/M*ӥ\Wd#UaQ$:cѾSLP2\3;a"sJ6FRq*fX#UN%/%%`\5vRњSju/\JH+wfvvOyӉ;ֿA>@y)b_OZYq󓰾ǢTm$Քr֬<,-VPɩ7?RPyfHb4L9!hKR[?foX( T*tqJf@O_i>Ҥu5y^.I51yf7ZwMS2<]NR Jpvjj⻳y:8lu!T7%/ @w lcmsc838<83Ŝgbp',.PS*$N:q~IkRGn V�T%?OJ_ Qx )JB{쌭̽C)zf#;Mxl͕]{Y*EeT~ҬDnw*��U`�����1� `�],ou}�/QO"LYj^E<x?nT{'Ε~�c? )O;O�pAr}+� zs�=/� w �U^ֳǰk=:wQɄ@<=Qq>okwTY[]lD6;>""_?4쯍;ջqy#Xɾik}z=TKƄwId*I9L<y 5L}q5k,Ž)J 闈&(-#TηGݍPk6R֑*2c^tG7dXi$$5bH!IfÚ")&(Okr\ڛjڭ"]'}~9GDmL�;[>;AgmU�{U: ZwҝiXKVI-]m~_^z:Df@"q#\]m97y1I8I&2`!LsQd!fDb&4'Va 47K.r?7`7R7)7)sb֗Yء߇ ],@\DbPnĀ\iCZg~ '!I/I2Z|s{v)=0 ]2j9Wp]Rh7|JțISl+sXk$IYsR[89u_%kÔ8PA.|;2*<% IqDҔYGkȕ'l1)YJj)TqʔnmJitu F:ʠ@7tz"4NbLz]av(`Sp4SV`:f^=4)\?!-cr!ݚ?=dh%BMGV3dip'NƫQܦ릺馸]qu\c]u\x1ǃ1c1c  (f.Sgdcد@:j=]sVb�ƂP*(^B)weAU�]��O���0���c���3ԳpԳpU[�(WW�lX�v��1� `�����1� `�����1JbDT5>) ؐLzjRTY%B -2Fu #z|bvD9u) s45.%/O9͇mǷ7+TDy^FQ2HA9�C`@_f[>^1f??x~?'jzvt՟'z4pVeTl<%UtQe^>R|mSk;z);ˎ.. ,`xYfTCMJSY$-8XRj9Cv!Z2vM)=&W+,QZԚ*k^f6U5ecbG#,Db4YAUP岩*Ȫ̪IM΂]1cV!6z) vCSW*Ž‚2:i$. R+nP>n/->/^v}3rZi+jVϩehY(0;1FցA)ٝ`؝lb}X >N֑RCj λ-&i|Bo|Us]C|\N }rC iDJ4(Ry΁FV^"O=E&L VoTL\f?υ}֔]@<^"+8�C) ס9bQQIАJ8 �`T:aGIpiK뷲uDq(z?1p'dȏ~G-M94&xP-ƸJ}:Xp.D B.XZDEVֵB$iǶWf)^qJ@s]{&xӯ U+)'Jj"W`jLfpmHSa լڌf3u+hbQe0雭m֬rpZdlX}^NT4'ڡ6i0it>67!:R0~|+ Kpƚ*SŴ]yMr=Р𵥱fn s `*]BVVXUAI-nʍ9ƝslSakOcΔ=Y*C4R$G->ؼ_GVv;=?.̕zFV7+$ij9PVziVSƹ*~C,ZC4~{`K:g\OjqVUP%{md87| u{GJ#@격-v0 u٫gb.v՝5]5M5ƺk뮺u<1c1c`@2`�:`0���c���0���c+园)d[#7[]_SȶG>}3Zsw�>ҿO;O�pAr5�i�.PN�|�N�q|n Hn@Iɓ&@J "2JNr{m(붤m\h~t(j`qȶ[B)~E1L^YX(n[Y|عԮpMmhT%ornh6!k{UW"TV&VY[*LB ܣ\a{3 fÈ{5;>W]3L.[t[MYaVHK!SqʺѿE/ lm v\Z�4' ٭]^FMtYاy^iKW !#6[oBKMeEʏ*i_"%Һ2w*[Mg!ގo/# 㴆rf6ΐyq7::JELf$Qy<ȹ3H"t0)>/M-(nNG3t[%J (hw4Hf'kW]W77ptaq%[!X7&q֗V&>*2HPϪ 6M;.N-+heDVӭ4 x|+} m ǡp:_ Beu$8J.6ƥiT|kb̜3k13֖V1Xý/V2Nbb4$9?EƺDrY%ƪjqIzH7Ulf6ܫE�"jdދ<;"rnhsfl:*[cu$%qj׶oƗ%Wl1IG(%Q!Oia䤆.H=D;cF'8n7i'H CT J/}"pR4.6ξh Y۟<*25vso7W WUD 61DI)Hl}Jr48;zBT֕䖵 ^Ykν7$CGgV,_\M]kE=']>퍷4�(%*=<ÝB RT¿m ۨ$'~ď5T\U2d yt{sT\[74nRf\%Dy09~enN&3'+\eʾ][ (ERi/ۻ+z ӪVZD%r'cvCtM:$އf|F)uQlq 6E.5IIUPy2-k؉=+/ds}!VH{1řDLjZz H@1TkJ[x擨�&ug \oWd>Sܗ@}J? FMs$B4:k΢rweӰL6d76ci$"s6:,f$B=JUGc}rrcJ\Q;5+-ںm2nHL,1-2? 4dSf/xm1ձL/FHzAdi֨]9Lqr,~d3nVgN$#oUqNv )Y3`oH,˸Zt\[\!+0<3spS2](0 7m:٤IUF~AEݞ%Ž KJIjkOg~\GS9Ն6s CTeiֵ)J% + *񕋆=]q-X%UT71dBJ{Fʅ}.f٭)mE'haҝ$*c|E@XUsjakhCSYNՒK#bLe`yf x< tJ$/;*EjEZhMz̛KWַR8fZݻbh<8"J,c㻌 7HgZШ݁oZlHloX3ef#Lo^~ m\auN~>MjF7[al;fWh쇤jJ/Shr\EӨ &vƢdru*kS%t]1=tVz =C\'(jrS ;RXٍ=<T (5y1|)۝p*Q<lKa _V,q3pRV]'PuzL5TZy!)'+GYao2wkխMu|&j dkn?gj0*Q!Ft]_1婕O#5r-:qrg5ɜwtu9S91F* AR+vfc[!=,̭ܪCp٫֋߰jΚ:>YXHkla~;fɦuk';9&CͲ?vݦSrk1YJS \S4Ï]{.{"m-Dt{4InteېsS 5Z2O-9a&&\$4;z)Awfhn_&"6f+^.RJQѰ3;vsXb%5$ZJJ!K>6c;^tQYm2XV|P~hдEa)-["T)kP+h^[~6tt/T%igGY;w ||DVӰRklSI񢂛6NmSE5@8cb5w4jmBzq-qWj 7F\2YNۻ7Gs S?vewOʵχ.&֪D_,;JICEiNt@>X#E.(C-Ab5FQEڗMPIH%;Jx=RV@+eg<q<uM"o˰S_a j(odN# 3•R5UY\j8 }+evTshR82וJAI[Bk m+} +1uwLmkU&^h]"I^(rP_wЉa;Z�> (deNVMzU^�%^VDQ)N#RueR],ָ܅S^Rqc::} 2tS;V\cO&w*7w#0Xo2Ƿ 9zH)ݎ4[n0]p׎1?U~R 3V2w-Ly˕Tiԅ;38!L㻣ʝM9y> qd"LFhZ&ֿ_/x24dHڬFHIYIpR7!M%cy (DbHz$B<ee^<>vJ>Ơ〚TRd7Wy` >)4^zJrҹ̍ƋRQuU͝6RC)am2&5Mk\|TRKiEYZ2ȽwInix+īH|n`nCb cq|{KKyZ"}3t45B1BPi +JUe@ʥHRUf� u4E]e%4UxP^3~�I�VY=�#D;=�#D;N}Jc�yG�c��X竰���c���0���c���0?ᾛm"UuM 붻c8λkc:81g?hQgi&q{ff}|ms9LJ\8qg6ٌ-+ NlIPIPX�Tdʔ�V=@# k+Kߵ pݰW$&~9K4KvcLfX[˄=y􈴆agd$f2PZҳJ\M+*.wQmc[.Kyo%qfkâi,F5ȷlkӕ'jyYƖ>2\YIoK1ǩQyܽjUƞqՎ.l/"^X?@g$i%iŒ~zSSfX2 BnjuSӏ#cazFcyK!}:?45](h՚<)Rړ!d-M@w|!mB3Po6魻Y4ЕUWI9Ǭ d-E!%<&aov67(/xE/yIvڕV'm#Rݖ3TT"ngmEq Ah 6&gR2鰟 LNkwO3%~IyAί20zK9TG<ynbm{۳S rRfad"k0 qj%1< y~NJf"%uPQnjw-f j_{ff%d[j^M?َX[~:u Wv ̹-]bA5<'tD*3]ţv*r6AT]%PZ>jU &^g us|=ND q)U"RøU |(#yg@gj#G7EUd>eǔJivޞ\HK33ms$|Ԏ0kIUg;&~Z_*?+&x}ɞ]㋜qyRaM? g1MV <w;e3V]_6U: $Ѣ4\^~u]]i5Ot6٩-F;[%( lN2֤WLU*7;v !٩0!H2ii2.-7+uJ.lVMp%Y̩#$%cKmZ҉e8[D(tU<dI_\ҦҠaf(ZE-%wy-d kU\ SY_|mtj/Js{|r&.&qSDݫd[PS<e^T CQ'܉y2@I׮1}whj_&ZJj8lڑ@W#sK&3tN%r lͥo& mmnE sVKkr -406S^z3REF2a߲rjI55nzӺfm=f(D(.  0B2WwOQy0L*oCufn/xc`w&k3=GR y<AQh(k*\^r[0U"nyìR8VB3>$)$23ꗳEj>.Qy[LM̗W m™lLRhRs1 fhjETFc&d^IԿ^4'@ͺi'r.DG%&S 5;IQ'NBi5~%HNCu?68Rp^;v)@Rؼod56(Q;Qe*n&// e9ׅ_r; l+:9h+IlDAO#3tqM=o)Brݚ]EQ鴚'>Fr k=:mkEFfkatRT܁2D~o2t&^I|WyaQQ9XНjKC%[]35yjLS:vj4Bƅra8)V8z24 Zsq<pX6d5<Ue(@MSب !m\OS>6)mMz#bWY[YLMq'|.7)Y< 2Ol ]Jmu-|H+}͎CVi4t3՚nܙ$q:_ƒcR^HZPgWLJɘY*8"w+g֚eҨ$VTi#[L 5vXJ^ϒisZ(Y>Y,q},Edގ_ɧB9d-yQPҶ9lRI+F ,RdqѯkGgA&J5,el:8OpRVtvwpehXL_<oPGeU<"<uk ~piNB%$ݢku1M^DW+{q!ttϧ;Il6V4D.&溺)2P<uȮζ܂mx_:uhif\9^-5rȈ31Qޒ5mf26yt�f8FػsiȒė+&-UHgdsi; p-Ǘ/Wba/qK4\ vjS[8G3)5B=XvD,^S]$rzGW-ue=w=0SXbblFhXR+yZI/Y4˿}sϓw$d54dh54s �o e;N0ZNBaZ]z 5Oi5/zŘyٺ�nTYh+ŧ/31Us[biP<8eim3/. #Ctu| 5RCbd)\s\*$elcYp2HTqܗcʟ<]*7Hfb^ 7M̭.lLKNU؆*{^օ)] !) Ւ:wsg ,;kDMH·skN�n��1� `���Wq7[]_SȶGS#nں�l6}k-g }s~�v�( k�\_J���OK�>�?a^曾Vam4,5g릺;m53q^zqJa[- I-e^.A[Ô$K(g3TjfDpnPQn-H^ûʗpXZ_RZPDB Ǵb g)/AJ&;5GS7m`I#2( 'Ygoɭ{p_QY6j:U2Xg'Jڗ1N%Qt%nm$VT <&;q5*(N<]]X1rIafe*,HVl=DL՜=gPM^<sʯc4d _6$[ZZf@6~d|I0&L>˱No[N:NWD%I:9y볃LM)Xb0r)CɝSo)\]d cK h!KY4al|Uy 25Rtsyn˻21zVsV8/Ne/ e /94&E_jQ- :[eMM`$�fΏ4ڈ)S-j?^êoRM/�V;:NT/=C^[̣+"S _%Dc'sK'2쐣\4xlz{RFe_,"dZQW*2!ɬ$bKIԖ߲ȯZ&gZJ4Js=E"fR[Ӽ ȩcv Y*P:` KRrrk3_g8k^f 0`b^2&V^{VnNFT&Kgio̍F! Ԛ'ND U&#ћ!eV&-V<Mp̪3*݀�( (߱t buVfP `1_*5:N�+>eq#bfS_E-YB(k;NJєf.H24ߗmlhHׯO8CgVr9F\b,dD_#2,z泔Jqmن3`ʣ/~lV2UVBcGvKyvttT ]Y@%HܾW<^%IQT؃ i1 Q Z�N;26Q5$BZ7Q1dֽvʍ3<r#-eI 9KdI#Tе�7`NQK^F8|&lIK+Ƚ $%#QHa^ZTMʕV]˨J Y<ۯGBHe%He=}Y>: 7_\ؕ` P׀|G QKeuj5qkYM9ii,Ǘ )D,O ]OBoHQ"b͓.tmk㽄R3lka*V_&D95dLX_ vi5S`G4 Ʀ&:wit #^ V]PXs8_-z 3_Zр Jsc.b<F@cRH!k˪+Li+d2? YCj~Yx_U@}χr;+ERzH?j$HȂs-&�T)0{ /˟2Ґϳ DHT 7Rj{8Ga6B3%LLR҈RA| u 1quEHxO5nH,Ts#l:c_1ߢ3 d~jqU3:Ѓ3w)�_jt։^[VP?/w۱⓭QJV(D݀WRnnmfsޑ|zU VxC(BsjG6]ӻ7(-siD~8YYJ -T aTimَ8BWtƶKbH9n`vct; .kJ͋tu$>dj/- YǺ-2f€=ʾf- NS܆='3)SmjCcQd9A%xLr'666*\dH[z&3hM޳^ꕎcO 6\sf{}7VP}צXI1X8n]`PXkU3e6W ԡt2~7vy:GgwN4u'^B��RJrBo 9&X^R&o R~KPmMM溝w`3W0iM5>RBxE�>%TA_0[T: ̓w [v$g(ʱHo+zo]FNGՒA5fк^/*^U<ٟhZ$lIUe$M Ttq |L.)Tr1 l{Zf%*#xUS5I\w)02\ܒ6|G QKeuj5qkYM9ii,Ǘ )D,O ]OBoH߫+PDA-A"GÄt퓕V)Rʠ(y�yiO}43kwBlC# ߢfy*eaqC,CڢeVވڟ;";)t>q{9W "vEkQ^RܗC մq,,` K3mɲ޼@\BxnOAէFܮn,c:}5]j(%UG:띴Ȥ̺TUf(뀬2~eqd}ded#.B,7bQ;-fUpI<&#͉ٔWf!?sMG,t{;<7sCb%5#m Mu"pهgOG!33WMdG;U P&-TkpG]I-%<ټt˭H",;w�k~9! <hgg yL`m޶SsĢTDSI(m A"6.-جO`(2#%4uevTC(=u#䄸~t^4pkXcҥFfivȩJeFU,0ufP61g AkYh)-:5dhԙ^/URVHbh›aRZ!fp[\x=M@ԬF&6>I)19IF;x m.>J9;xWA@o:!*RHm6�=1�;Jxڀ]IʔaU.en2B�{qRJ {١(c")lIIg,0'HCrJÓem~9ƣ Xe~.6_jj.!ϓ0D�FˮWb**"aE!U"U+WI(ۚ+#v8**6(=zTcMm=4+lW'-d\JIΐ͆Bw&,^ yM-1|T,>/`Py&9&Lf-NNĠOr$y:㎤[iDgfB d<ch&ӉQƶX1o ʷsoi<ʯ" hnH|T"U 5OL �$ʛZ-f@S.y]k"+`I^FTSJҀ! F0Ə39hKHT"c~J~G2xtڸDr+MrɎħ1j"to:߇&ieJ3?i?W^&ip=4nzLՖa] n"u=_t&)ӼH /K�#�yEJO)ɏQo%lgxx7.σ+R2ݳ޴nRjYۢǢz($U.ʊ:0U@XR~@�~Y|)]FD|2ݝ'O&S[}l/|ZJ͡hښ\WB-dM]I½|)8=cضU|6h֑fiMqnZӥa%ך~a ^QѺS[ow@HQBZױ-:ݟP m=YmRnWa7\p*EPR^#c^ b:d):IM@7~`ZўrL{~rMNCyuMW0lѵ+'tjv!QR<@(>lDVz+p֔~-v,iRRHR@aO-T� $? 0ĹI{4Y[ۘkCi,ƽ+\HS<Χ6ˈ.2 PAN-2)פ4)&JNWFuTu̍bXn+>RW_L%dBm#p �ZFhUGdփ {r/^'W}DYkYBy@*,SZf*MK|of KIrʼCk {H<?o\IsAWQ +c}FUx^,Q+A_*@D[F 伦9v|;,(R]QNVR4 .ޱ"$htgqR T^0=uh?o^ʫM8 I5[8$W EtfF'3FWkYVskm^r =L™*ؒ\6Ϊ#cٍZ2͏Md2/D' dh+ķGKg!ۑ&R$tKJ.b>%bi *{"۩&nP=RөPD)Pep@[QU1;7>ŞR尉<rNf<FPjioFu)a6ɕ4d~wmFnH͗0KڔG&*<Q5IQW7F/hЉ{ԉZ`k|>t!}O>WS Q+v.ץN.,@h@Sv-|E Ejf卯ح-ጻZVxlUY"73EЗv5o48QUs_V‡s0l&} ipxV"+݀Н~l'I[VKVɩ &;]YڷEM:3Z#Rmi+(j6f<OUNBF!.ق:JVnV׀4/~$ 44 [3kva4R-Lf9/MY3Z]b;V)䓆eڱɝcrt O m+9)N, eP S]v{L6@0 wWGrSWa%p']cz_jv[{0wZiB!?YM6j/qG[#n~E_IjCT$ߣT=+:]ڕ0$Hye#iuet `Pz\-& G,,cZ;bvWg_fMӥ!iU GR@�!�0���c��9G*pȩt<ͥNDdZS5wQJg|*BR>YqRue� >!h(nZ{(] tNL_K(HMZJʍ9}0�I~=/?t퍠K4nHkbՄ޺Y6c%zƞt9 S{:_uGw+]u&k&wɵΗNn{Em\57g܂kJY#G]]5ctݭr*5 "Ѣ7t"=h7ÿnKw:dC7ѸYb4:&Vzk:"Boj31붺m|<;|jﱱLzwa>G~ץ62)ǎOgCscSJH $NE[^:./zcӿZJp<];kqҒ*CI6<S5{5WuE֔#/׷kY(ꭱzV]R%4N6ԥzSJvJn-F [<=.2]g􊊳j)tݝNIl]q/-pk"P WN+z. j<l9w3Sxwnca'qStѽ yxCnk3D3ÐJ;7ZKqЏAivZfmg6XmgPn^VƖձZ3Ob񩥩DBH(>L7umlZ" 9[~>5>+w8xv/9,#EIZ^<!-[C& ypgS??~kʧ 6lK O%W}ÿKwƮHn1%MHtPU}ءQf-U�}m]ϡٶPik{*֌fM^Xu %,!= R鹼NnRa&ƹcSlٱ m0Bf.*uƞV [$61e2lIRލhܮlybÖ=/um{!Ȉ(BqO'9<]60]f\.CY:RݙHi[O0RK?ѨLiɣjiiy+TtiC[P|P4fa@׷^66uV:o'JejsS0d0:n@q#^pRXw\M2Eͩum'9Oˍ/]̪/R`<|vxްrƢ5bqK*1z~)z�E\M^ϗ$Ir1Jwg'|n.K8HǶx04y~Q52?;?y2yߙ<)JKT}n6hhR,u*!zS:ViQa`mUн:J=�9TPB*WMu2Ms+v{^.T8A�fÞ9RLJ~ۜS2ən!STַ­y '{)qY2yVJDhu/.P~Lqr' O%W}n@L[Dg!I`NNCsXU^R0zJE曵Nj> RFկH ﵧ;yitךdnstv1kWhLgtq`ANJ t ˠ0&ӧO̡$� -ȥ-W'oڠ2xRr?L[Ƹ!TZO&2,ZnJp�Ory-l>�[5wؾtϡl~ 7grYWBΨh ^_яQwۏu^}mWS`RZ$Z~FF9CjREBfrܞJ%�ƪ<Bf^QK\V%Fɼ\ɳ&,a`Ki8!t4=38Cl&:Mf9&S=d\K) �'9<]6�Ory-lQ$A{bކ4I [8[uY]x WBQ׼}mŨrg:zܼ?rƴؼڻk^PC[6 6Yӓh"䬺b䩯K-f/{I/z!Y K5-b՜ɣ1 6\ږU)zɋWQq/@ũ=år4.Hcm O%W}ÿKwƮpڦ䇠Jt!|Qvyd~ѳ Dm+a:nwyt82oi_5EiSb<,>& IsTCK )Xǻ>clZ?wvR] NƱNuŽM1AW6B)weXv<暗_cѮЩRGdվ?pjLK[ܜ' O%W}zkaҩ7 ~>N;zލJIOv"mV>Sfކ@60HkҖy~Z-5!_*-4BG\''twe/EId%J1U+.S jHa6 zl.FAfߎ>1+Ӑ<f^Rݱa)4I[0JWjSᢼjw�Ory-l>�[5wjon_C|neJ&ֶ** snvY&Y ŧIP>i>mR VMƄ/jvg;KIuRq׬0gY̓˜: S7Df1:kc5\W1%r)sU77ʌગ+DmV4ZњZr>qg]%,歖tQ2D'z3M\3'9<]6�Ory-lQY}mY}rXC 3.ﬦ_%K}nD"ކaf3�^d*LE"W}ҝQZˀqW*<vn2I$.&] «q(XRۏ<$%y"ĥoKZV9Ik4X3=l/h PWƑ{q-4uJ9dj"N% |<;|jﱰxwncc_Zvm`}#!|H:֬v76Q/$]~][FKkSsmz;fƖ#8Zڛ}5Qig%`NsxyŖXw^5Ro;BG+98HDD/nhYp/0kJJDJ:pzxؐR"̒r_~]?'Y]0ؒ3-&ɤWa"kzooT}bKԁrۉ QF\L6eYWMdl<y!eI5G 8)ՠci_I|xeFE}rDmPr\JEښ|`ol<knl&"ơ5QvuK}賓1w+sۚ<k;OO]x7}]ݯg[aOO2[̻ Ⱦ?ZsLI`$]`P*E 2\Q0<%rmIZ-k^PA_m~1Pmo^t'H+.*kљf/{I/z!Y K5-vOhq+4^2[x[s\.P֌~=e6Ёev$uZۊ] UO^ 몯jISKVWq* r5)1tf<;b#mTj3!1%0ns'7rVؽi}Fra庬>+Z_pz| &PʚW̖2Mϵ-vPlJR͟kjv=Ե{I6!nhHRl:+ -Ht51h8, #Σ+7U8#/v4M(91qɵ.lZ'I]'T.9z6S j #ǾKS2싗hb)y90,rwl=-|L~ktw?)Po>Sh|Wp]Z St8uPG`tГ*-MoJ}Ocaw+2Uv6[aR`ӥRHSΞztXxl%y�!D} "UFrj8U86ƘLՏs+ӫKuP<V$߹7"\!T]I$~p.BM/*e9*YL4ܕ^^d]{2*6`tF lJ( "I[.cס|,� VFk=VO:y$*oW lGO\Z-{wcGHTscJ#ɛƦNRd+Qr)#:XV * ^z1dGf ѕe,-1ǗH"XS]{L&~UEz@Hg6؇cӯB2GWmtjطAMj�53-#61Z$X<LҥqI;Kג%kNJ3@.,pYTㆼN#:W5iwK%nqtֻ2XSd w]ȃ{\*ww%/^>�W),Q&B%cjJ=gN!X0*,f,f ) aʆe*C+)wJ 2#1םc,4WʎB36̧s94lI܍66Пl\yb%85|c/JAisSPVLUjhM\UЃMI3)EgYpet‡Oru[;Bڍr|ʴec,)3ۖ«DڨUnm;<RmycSЃ x9]<(׊^=Uj`k3 t>ۇ[7f=pLD0^$wwX#C/B]*[K<6"odyUh㐖3Zc_H:'jI:3A`M ʑyȽ.ud*AR6hOwc 6:tմՌE5⅙}=a n�<ȼ!Z$PF9Ƙw/\qmkqv^5:tz)F�a#uueauR? [v߄g9mo+,^Q6ղuETku1 vZ"pz%u,2NyGqX<4_yK)ʉ[S'}CɗxUn]Sr$ o VhVhvʼAnތ9{ M饭uO #<N֖`Mzvt]:[;m_rJjA9Kj�9W0;r�HewF^+ԕ'~hn6!8ꦥ:&R-Kܬxɨ=lAWT,IE]i]4xq\MmJ2)Le7g.w5*JN:-WjV7v#b-;K`"6M'}V(1hBO/tbN=eIskp7zAO288r,}I%΅vJ+ULu\D\fMYff440)ln7,g A-q$ ֞7#'rG դ)4$'5}:i9NZnImcnNzRy&(@ZYLnVMyl; 4&k_f"E)}ܛ6ĹRN3Fd;-_ᱥo6z!b+œȃ:Jdl{u[Q8-9.Kz^F[e$v<G?"m1`\DނC.Fd/i+Y'&Ȋsa-$�%34RtY]>h_E/k(!NNȿٽgJTMm񟉶\E .hQ!:@|eN9¥-=Phw2VҠ7:/@,Edk^#*k02#r v~qkEXlvYܖ/*lTlS$#K@aǐKhF;Uդ|ZF~eIOoٺ$C2gO)&ւp_lƹTU\u$RrKpy$PVdִ+kdDk2G,GtMϻI&Lw $jksB3֍Ҷ;)gױղUU->NYSf(q(<Tv95L. ~IWohX+^tW}}m}I!^:mj>-m]m]B4oy0Wd)OIj&OƨX6m9*OZմQV4.0eGe]kzĀ]s 2�/?KۙPFlJM%B"Gkte*\_/A^) UuFܡ+$$ůJ6)!ʥeby7,q6@B}�aV ~DО-ڃiYH&mnk>.0efE!%6`U&n1PuW]-^˄g [c!)b[ytJ-yc4G.W-|NӸĵ<R$(1K9d򘝭cLm tY*{5:k؏vCtadcE(vqnc\ܔ*Jz&Āګ ؓpޝQm/C4.VƸ' tUrՒFf:{v6w66 k)E!N^o\NC,5/J~Q.1eta7z~k%[2H*ͱfKw=5�g,EY_ƈQ[kociGʧc{okikwXi@ՙ5ՙػx4TbXh+1jQb)w޵p�d���c���2�c$*ǿh}$a֟=D趁#3PljBR2VkiHdT 7@R hZ‘t0zf:84+M0:ۋkѳF6%"ڒ~;ۼMOZT:W(qAq:D귑Y٭J]6K.Ư!WZX G% tj3Y!j?I2-mvEu<n:Fж{/OK+ڈ5)'sڛ@eeۇS#z]%n[Z6][_]ci3݇O-I ,"cI橝8?UKEZ<q I'  S;ť,g3n1n~o%<nP2S(Rg+w( -,D:m4+ɟVBmcsGeEQxt/MK_s馸\xvs1xs?Ӝ#m+*@v-BYtu9Ѯ廃CSwSww_Whcu5OLM s2�J l v-C]%mԞaߵ-׉ɪyQj-0h72bI^8/&[xxVG۱94͋[c˼݀W/lAlx)N& "?'XrclM Q fHZ6_K;v-*:ovy#p3}G30 uKDARjS{yke)+g+xJƦJ%3+dvi*@ct-{M& ~v" Ԏeg-~,UrV)F(*zMG6o:?$,{Hd٥? p[SPw3nRݘo=JlWd/+KVZM|KSY|?pE2"MVmC;\AGGm��,�0���c���0���c���0���c���0���c���0���c���0���c���0���c���0���c���OQ[@sZ|XϞ晕nw6j^&@G3q(]s1 xqdLׂw6/f*?L9QZ~--Ak<g1�Gc%A<ďq=?c1>A8vq Qk\p+lp|e難q=?W\3 /}\>og {fOOy=?W»{8W6^}GpOOc0>A8vq Qk\p+lp|e難q=?W\3 /}\>og {fOOy=?W»{8W6^}GpOOc0>A8vq Qk\p+lp|e難q=?W\3 /}\>og {fOOy=?W»{8W6^}GpOOc0>A8m?k06_?4p3o'x^&bTޭI7l\kS²Ӭ-*5x%>Tj%,'3W%NV#*c v�p&0���c���0���c���0���c���0���c���0���c���0���c+�2B>,{GmFicߴJ>h0c0y<2QiďO=}z1#z�} � `�����1� `�����1� `�����1g6�< z�ی%C#:�n1 `c���0���c���0���c���0���c���0���c���0���c���2�c$*ǿh}$a֟=D趁#3 �Gc%AH{Gk?g g����1� `�����1� `�����1� `�SocmǫT0I3�/?P&0���c���0���c���0���c���0���c���0���c���0���c+�2B>,{GmFicߴJ>h0c0y<2QiďO=}z1#z�} � `�����1� `�����1� `�����1g6�< z�ی%C#:�n1 `c���0���c���0���c���0���c���0���c���0���c���2�c$*ǿh}$a֟=D趁#3 �Gc%AH{Gk?g g����1� `�����1� `�����1� `�SocmǫT0I3�/?P&0���c���0���c���0���c���0���c���0���c���0���c+�2B>,{GmFicߴJ>h0c0y<2QiďO=}z1#z�} � `�����1� `�����1� `�����1g6�< z�ی%C#:�n1 `cKl<, I͘`Q-5V絗u]R-IuRW; #(~s my6صC]Qyk^sZS#�2m}֐ۂ2k{'+`Uf/|xtP,IPrtӜIr@=p"r1g,s>fbޡ*gIyi8fm4+aH6ڛC,h-ٵo�ɢRۂgV7'tnsm^RRct0?ӝv6q35����1� `�����1� `�����1� `�����1� `�����1� `�]�1icߴJ>h0kOQ[@X�籒CO$~O=?yd53��c���0���c���0���c���0�?1g6��cտc*$�q`</sM@V-j/J;,y]*-),v;5#XH-'�qjZFu.6"Prd0Џ2sM!fbId ־QUA. {;MWG�Ld(:;TVF,rgEg{Rc4дvXB՚'(N\z&cc4sSQyr ;o hgѾ>x[k?Ց `�����1� `�����1� `�����1� `�����1� `�����1� ew��HUŏ~(-H9>,{GmF fc'J>\= ?=?�籒CO$~OϤ���c���0���c���0���c���0< <ǁV�q`g[^?L `�����1� `�����1� `�����1� `�����1� `�����1� `���Wp� dZ|X#ǿh}$`a?yd5}<{( p4bG@��0���c���0���c���0���cmxM1oy�J 0Fuc*$��1� `�����1� `�����1� `�����1� `�����1� `�����1� ew��HUŏ~(-H9>,{GmF fc'J>\= ?=?�籒CO$~OϤ���c���0���c���0���c���00%No,PDggrGOڣ%Ѻ:<tLq[B#b?+y0ۚeʿW|�9&_2ԙNK4FFܬ 5˪2KJ#Hf/%gM͝Îv9{4- ^�~YCkT0I3�/?P&0���c���0���c���0���c���0���c���0���c���0���c+�2B>,{GmFicߴJ>h0c>{bg6u(ݛֶ+{cC2zc6ƻwvιƻx3σ#BNf%k \)qv\x5S͑a17)*rÝI/ q$Rsի8Rj4( c 45Bm95\912qZV3O$[" #lcbVIgin^;ܭ3ϟىq]>f',bt>j_m?{;Ro1�+߯!]|vby/WOc�W^C/6Bϕىq]>f',bt2)g̭#96YN-S<^MLnjZ5 L)Ng4/! dkىq]>f',bt$ dkىq]>f',bt$ dkىq]>f',bt$ dkىq]>f',bt$ dkىq]>f',bt$ dkىq]>f',bt$ dkىq]>f',bt$ dkىq]>f',bt$ dkىq]>f',bt$ dkىq]>bͱfcx~(+I`^)%.Kvt[FQ JL)doFR,anf@�c���0���c���0���c���0���c���0���c���0���c���2�c$*ǿh}$a֟=D趁#3sWs)?gZ3,V1c81c1cX1ŌcсYߣDzr/֏G� fw`~O7@],%PI*q3Y[ _Hc J)]Gܦ hBe{5ȉ1T5KB]c0K4&@+%y6_i-yQˤ%�VӾuq%YhkOK[z@ZDd |ْv4]9ՕkA\<Iڨ>YQ*~yrXh.skUS׷JԏӔ"Iq*yMM5oq<~QEʛBBv[yِwū{8W-$7NHtFՊ HMVE{ PZ,@F*ަtզvcOjzkQRf =QuQrbpWwk4IQZuG;}vdy 퇻�><9~ cс2*l )χi�o) ��c���0���c���0���c���0���c���0���c���0���c���0���c���0���c���0���c+�2B>,{GmFicߴJ>h0c0[;w8NE:zS?'v-VQRQ^6ukmQkcbOOSm(gL/96Е\3/UM)?]<[f'\!z&sm�?^<\qv�w>Wޖm߼}ޖm߼}3am~?ӷ ssǜl9�>wޖm߼}ޖm߼}3-ʉ|C|?7�pm^onۧ"յ6"B n*lRn2zՊM=Q:dʒC����1� `�����1� `�����1� `�����1� `�����1� `�����1� `�����1� `�����1� `���Wp� dZ|X#ǿh}$`��1� `�����1� `�����1� `�����1� `�����1� `�����1� `�����1� `�����1� `�����1� `�����1���������flask-peewee-3.0.6/docs/fp-note-panel.jpg�����������������������������������������������������������0000664�0000000�0000000�00000132536�14605757052�0020214�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000�������������������������������������������������������������������������������������������������������������������������������������������������������������������������JFIF��H�H���Created with GIMP�C��C�D"������������   �b��� �� S 15QVWsw!478qrAa#$2"&U3BRuv%'69:FXbt���������������E����!"Aa123BSUq#4u5Qr$sCRDb� ��?�% rӓ�/��A1}ӓy e%W#ėc91=\_0ur<I~F<Ø%W#ėc91=\_0ur<I~F<Ø%W#ėc91=\_0ur<I~F<Ø%W#ėc91=\_0ur<I~F<Ø%W#ėc91=\_0ur<I~F<Ø%W#ėc91=\_0ur<I~F<Ø%W#ėc91=\_0ur<I~F<Ø%W#ėc91=\_0ur<I~F<Ø%W#ėc91=\_0ur<I~F<Ø%W#ėc91=\_0ur<I~F<Ø%W#ėc91=\_0ur<I~F<Ø%W#ėc91=\_0ur<I~F<Ø%W#ėc91=\_0ur<I~F<Ø%W#ėc91=\_0ur<I~F<Ø%W#ėc91=\_0ur<I~F<Ø%W#ėc91=\_0ur<I~F<Ø%W#ėc91=\_0ur<I~F<Ø%W#ėc91=\_0` f;sȇ sc-p� g}/MmtMv}5]uvmՍu3?w#^J�G!6*4gZbN2J <U\ܗs)>r׺͍'prOW? -u[ (YVը3;`HQtcL| H0ǑL`.GKZإ+8 -@V5RءNisq0u6aʚ{ʾ� l7?dWU#<M[خW,ݕ!yκ5 j:VWguرV=srs##9S)G NDֲ'umZYuJ$v=nty䷪G**|I{4z=OcV{> <xZUik}1![MVbG2 }2Yh:yRNʔzEbq!{)R;lmphUg3RnqOp\xZ[J`|f#ՔJe>3,x>G^3R7Egz:4Iݒ3]&-r*'B&7:4g&<P慙ū7g+nVnZᑽ:F _\aHއ@yӜ\i.KkcWPL 8;ûzE;UmC7$BnCWtu'<fYvytU=VU31Zk6X} �Pz6Cb_mP- _9|NHipf;Y H1\\ tѯ ],~*:md*Lj.kuP#> Ʀ#MzqhsSo$FkݲK']P +S"Vw>e4 MZ E B}r{| 䕁(E m{)7+c6́'UqB{ɪ<hն|ꮡvf얿Ҩ{�f<3vo_RN]Q-+ON^θMƈ_ *aUrۊR U.Q=NKMnьȉh59hՒ ;SQY3ތNr2[Uw R^`)3z=lg [rck]9I[ޱ)M龏3Kڎۓm <J" oOT'r\, :t1lt窄Z$l Z:#PZgH[ ksۋ$ ETֈܧ^~x' J ƨNAO+l {~0kNZeơ8KŽա&ֽ)'@UH։D^n݂x"{]D٘mw5Zx4mtvm �CdlfON]^.l ͥ+.1`xHŽܡwRnN_T@AY EK}2sB�rK�៼9+p�x?\ 4MTWr2Z[o]ٙ9˖lGUd~ uXO1nW"܍ɮȥgIn3>+W{㊂je m 7sAQHvoYm!�._̻R** /^!{KDVa'MZ{KrҒr7o 4=g9e2jdV|k'}f cR*dzDkۻ%(l/B NF't8Jsz-$H $Bu-)a*ŢHJ7]\'F=rơ@}7v9z@rR {km<^< k*E56aeз%XPu(Zeaf(-ٕ#)gh`<6z˙g| K6佭\]ƳU1,vo&|Qz^ewi9x|q8ozNnnDCsTmveԕc# _{eRLQYu+^ $BGYV)R`* T,0#"2ӟug*7yO /x,@=s.BE*$˝&M%]Eϲ#QO/n]̍RmFOSl@zR%P~啷u.檕4p _I$ya8^hViMU9ē< 6'8pϮͶbޝE7*/I\U܃jrh}HKt#&k8wIۓ\#~&?rsm\jeQ׏r1Ԧ+dD-F3^TRi4cM#nKн kB:?Zݯ ,'B2닜w4r), QhWObwPjGl SUWuzEiE(02tx#g:9jčwe;٠L.xd $R9R\bB8|ZsBL0UIt)al\`.sӵ{RsKHc,ljN FS])jODzGw{hCgwgV0tװwkݗX%wB t!}]#Q/$]'^*aLtK8;LBO)D-(ْ'mƇ m Жj30y]sI;R E+G9Df9*dLft^쨵!2-BMʷ¯T+MrjdnBKI<j7O=-hڳI@˃XU/8ܐ7~MKۂ{(:1dZlk54vT4jս:ҜIg^k4NIz~N?trc 'T؅`L?t%ATncrVmPZdYY(uAXz|8n"<"Sϛg9%q$\8NaBű5ORӚt۫K]j`X9x㻺KzQJ- #�%t}ilUM*dH #w)V3+)*P0{ z/;|Q-0E^wK9Jk1+H 9[դ FFk!o[Tܙs3V\Z{_tS\vW!w_nϊ/]LJ/[uRuUBJVtvUљBv}MT6L)eE3fWUbzH@iWE6U2@dC+H'28Įw67-9́Ktn9i*j3deEk&G=pn>lr f!m$\6esq_#W+/CR"iLiiX2RLVIړ7+Ǣ1܏!.o+N}WSJcډ*z432=mxL֔X�)Pb%weS0bG*n5,<a4ϵώk~Joem4EK~ >^?^Q</N6"H$=ݫlYA^S, u6MR3 /\qЄU*iE\@);df7&YNݜQJr#86G<fh>kM0EܞtDCc`(Iƀ*9^,'Z&zh4=EvY&&DXȟ czl2șTwB~萕ue*H%A^Qfk]Gj�MZ#k!2=m͝y\lBUTUzP=Yq۵ڢ0c^up g!C;0^Y����c���0���c���0���c���0���c���0���c1Lkt� D8Lkt� Ck�c<rzIux̿9!<H^ΙqutB ѷ,0?_yvo?ؽ| !::*v~%3hMhsٲ29a&{KRM{mVm71A;~g^WiS;8XSu_qHڪ1#J+Y1ͳi auvHF,6,-$1#awbنٟvoP.,D nPBJ%BsK47>P>uy>E<_ 6gׇն +Т/D3ו]Qn<Ԍ[Ç? -<yq6|4Y>V>k-1QTRmډuWÊ=KרD[Pssi�R1L^)Z\9adKo{eFM2NK%K*^߷kO2s]AǮaЗlIQP CȚU:0ɫX ) D I-rbPV \0};tg3,sNC؟#Ps$y6bXrfsV/u5)\m;ɾ?]4-k7aNJgFF1ռT_^<|I3 3kV36NAŅ"P5+dLјl- \I)[Rd$OH$R'G%dr}fq2q0K=TV2FmY _4@䘥prF7/*Z_Z[]Psu/:Vc"Gz;t,3,[I|͑ޣXeG*[[z;S{ĽKqvZR4\#n}Ti,:C7ͧP*4LxwH f8xf0fq{)*}xyW+d:ɠbkqF;k+|y|IrG=`O3϶όHLpt jc}(5ksfoTa{uU(i9+kٴ&ڦ ]qު58r&vg3RLFBJv;^Jٶe 7B=A~*M*y kqtʙam|}!ם]f;0rEԸp}k L(&ƪg:ΑjRr.^X/ǥܵSsprIk:%=nLsKVVĪ|ӚO=B_S<=kzG`4*76ǙnOxO_f=:�3إu5Ѕ+x9s3OלR}&AZ�{m:_GGx^K*Fk&QL*{L[U� DeOԵa4Ӄ4<yBR^ <� :YLO"GF]q~Fr,:řu1jL?dRcP0ڷM|U�i�~>:j bz9y$j;<^{�nG�22֥+hw@( v)�R3tȗi�UH\M\Yn#%h0הg}^Td Κd6o6R;`1q$F?β9ѐ]Vat};Ѽ:,1ccpϕ\CGUUܰ{QVJKVȢ{%nnhy.Ka$-Nܢ$\Fw6Nu-6iF݇~锠�4Zw BvjZ¶>�sę=I5,O$s%~`=2^[j/oiS%˥CzGc=v5I I%1gV6gHY-\I Jbf%Pn5''@wKo3sI>I49H&4^y1K6jv-`8':`=w/j<ːxt -[svzdad?G\ox%P[Sk3׸F|<ޡx=~?^m(=q)y%)CKjhF")sRNd镻Dak8jFF4i.&Ottù}JSX.*oGߦ҇xIGO"ah1f˜Tޓ-ꏵ㏩;vk,ijl N†i6Gȋvjčyhw96;u0Ŵ3)%LZ%.mcR5yd1ѩC#3mJUlڡ %Qnhj[WYܿo)Ȕ:\~ikaDqM#Ŭ୵DvajkZlr*Џrf-Fite3m<-V)iJݕӐ'6O(&ٮMPf5 ƒ 92 MxLjw$yT+;{g(Ĺ0r)QxW#Lf!>5j4.rgB\2ވ_ЉV 4V iuL.mhTfE4Mv.6ɑ.sW+UӨ\fy耟Y~�39iTRǩueeVNrCGm2uȤ*B׷MdWԉj?T7*U� mQa|y}5[Fj{kegkUDBM}Fy:OЍ;1ւxtuc,]<jU{oM(ơxrr)!^WCȱCslqѦ_js9Vvxݳux"t7(޽ J8dW<[cl\щc&dBf׶?2M@֩UNLɝ1>Z Q.JTPFשwM& 9"عnPb$[ThjBB l<MZfeɊkMC)țKlp~)y5׻ěS2~Ij?q.oo.BSg4޴rTJe5?&J!]^dlQ/iꈀogU V<)]GV{ԷCXs1pZ*[$'wc#-PgtLxY8ޜWn$'iڙ$Uhlts?@ӗ - rKm P%HFB4ڔVӕE^릸>.~Fԭn5a(}zMUկR:ؘd.ؠ[rw}m.EO!ґ^nM&T˥Sl nDM:K'`ڻd17%eZYKE9ʌt)Y(/$y-6MMP�j($JQWgO_B~}skj^̺w6t3tʺJY'5ͪ6%rA4G&$)B".Oш|J%5<!էRҾ.l>BU֘1K[̉+Rqް,ܖʖ:9ʋU#:dɲ=-*3)-Y:Vojb@j N),Zk܃S)w$nz_/dZ"TgYnqȚc0Mw]sx@I5<|+IOVm:~u^dx0jɔZ=}.וK$S̵ v JeraqIb?*R%Po܉JBvO;Yl/hc2Lf#$W)l{]P-@fkghgLO΍DNYdíG4oOrT1n1G/o'nqMd-8A}-. ~TjnB̍CTv^so#WDQGEKHܻj4oZJmR7kbW+'7 NRk"TbGm,B ry7=Y-C˗T`~CMyQ=(ݚm~SCJΣm gR]Ay&w"|r;sCDv }v/#],pg08)K _fV [ RpN l,Y n%+5 #s(�I4ۥnJJ[ yQl&B]3acImr&&oo5;<mvoо_%꣋OQ4l1jprfl9 / m*K8G>kYȜj1Wܭni5UCӖ\LЩ͙Ƌ*i\m%"\bVPZ˹窊ƗO~KuѿM�eky*Q+UmWkֺi X^OV$WsSsziҥ!O#93e_SԴG{2=ccw1Ռ{XǴ34oGk[Õt͜N2u[.Ѹ2=k:47%PJ4'.q(VTyvܞtgS#mɏ˛ >Eja[Ú tgQ'F)HWiS[3' c[qy͡nXe3+~GcM%rj.A:y^gmy=}Zl}UQ])&97}vR_Gc|nO1nGn�=yC38v'J'N$_!ZtBibܢLhzW]6 `qR?U7gM kEeʘ-bRI-+U Q5r񩧖н+i=v-joBGU_G\]jֶʣt6ə&Jͳs$-Y4c/.N^pr'TSgrVX-cB¶ U9Z[җV6(K2-KONyJ3:mNt]uʂ,6ns4ˏ5iWԜy(7Ey�LRF :62il�ru- cb&jSbȼu;j#2!mTj3zc7O铝9c+|^1yZܧ%i8yWܬ~Λtu2Gc]~ײfk6ӬdFuWR>������1� `�����1� `�����1� `�����1� `�c\'!c\'\�//(r!"OҀHG{m1?JܾH1 r!"OҀ//( dwܾH;m1?J"//(r!"OҀHG{m1?JܾH1 r!"OҀ//( dwܾH;m1?J"//(r!"OҀHG{m1?JܾH1 r!"OҀ//( dwܾH;m1?J"//(r!"OҀHG{m1?JܾH1 r!"OҀ//( dwܾH;m1?J"//(r!"OҀHG{m1?JܾH1 r!"OҀ//( dwܾH;m1?J"//(r!"OҀHG{m1?JܾH1 r!"OҀ//( dwܾH;m1?J"//(r!"OҀHG{m1?JܾH1 r!"OҀ//( dwܾH;m1?J"//(r!"OҀHG{m1?JܾH1 r!"OҀ//( dwܾH;m1?J"//(r!"OҀHG{m1?JܾH1 r!"OҀ e2&5ϺraO"&5ϺraO!�1� `�����1� `�����1� `�����1� `�����1� `�����1� `�����1� `�����1� `�����1� `���c>A<p>A<2���2m+#(ů?L {bC6w B[H/;|}ɮG$ZVgw <gFXj Nؼ@ab\ +}Lu%k#O]R VGwn_OHOr(<?MZ~;՜n7Z )} ?B;d8~o;j.w6Yq3J2~7E,Pfq[MGK%3[% Wn}VSƨ֫ked?-J0Ԅ:>tF#/mk'|\sI1([z=w+٬EޑtLvd<3Rl@z.:nL;|gu :kHPe'[Nva; Y%Sy98j\Щ:5e>/�oUrNrmR1oy02UMZ9몵]1K!|񋈼?9gT:ھ{63)':htkj4lr(ֆz=gvVn%MTvn#ҖcJ^ք:Qf6]Eizz.|ޔ݄i QGmIέLWo6^4Ln/#0ꡕ)\$s"jDͦ$/Y4}yr$5gR;Asf51$oOϺ5r fi!9Ƥ)Yy' ڷ*t'vO*boȯX a.D9-7 qνEz|uV)Csm$JmktIZ#7@O0:[.1Li:9GVw,Y&n<'m&BU#JFӬYylU*)A^BtJ+6:n:FS }�2x����1� `�����1� `�����1� `�����1� `��P? ~o?2>qC?r>7F<^/nqZ^IK<>/ogtW<Ov?�#gkGƛ3Ě3G/y&E's`nٍ@s}<:ʟgՉa׼^fQuaMg㬓z`׎]$Y%NcukY$9fMϹC>j+}.u'd=WrTsn!tM}fVÄH_1\5<RՎbeٵ͠tF5 H[%E{Owm.J B6.iZ@ӟuTDd}Q+ UJ]>ѵ鶌ڲ׮^u^TBVZ0V{OddmKMik[K7e%V+6oF`4niRVg_u"Q VγX:Îe@i {nA%HaW$9BJв3CXՍW^洳'8*hKyTe#k[~XFSHjU#zBk jYQBiںGO6VG-Ii:"] ,<-uXz͑/QԮƵUuVU6}�HoHu_XFhĖ×R"ui:wct*YZ[K3~#%jP;.&ԈZ8+ )܁x^\*^+ԲKZvNYuuͅwX-d9jvsm% \u�io:vH3مZ KteA,F�g#uͮ4DyoEYGApsN$4*N>õ|1MsYCϋ\zԌ[gmi!y=LSVzq#M3O/8{ӊou)-g#4i &sF+1Ħ#; j$?g\:jq;@ܶcҎ8z ^ׄO]UJQF/)ʈ5X(Vƞ<Iz':3{ҍYYiIwe7ֽw4A^ZlS0` ![C6?Beǝw&6#^\vUˈgFȱ!$B%:>-l*SjKegH#]\Fd*lp+K&C!&ytWVN+kW ʺI+-i;*ͯV::M}u;x$kӕN( ԏe$)y5v'>5hXT6o^NBF[w" jBjL[+Wz rBwlD^=f=SGR!v Ygx,I=$lLҳg*3tYo8 mq`LnV]kS_b-ZDM/9]0G크]$_jv%JFVIԪ;I#2ܽf@�+0���c���3ƹNO ?CƹNO ?1�3orTq nKTliV7JL5ΆnmF:L kB>:8wE|qk0ՓvԮFaF9׾=$$s*i-b*[D a7YoT:3l\ӞCsy%2m6h[#Flxk nM6bXF˶@e7>Ul&OLNt�cqoɪr(=Eij�N%֧}9~Go�S`}Ev|[ig(E>^'$?E]%{eIZYTVDaeBչ*"cVbd9la1v[u:zx\gv3=-mv+KZhAZqdF,['ֵME'hgT/##I!C_ZT65^`0+Te+ OJ;݉m3Q\X\�JU*gdig}[&eTZNnjV lSͯcgkk^p]h' + %q%9]VgMwr辟txLwmn;Sf'{egEYjv]vV>u#Tc:KG]NHą{Ru|Z t7*1Z҈Z !(IA[Y통Y�~Jյ#H" JPDsIK7ɺk^.k*+q=q4!G(O7]&$(p-~:Q{-!!edw'riѱ_hӖG'">F 8d)LsIgiŴ8uK 3m5c>R⸎_pYo ]ٲo;}VQ]٩JS]%՞Ke`S6! Ǜ>e<!њKt!ZNEٓ6( gI\J\$IE:t|LcK+g+It3["hΏ<KkfEk;3ϗgm_N(WNMj h2%N o&l۲u0ʊ$UP* ӡX\7dghD(-Nݜ<d7mIEGd ->ueLC0iGNTn54He/B C M8c-Wccj5U͵ԑM5֪*GFgZ[w{v5؆*Dy8B{h"9,~Y;<t8t"g="G;n/or4wͷ3(T?ZhQZhYEe^BM4\c]t\c]uƸ1cimlQ]y_b՜XΔgI)AVURڑ+cXUjNjR:  A>O��5c���0���c���0���c���0���c���0���cűkĸ#ꈦw% tS֬c]�SFbv)Mf׍+=Zk{Ǫ/qKޤGyiaaW2*^Ռk'*+ܞ[sZx#$4+wOmW +/l*vfiRruNk܎{[٪w̠%? t?(KveNbS.;䵢%cS~9iBg5-/bh� p*}fqMH|:9믧DMdv㣋%giCSێ?&FYƱ;ԷE_ 8e(^>U#Y%Eʔ*U!7MmÖf\gN0wVMgkf#tr B3M!jjQ/?=(܉HyӉu(㵥A\j<ƶZCEӞ*;jutw 2+J[neEm# =xnrUHmjJUy fO7d'l |nGѼ?XdT܉-Y.*UnrNlXH=ʮws:S9FbGl>VWfn/_.0T~w몘O&-q]8Ǯ33P{R<AxF>jb˳8^Rhi'Z3RI:8%3O%\L_gwxq}pXNrwƎ'U 6ʅ.NVQ �޵sq{[Ə! 5ǕFΪ,Y˴%W1~OSVtoa~7GEaն##ukH}UU{՝7_tUpH'ɵ ,%#b,oPYdzx1xc8elrMgHIH;bD %NSNIzY$VQE뮅i51 DQS MU6YV Ey5GX'gtFЫTzU 7 1 5h^^馚릚i5M55]uƺcc1cy|ޏ{tӇzp+XOv",2>m>?sZگJMl+%٦4ӮOq.;NLFTEf{d޵-^iX\K 5鱳*WS"5IadXRx[:φܟX.âx>/>$XPNҐk}Z5YwDV@n*hBRQymPɺ-Ud'qG} ZͲjUP8]yV'TjXԲZH|enB!J3tiRE)؃0G�Eb2ϑtum�j 7q.zi6Kz:Z-Jޞwi(65J Eh@ Տilytr#Nri,01!^zT^֧5:"ʇ7 h,47D=911*XZbډ}Ӭ&L{Y/.rpR8:ecԽn,\TV(zijBhQ;(o6>L=>HP[*uZCyoBɛsNY]jfai*&F7G4(dR.\V)2RVԺ#&XppRWq4^֬]6gDKMmiԻ rPfʐk%ѹ- y-ou姬ْ1e|F>K_ZVǰHLrvAneklJCt'Lb/^Ntt[|KA=_r[Lv47{Jv@{B/D"u/,:L)ĆC43\z^&o+!|".9NLЭb*z*PzӌhM?)ON(*ҹGl$n8+dm-&`+՝:B[0ZoZ.[&W{>Zb-;!ֈ<JȲM$, Lx\4.yUMZQujvVdM@}mp֕Mu'ftUZ@!D͛vW|-k&j4۳3:%KܥM,-np平mn`opZT :2Y4EL'x}7F2kkgqeVVQzjYe4н45M4]5]u11c|fOV݆Z*Za+zYh~A_,z]I bRa.b �kf��1� `���c>A<p>A<2���hA̮A-XL'7,ý9[iSvtG*vWw].Gf|}g;X#<Ev/ԥPwGYplXnsV FfU#|HnPrUݪS`>ǎ"sK4׮+xpu=4n3ce)tO=vnly2mHj*,)qu%)jV6)ՒF̊~Yn]8Ū,-xV$RفҠufjD۔v-qaz+S}YX]힑f](ӳatm OyoY*89< #lnsJCeMw$^W 9;PKL#lQˊ3,(LȬKk)fcM2:bdSBU]�,K-YNX7˓IGT˲+V:_1+OyjfRV,|pWU6’:-l Rߴ+qלge[2anxN(r$ڞu>Ȟ̋N!hRa anҙzNpDKPJ|ո~짇Z(6dXg-F!)e~kSnf]&D*(Om{e�<&2lHU,)qֵuu;Inç3Y.pfD%kS6nh7(#|khit}s{\gҧ}b& 6>2Lw}RQwt9j^J<=./4eSmT n/۶ȖǛBwV֛lU|~beې@9}C{^:,/=ƀw6g;Aj2o;}tS[lljKD B%ҕȔMx'F^f֛\oO%}t(?ZWb_(o3K-=F{RˡneF"1뮔<$ͪ.SժTu Ʈ܃$VRSͺǜR\*omjv!7{f"Sգ{n@N,駖<.['"5%O3_/1oxϺJ%6ەoG9Mާې\_#[Ff(9@ȮWNq;[dqJ$zg?Sr^T l5+%Ȩhhce߳^Z#+nm U(,5JM+Pr#HQnx;O JlYw|O(%yȩuW)Uy>V[ڪkW.7Z "'9e]?X S~nel3)IEQ>Eɗ8 ׏H.%qL[I+dRE6$&TuqU3PGâ_̭pYKSޕImil;(e:!ɿb*FY imj}uu%}w𝨏O n$MNE7֜Dni=|Xtk u]N ,c(9bqlpqfM窱@oij5̜aɜe:cN5^JRORvRzW4E)Y&˫)'Z#]CZwQQZq%htl$id1JBnb:(:kqOv iϕ}j=GKՇsޭ]]�67\iDO-qpqJGe펋N;(yV$E:糩393fm1nK)<*S@_g5څ fCG,ynzkUK]>;uɔ.Aj֟ d fNk^qk$Zʜ[zTؽrPvo�s�V"ᶞ;wigWq5rtsq̶R6;U6:~  X|9#bd y[2`wE)^v%{ ;hrkJVKb9H|^`pLǑ5UՐTT^[OIbۆ.kgEV\4Y]5;c@Kk5D)/ ;E%MQ6ScПBݢ#Sb4S1_$l-]}\#`'X(D*[d.{r}b*i~f}Q!ҀcW׷/' |-�9{e=yU7ɫc37_l1-z7Opg(O$N4Y=^�_q%f(_w\mum?Tף]dTwC^7|(nΖӏlI65k3n,9w^7DgѶ[kYrYU؎0Gx[3|u_cu1ur)ѣV$iz)'|Ȩ+F3#1n+nIBr6N5g$,JNvdk#0.=Jl]fV!U<ނ%BE֨U#�کU@Dn\*5RE7FV,yp!=^uuHPw #٭r^}""AW"+յSci!S2OyKdqXR_>In!d?H#ȣUr2&3F-$y"R<hSL ɼھo>inGgWaB'}nB؍TmR;jڃdmD<ˆ)Y5]b6!ꙨI};H2a`;)i5`\ ]]1?(b3Ğ$j.9\k2ij(-cқU^iQǔZ'GEjݒvʍܤuIk$ܙC-}}^oۋ *|ֲ͚ ZrP5ՠe}m=\CcJsY| jAPЎ ӷ U%9DՊʥ绐#5b#+CTخ)i)X=xf= tuUUJ9%vQگ < |I&iNTh;yw"dMJc|yzJS,{]sO*|o4,ʷwiYjWۿ/QyxCoaf}azv8 ϻN,iKŧ/t.;CXtYʻ%/穎 +'3隊&ȅu:2UiyfO1vyiщ)[Z7OR-Sk[7 X52؟zM#6+q|mtYO$SB׭KZ PG4,=kTiv7zu `]fLt)B#nijŠkqKLlvd;/ev!)ДS͇t p5L,{rYd6*q|~CR0nqݕ"܉֧91V] h6hU;YY2vˣc&*kx}9k}♍lZN67jt/ul1'S_n!<XNKU곖յ<TiuLؒD[lq\w&!L*%E^"ʛyWT8u/]W4TIcj)bDDY,mȒ4OQ~d#1g}, wu̫/U˥e/k^@"MY'C-H/̹]fзݩٮ4,&_0[/5<RgKvv2-gԉf]ΕNU*f.߶ҌTݏku#ԧo@4/yӐUt){Us"]g:ßA m *³PCkk8R|ds6,"̽jٽcKT|k Kthq5MjѱeKW<6x1B]S>9\FWmj c4wxG`nZW ma\*?^E=^h‹/o_RT K*xOz`1}<G8֚k[SFy/)7a($EJ䭝CիԞ}5EqS\M w#|2>M-Vi*S*:E,es5E"0gP+955IaqiJyxlM^"Z�wܼu{U<Yum]}Ӑ]6'T䫶~2֧}O '( {6(_bX|49vJK]-Jĭ׫w XG,H6aCEhKzv)nb= #5FZܦ{UJ#yQ65lYU{DfuZ�UgO[z.ڑ}jp��>2P|\;s.9BĴ>߇6 O]0Y̋f$>c%Wǀ-cnHwvum&=w5TK0mh=4п`x!{QچK*iGEhǿYn󱴥nZr3s�3xSǠL~Hf"E,8#ɶ&6B6yϨue#nY}Rrx$k6ttP&ƸQ6XGA7f+;-%]ӱo[r|GS~Oՠ->v[kN{n37&myؐjxOOkr5؉NbCIvx{*X)==k]Xd&2ȕjkmݜeg5jtI{.Z}j8%Hr(/#ƙC3eG%+)TcV*K&%')-v +s_vJ6iM;vrȽר%]ً6UxXQHE8͞}3 r6 .W{>mW_VW<C[9bVˢʢիtYh^+(~R9b][ӱsɪ氨 xO\[58u5r6 + ꬆH)1rmۛhoG,MM)E%}|H7$즙:!iMsnvrkM_l�#5MQܿ[Jw+^=u]J2;ڶ<GsVՒO Y)橴YzE]s6äu.ȓ^v[iwJhT&ZS9Ԋ6D�8xB2"dL$\s# wij@B6RzU`)~P#}ghq:Je34*)ZvةI4VұOIi1̷"ܒUs\]==ˣl{VV4ȑJz>-8ԯk2>ܝG:k$#r#"*et^Av[ipZ;L-Bo39ŸVo1><ueL-~[h�)X3wo.A>j M&ȣ^+Fv&3J2WU`Nʿ_`O[fQ3O(Wl 4Rr紥7.+Y<y)d:$TfڲLCI-c {-5vU02.lrz<d泑V@IG}JʔvjBW+8ì3Rbr/q%(E2Wa�[Е4Q9!fU|Q :we̪͝κ:d(-q |!-ݣ9͉"ӭ@+îU5"lwmHK̦)eH ,ۯIyb,Nr2<T<C~Xۭ%R\c_9XA dx aIJ%#Q&\\慖 {drw hO`GYsz$|5`$6MkFcQ=Hl gfV"999{ f HF^yΛٞ3� NhN6qXZ,9,mF Iq&MYɚM(=ʷsr9H #Ge#/QIIuWZ!!]s NnN˒Ocl%m'bڐT꫏vu7w䷸>>:uT}{s#hYwvA c}ʓq)_ u8 MzM)F[·g � ��1� `�c\'!c\'\�EgT:fvɳS͕oi3˜$>]l}JP-�ZJ�ԪLrٮL kjI)m&P:Y[@Z/|Wd[T!(2�`֨X7dfIY}r,&=(R/0 vs+EA"m+9*~{~VZl4x]g\$iY4{5zsk.mY5oR;uRFNigc SQic-<ɺHX3'Q9;`5:l5ڲ߽}ymA Mt1.5dqݿmP0:yzvtg~XV<i!*ToD4x.kK o%>q_ O÷,{}5Ґc"xJ3Br䵽<ֲUnaC_=d>[!CI~tTbIg\G+JVd$E,m ˨芙i*K:|iJՔi؛mPvo5,il=ʫKSwlM9n-gfEhS]uf,&MSg7Rۄ`$U5rWf3O0dz"%ٞ]6Nz9ȶV7)K'{Hq.oCefHFcj q5Rvf2H؟Ե-}eny1>HZ^0vnLnJYXIƷ#ܜ<vUX)8|׸!$iCIY2{HgJ{$}偾H:IZݴ^cj5kFIW|hgrEmU^Ko,E+x T-6LuQ,v`aėWkWwVS۵YM֮a0]yvQ[OO] .{qMZ:f #.Zt S'k3?oks[Pm]V s�nq#3뫄D 5Ygzeh=d�G7'&\ʙf~`lb9u_2RWi YSzIClkgeiiG^]qyuYcqNQ荌˵ mh+|'\4 sNU<$'c-b[c6EF�~PK7{@Fy 즾| RWe Yö֫ 2ux(4d{X&mj;QSr I꾵c 6dC6#g8008OM {'?M#*MS λ덱LS!EjD"xfba[>D#5jxaZiّZ֨!<|@ %}i+m=:uHT>ϭ $zJum?,Sz]ER6ۜm֧*5+a{9dTe\m|SNjSrqyZmVjnWC-ҙJ r4 H!u_>LMNnŲY;9l+eY<(ѧxj{%PtZNy4jZ 'ZJ؛T}̻&Eɔ&bU\2u7$5*oPģxd ybgna-s JÑ9z=F�LgWXC%\@qV|yҦ1x?vZʭ͕6T֡RcMoI3Ҕoj1zٯFֳ&iڳ,zNI)F3Pג ԰!zlG_["ZhJ9Gi ":l\ o Vs$%EvWAE}].V1Ű[IK(/\J6ě8 eمވ 0{EGl;n33X " PBf�z1Aj4w1'd  HTP~/stUW%|B[PM*7(|yrY ?&3ꛍ%Tɴf7D~ver҃訚A[sSuR 1mUE-5* &5)E&0L+tN5 ( ;{v=c=bӧjyJG@c9ȎU>`ް3 FA=H3hqU7o]y]4ːFki*XI;3s%'1unZv\jWiyRmQfYRT0C5-QZV֖*ںŠ }r 4{wӳ\rV;gkDG`S\7.P=K%r\M@NӪ/Z_jҖc$_PUH ox>L|yf +a )dpF^#[j6 \9,pI~rPhnE^A bL ѲN;:Zߡ 5Dzcۺ+M9nN@* Ae)ꕲ^P h޾xu>#=nnJuob`щ:BܢܑJQ&_Fn^ #Ejf58Pd|mWPN>-TV�Ntne3kK{+bD:0Ƣhtq36v|v>�Od5zM_* 2uRэ zǯ_hEy+m%W^2ԕCʵGhBQ`[rjnZb*3fב{8Rm1lS76y{}Jr^5ɛdS⼵ a6eCNkJcOJb[?]NO ؓuq3PHj ;;ڀ;0YbK E C"Eݪ^�z~"ī[X<u! 92bzTֵ/cr\GXUF*Li7&CG!mј}-g#GH-%@aw/ms݀fbK1%$gw1'fiF'^;P��� ��UU�z� ̦)멱+[eWf2 65^h܂RmzLQJu/m9릔 d.9ؔI=r'hҸJWB6OsH r)Y+tIy+앲)_dB-P0d@@.$NO3OJSSvYtngRRA<`grVhdZ[<bfvDfĎc-Z6 LuM3#M}-1 #kI  A l09LF7! 'v P Ue��U Mg}u԰v6*sԆVBJ7S܅bRD#4Us("=$Ȥ;db*bVlr6̼.edY/d:-91G\e>ʗn[&|!i=Ԗ&VvR\LR4)I+.wt$w5YzU'=KԢ;z(NԘe/� L;Q(f �cֲֿiqḟgfʭF(S^9q x\Wko 9ok۬̉Cco] "B͝RBELCPnbuOCEAF|jMĤ.kr|>O�NBiPlZ >h{UR]O{өvs8JL?JϧBQNSt3Z"21Ʀhx́,9V5vkVS$y{6]iVJFc]}^)h?G@; .'x*G M,`ԕώm2_؛\zoͰ`EsOHTZ~*[OjV6JJF@褯DdRL2"u/F24%#&OHFcqSۢ5 jCQVH1)bLM9;Y{ks N>VouM׏2Rgh5a 9șZdϫ;%NQD'np5BBI(']4\\Z7Ojս<:ӥ(;^u* "2(T" Q �AaYRT* 7QV*) ]P +㞚l^/ -DMUkt=Fo38͞�2I=:{UPu$DPШ**����Nij1�6f%Y$I8�MYX` +Ld!>#,W0pT.U%߻3Kr3*5b{*Rw*ee 7  6*YS#Rz*fA B h]Hã�ǭ>T)c8@<[ZB᭍ElK[tRP{!q H.F[lZrl=/Nm*ꧭ?esm g 2Wf{ JVvd/.g2n,=JRu.׸zzl:=)l;fҤ"btڽ$<9ɢӧbEHUd017/D,2{ K$xbyJ&&ZvMvΙθ*3ŅPe<iJ5R&4yoep:*dsf#W3P1ǷS$0s@�U!PCbX}'%ORK/BIɆaA A>ϊ+�"ӧNP�2׏DvT¸lh)a2D_dDأMf&j ,2kMҽ[E�^6tzS%\7W(1OυF`f]F\V` *v{Bi3#3c2PFa}g.WE}DZUzEW�0V/NLcOZTl+XA"uY/Rr൲(҉R쓦eY~K]2g}1O:NuEj/:E+_?^|GC`iD \N2K;[(I%҄ܒ];"v7ҽiP�It;\ 15z޼YV$Y^ϖ<2l&H#KWK 6rhbgZ)9&⃢ EKTc*s+tL~S c,j^AS8q^ffIeX+%PPД!U:(�(*X uVOҬGBLU |LWli9)t48H:#*LmM"ۛ}BQ ]@Gji�񷎲ntA CVAq]hiiOhF͍rVym 1t;{zӭ-6wNխ)ZҊCu[{^sI)hxiONLuO{Ƴɷhu]!=2.1nɔ8'x׼dn5U^otC'Nda$3hX`>&Ri.ҖM1Hٷ1<VNZPuy u Cjhޝ~V%qڽ�:YtD"TQT{*1|J&tDZ/-U,tR24Kb6 <lBd(9N&'M"iJmrjZɾyCُU%މ# ڋC''*t5?zNI}٠0=}9x#gCB=i/V>O �fO7(-x?^'׻׀� `�����1&5ϺraO"&5ϺraO!fmw1o?JP:u@Y@3r<MEzJ ۲:nPgx}u+f'"L֣ 3X;o^Y ճ~>]>9T.HOY{oꔕu_fFHK_b{$LcTqill&kc�{C͈gmxpvM} g +-tcj˚۝(տdy`tZb@=5ѳԲJVһi٩q~�M#XHPJDG랯,J"[<#K1427 Y$D{Mlebɱ[Y9,l:a$.*2cge<Ivk/e{­>e PaxDE/NF$V;U:oqW=nwǩ4ԉ{Oh{SM>RJEɻG rSV;.SLw6>5ɜ"/OXL!6`yo՚J硌kw3T(\vPE/G ЋU]SZ𬵍r._WJkg2]G.<Ԗe!nJDEx|/N�Hv[J0ٙax[pa|-k;iiFH< yNHMWt=A}jlSQ/]YKU8ZQH~R4q#1\yM 4e+.u3)l[Lř#ڗH 2N5xDE-n~CѬ>ٮvv*} By9YZ} Q$Lu'RKԓԛNN5xDE#=�_wӚ?w�{;S^x|D^?_+!=�_w9}~_;NN5xDE {u~/Ӛ?w�{;S^x|D^?_+!=�_w9}~_;NN5xDE {u~/Ӛ?w�{;S^x|D^?_+!=�_w9}~_;NN5xDE {u~/Ӛ?w�{;S^x|D^?_+!=�_w9}~_;NN5xDE {u~/Ӛ?w�{E>E}sן^;߶&rV_[}~νͽu@�:�؇'BΊzz�?�6cGsX���c���0���c��U"4#�x&yKj>q/of-6O}FvD߳QE-+sm&_w5`4R[Vo<o^6RfQ+9;25rSt1ƒ%ʰXF᫳]{hcg@k SL-U*Ŵۦ+&pJ$ůCWgf(Zp_oM mh7izjGjq}(j7 jX-{v3&HcaO']iFX[k.d'L-&7ԒwFg| !6<}s .WVŧwsQHK9g;9H#42: b<Ŷd_xԞOz-Q\ɩidQ./G/k=͇\/;/LQ6pVuv|725<6%Q]л65<:=I,.0ϫI PRycԮNLBzָ?w,9]y"ioI ᚦqF{vK7Wխӳ&zovDZҾu^]7b;uem6kz~c 1.i ZhQ긃X8lP45jZs+7Mկ-hMjkʼIfӚ'tΣe)q<Fy3&YaeG NمL5\.'< !s:G]�Ɠ"4n}N9S&fMV2Wg-ڣPtۿErVU\iꯍ;Y1-cV6uţĕ2a16FTE娙tm7QӅ;TbVԖ5 ZK_Qׅfո20P1~T?."vɒ\lRCBˣu01t޲dʬ?DN*٥ZȞ/?FUO\uuo0آ2vHombʧonچtՓ $jfK){%^&)d Y Rt1Ҝv5Z}ku>8wٰ8"뭦U>uM]d~HZ-F*Y=Q6EuZ{/|2-Ѡ/2>e,dő( N^1#&DpWJ;Yd&t :d(ØlfQa|&8okOեkGneZW֛PVkIηbhٶT]wm.Ai-YmlAo<UAimEVH}Ry[ lr6}UkPSD/E7m<*r_:<Ir_ uJ",2L_G'rI䅂G71$iۋ)<?y;ҩP=Ꚗ c+^ [;V\;lɉs֧ȝ]88!KQ|Emʈ*jSc !@eƗY{\miiIW=ZdD;=b~@@<!8-|ViQ0zR)s:^+x!}AK-L:?" QQR|)Ka 7Z�YrI M8SKr*($ɣƺS.-:6FIFPQ*k$uO8Gc3fa YO2F;2DeմɮmS`–4Z°#khRzBb8S61k#]mZdq><=qadG'԰]2.jtb$҃ k`6֔lV#4m1=RӢ=|óIO9әA2$ſjNφ-vNF d+nKv:`zN:)=mYNZlXFViq4rb= xV&bҔgnMTOct v !g[.Q)~obMiL&RfV&0}eKѤNVTq=zIFxE?k-'nhq5qHwEOl3%ܶM Sxkn 4T9i/q t馘\],A;ze{"ۏ2Hۗ3f#_WgltKsG7F庲F慪V+IٓV n=ʆ:-c-r _T͎`p w|gZ''˔ifIq[ ư>'[^(eCv=*Jw|eXr箐jyKDBךTwxxYm3]<-q9"9M 8_KFK{#ͶEf{FISw`8@UIsZ)冮kX0faeZwCBէ޺(Sli,s~M+\sú~˷Aآ,5] wC0]K08{pg,U]X&ӕ_&DUf KRyRJFØ]kZ[1N-= Vʉw\IuvSH*5Wm({KL »EM@a[Ixryegk=%H ٗ0Y\.ܬI6e_ЎV&bO(FVAOugM}˒^N<֗!~P%^=2Y*DgU&m%c  a>ekCxr2rN"cX\y Ԯegf3'|bҒ:Hн375289{nݤ2ҘVj=ʑv.r\Dx_(eۜOgC8_I>9œVޣQ2VF-ݬgJk"` 7ÚXV8G]p45[[ì5ơLQ4946MTR!]}֥b2A>Pс^CgVZI>��c1� `���c>A<p>A<2k5_T퍳{��B)?J?_�,=߼uxdފ^G_?g/vYOB?ӧ�\vWplȤV&w5o-i\zTTJɝ1=:} $4ߋH»E$yplqogH#së%Y]+/oW9Fui&;w4jAV Dy~ֲE9')"$ %xM!lѬ{k<Sf{l߅C{D9h/Fq\(ٜ=Co^.+5ٛ`(Uq<7/z:{pj g_&3d?NZ@.ڝ}\1qH4icCޱ; +Yő fQɄ!L&IّN 1Jl'U4oF:-*ie0EY$к5'c#S@FbN=*v< -v\cgVIsw#Vn{|ʊr�Ne:[]/781QqS N؞oYCT-EPŕ'NZ@.ڝ}\(?$ɈUF{nL`Š3M {o_b==23DZ{%)JZdl,P�o Ԧ'k.<w5oSǞ/o\."_'9^VbJ:6*1RaT+<^N'LoՠGP%e܋;+�T6QR;S/˃v~- _c㿗 A5*K cJ)Q! 8U< #%ɧW6^SjL]&Էu;&.'vb5hkc)Y?Q^znmo`#һ\9L uTyY7аBݝFk+"@gp;HէpOqSQ, ANLwt=tVGjw>;p~Ť |wGrΗui4k%b#e:9,n !qp#rؑkx\:IUe[DcN]Uw0d$ij&[b*[4u[֯bѸHNT eNİm_Lrbk M%ffWGmRF>o2&G x#M<cSHEdtu~% ͒�;i?Gjw>;pJjgDD z-kU=ZXJGYȎ_\ȹ֕Ĩ'f:iZ<)-iW6Mݠi%;$91DpT7*{ej-~0ݩ<g nSԙDSbscҴ%B7Xx3V^ɉC9hCqN/ڝ}\;iV_Էu;&.'vb5hkc)Y?Q^znmo`#һ\9L uTyQFX$J0yܬ 8rV%nzUF؉ x# *k:4V$73(Xór;*מMPE'JpNʹ<'qEuZ$#ժ^9YE%y$nN!@+_||Jᑄ= 29+KoYܽQ}qBD)TO};S/ˆJ2ARbo~)oGl b)MngC_=,dҦv%BE.h)9N71 Bܯ*ಆ hn5B)&Rh=:'^'=FRJ#UBת(ڝ}\;i^ #k~S3N/ O|(ڝ}\;i^ 7?|N/ O|(ڝ}\;i^ 7?|N/ O|(ڝ}\;i^ 7?|N/ O|(ڝ}\;i^ 7?|N/ O|(ޝg�H?VCa LCTwX#*L؍zz$$DȵV(Ly{{YY1 $7uw{%3�P{㖆ԇڽ(kPH � �+9kkF(;褩=:-s1�SF{tkU(}�C=dYת����W`�����1� `�����1� `�����1� `�����1� `�����1&5ϺraO"&5ϺraO! j�.~MX;}�&q/�m�ƹ6cO\eKE"ߡIZI)aic#TFcMNvؽz-.jY^vݾfQ1jY#α`VޥVIEqƨԝPA:A nۍsjPCrףS{fz=h#PApO OJ+АD5e 2GzEA_+bue YV諌?D^DFbI ͭŒW:Xΐ9OLhfCLˮ^cM nn&1SWԕרƥ:E U'LJyRuk4EYv.{˟w6/M|W{u#* uAz v'hͧT, a<fX\ 1DHcnxIT/8iXL$׫HG'MKޅ;MW*zOF,hJx)Ҹ4) jI\T}֧NA;zqwUy[V *[k=\׻kfkz(j3i2S]�I/~^x'R *YbZGh[cɮ\sҪ2uUsĖ3Lk$ v!ZE&i)ͱg;d2)GbI+4oJ&-ngX~`э;iKcl ڤR4+LQrRukOB} (}**=:CԌ^=p� ȳn4>n`AE'yatJ6zlNp[`8=_^`,n:`|uuT#*DW-ZomV}7nܧN:"tukJFG$lK@؈!+%n͢ETg!Y:�2iNHNS쳔bتX\Pg$4z RĒU^rգ*v_1<ҷvBVeֲj:=إː=.e[.yCNI&5=<Xl؞8HS cYɈSV0i գZVPseJCz1AIQj�S�.Ka X_Զ]/D3D*G>A?*1($f"QXJ5M&fRId2>[Y&tcN{fR1BG;T n~ܔ[c\6> C4PY`|rsYrUdhd[IڹiaM[[vHѮ8Pv 2ɃuĦ,ؽ$I=IT UE#j{l#،ZTnepMbV N#O#j'F#,gsirqrP%rp�L7N,G_igbZG,Y0�zz( TtTUU U@�� fp���c���3埸c�FNgg'-Q^_5O\O�E`6ӏKGN>yz OW��*˰���c���0���c���0���c���0���c���0���c��w9?0'9?0'Z{YY5b~ok??pO؏�8��nU7pq vU7pq y[�U8?^_$p�L��c���0���c���0���c���3埸c�FNgg'-Q^_5O\O�E`6ӏKGN>yz OW��*˰���c���0���c���0���c���0���c���0���c��w9?0'9?0'Z{YY5b~ok??pO؏�8��nU7pq vU7pq y[�U8?^_$p�L��c���0���c���0���c���3埸c�FNgg'-Q^_5O\O�E`6ӏKGN>yz OW��*˰���c���0���c���0���c���0���c���0���c��w9?0'9?0'Z{YY5b~ok??pO؏�8��nU7pq vU7pq y[�U8?^_$p�L��c���0���c���0���c���3埸c�FNgg'-Q^_5O\O�E`6ӏKGN>yz OW��*˰���c���0���c���0���c���0���c���0���c��w9?0'9?0'Z{YY5b~ok??pO؏�8��nU7pq vU7pq y[�U8?^_$p�L��c���0���c���0���c���3埸c�FNgg'-Q^_5O\O�E`6ӏKGN>yz OW��*˰���c���0���c���0���c���0���c���0���c��w9?0'9?0'Z{YY5b~ok??pO؏�8��nU7pq vU7pq y[�U8?^_$p�L��c���0���c���0���c���3埸c�FNgg'-Q^_5O\O�E`6ӏKGN>yz OW��*˰���c���0���c���0���c���0���c���0���c��w9?0'9?0'Z{YY5b~ok??pO؏�8��nU7pq vU7pq y[�U8?^_$p�L��c���0���c���0���c���3埸c�FNgg'-Q^_5O\O�E`6ӏKGN>yz OW��*˰���c���0���c���0���c���0���c���0���c��w9?0'9?0'Z{YY5b~ok??pO؏�8��nU7pq vU7pq y[�U8?^_$p�L��c���0���c���0���c���3埸c�FNgg'-Q^_5O\O�E`6ӏKGN>yz OW��*˰���c���0���c���0���c���0���c���0���c��w9?0'9?0'Z{YY9bIGs? ꒛5{�?{ {f �ש�lҪJ0�nۍQZFEsbG00=Ȥm iWU)wX9afmdw6k_Q�/JOi:r;:&ˣёEYYHee$0 AṎ&\G*rt>;Ftk#Ѫ]Xe` rSw6k_Qý-Z~f9(?|~/OG-?z[fu<;5ۨaNkS |G7�|Sw6k_Qý-Z~f(?|~/OG-?z[fu<;5ۨaNkS |G7�|Sw6k_Qý-Z~f(?|~/OG-?z[fu<;5ۨaNkS |G7�|Sw6k_Qý-Z~f(?|~/OG-?z[fu<;5ۨaNkS |G7�|Sw6k_Qý-Z~f(?|~/OG-?z[fu<;5ۨaNkS |G7�|Sw6k_Qý-Z~f(?|~/OG-׻9'fkrxVS[9*%S9>=8Q[h{gAz[fut/6'G&v5dkֶ2ۗ{i~Kj~+,E^{e= ~Q!|/_J֘kG.;) J?fWkg( 1΁XkպV $7uw{%1�XjPpKe�y7zggv_a[ ˻#zDLJb8�B1Z4Q _[[RFi듙ҮgrS#Cn&w/N9khj/1M[fz"v�B�T4Y[f7D,$UԎ`ю]=Zj>=b}1~>�G#'$:MN�����0���c���0���c���0���c���0���c���0�q1}ӓy1}ӓy e>Sgx��?x/}�uD0e=Q.l Lmحss3~�}E5s�`3FjI]M)JʅQhQdunIte} 0Tr4ͶemAӟ35 p��c{?˦s)Q(I=I*>�/vkt�)K~}$l�o羒 =9}~*}~./vkt�)K~}$=rqLE8.iuatt;-gpcIJN!i/yRyev9}~'?~>}߯vk<9/s>s>7�~}�OGïhFNC/r1cw1czsOA~t|:_ʚvk<9/s>s>7�~}�OGïhFNC/r1cw1czsOA~t|:_ʚvk<9/s>s>7�~}�OGïhFNC/r1cw1czsOA~t|:_ʚvk<9/s>s>7�~}�OGïhFNC/r1cw1czsOA~t|:_ʚvk<9/s>s>7�~}�OGïhFNC/r1cw1czsOA~t|:_ʠ"G�g~o=oF(\g1�?OWǽ5/m*:}_L؇5V=`~GgMq?@Dz� `�����1� `�����1� `�����1� `�����1� `�����1&5ϺraO"&5ϺraO!qs! G  >�ޟ_%\@MX,RmV65&?H#j.-F(E'CM3>lLF�:�Z$ m8`jdY JwAUm "eu-,>N㫻vıCC"ؓW:ll<6jdyFtWfU*I!#(B~r6`jVj([\Y d]j͗6c}ZL8H'Wd{I͑DD -t\=y(w޿k8KUNJmhZq;qڑR&Ʈ%46^c%Vܙ0ǣ ÓCX6>b:n[zPñg'"VRΡRuu$0Emj(W3|e8ʥ.Z8,GItrDʇ(*gmȥ {+N3Nmo 5p#)$B[9&2C^cĕLea#~hO^ƯhUdU5Mޭr6dޅ]6 OwAͿiQ"ۧӋSuo_|n(]Or^; W#b~g; dK.͋K<ȢOLd]JsL jg9q9O�xF-P::d@`,pJ]̭*h'Nj9_FjܙbS2Q{̙Y)\�NK� lXxP.H#fvz=sEBGRI- ""VX1Ov35������1� `�����1� `�����1� `�����1� `�����1� `�����1� `�����1� `�����1&5ϺraO"&5ϺraO! gbM=`s�c0 :+魅*fK5,Ds %y=)/VF L4wld}> � h? Jf޻r�?c� f <3}h�c}\\mV$m7-qB0e<"̔]Z;Ke{]\LNeT]Wf#X�YK/N*g{'0XL%7!lfXgћ.댡tBb5۾ENY^c/g]}&=]];38x?Vp,Zigvcrhj7uGn{ -/&Tv5)5N7)|yXN} u;U_ ot̐2a^RFc+}VGj*o\Uۘ{t\tPdnY> NQ5�v;����1� `�����1� `�����1� `�����1� `�����1� `�����1� `�����1� `�����1� `�c\'!c\'\���o^מBCϐ,N4:/l|/=5Cr6+35"qr7V΍tC1̥EYQܷjKn)Wl(C#% ]Stfݸ%dmZܚW]r[ǣE���1� `�����1� `�����1� `�����1� `�����1� `�����1� `�����1� `�����1� `���c>A<2����1� `�����1� `�����1� `�����1� `�����1� `�����1� `�����1� `�����1� `�����1� `�������������������������������������������������������������������������������������������������������������������������������������������������������������������flask-peewee-3.0.6/docs/fp-panels.jpg���������������������������������������������������������������0000664�0000000�0000000�00000051124�14605757052�0017425�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000�������������������������������������������������������������������������������������������������������������������������������������������������������������������������JFIF��H�H���Created with GIMP�C�  !"$"$�C�3"�������������� �T� ��!1"4AQSUVaq26RruBTs#35$b%C7Dc�������������7� �����!QTq134RSA"a2B� ��?�XA^,9s sї5Du1Å3Ŷw팆c7xEP|=9.wtQCujW6Tg鄬h;@X:{*ue9 o.Ƣ}qKI<HZsҴ Zh6Bm-D GEqT4à LkQ%p\Z&v`Xjji"|SBpkA.ح4Ew; >B\ڪH.h7ً&]i(!jWL):&Pz#Z U^cx\<}V\ i**$lP˞p\rٙWqQU([RF,-jݖc`h!Miݵ [?(4Ti^郣&l-9Q@8L5d \A5,z٬7]u7 y3&(*FAugv!ibF~j5�lo.+??NNv~[&QPj#!{Ns*b1D+=l3S<lC=�C%j9nnlnn6.0kl8o'S5aV.P5zpuȦep!CGIPئkk̑ ڀ-!(;##SEw%8nRQm%3V`u@g2=�p@ݼͤeÓk e/ nѥlOpclnΧ kNJ鳡0-sPHWqev(?UVٲ-:g][?];$ud19ִDOsw;q㗴?�s8֚+}Go?fx%:RCy[6b|w)bwL ;bd & CDHpo#S^d}뤺,m ˫S 1n~|mz6}2 RsqPqe;p]HX�9e5 UEY%H?k:eѳ~4.9ΰ#YMec SYXk25V> e5&#YMec SYXk25V> e5&#YMec SYXk25V> e5&#YMec SYXk25V> e5&#YMec SYXk25V> e5&#YMec SYXk25V> e5}a5.⽾u;! 1$>]x�Yrq6�R6� кv lm.Ӽ@n|+fMWqҌg\ܳ2PՇqZ�,Y?שYl.�Z<ƍ-hv5t3zvFI#I#ZeH̔m/iq�-&,tåuWLL|�?9ie�ةYF|4R{vrs| _B&淘"`zvI2~IkO WF%\-f?mU_d]Y<#\8?YUWy3w9�~bu1MTe}SU5O\25X*ֱS_{ǒ h-JfV1S�A]~vXᨒ6?嵯 ;ǎ+= ܒ7t3rKޒ<ʩ�G4K<Get"49 :A㳼] ܒ7t3rKޒ<fw7w7ջ8q®:ʈ u33@:4Anxz%~oIU{Df䗽%Ux4[Ҽ Wc_E\5r]½/{zJ'C7$*hLeq-nupn5W%~oIU{Df䗽%U~]_f�a�+F_s$R6MsUG;ڛu~8 gB#M:j \w7>vsC:joITZs'WP~y [K[L~^Zs'WUؽ\F,ـܪk^f䗽%U^WAix%~oIU{Df䗽%Ux$? ½/{zJ'C7$*h:)½/{zJ'C7$*h:)½/{zJ'C7$*h:)½/{zJ'C7$*h:)½/{zJ'C7$*h:)½/{zJ'C7$*h:)½/{zJ'C7$*h:)½/{zJ'C7$*h:)½/{zJ'C7$*h:)½/{zJ'C7$*h:)½/{zJ'C7$*h:)½/{zJ'C7$*h:)½/{zJ'C7$*h:)½/{zJ'C7$*h:)½/{zJ'C7$*h:)½/{zJ'C7$*h:)½/{zJ'C7$*h:)½/{zJ'C7$*h:)½/{zJ'C7$*h:)½/{zJ'C7$*h:)½/{zJ'C7$*h:)½/{zJ'C7$*h:)½/{zJ'C7$*h:)½/{zJ'C7$*h:)½/{zJ/ ܒ7uʚ-k[ zF|>nI{ޛU^:%~IU{EW;kXDLC?a{jy>fM(s_9Y-*flnIXܗ8IW:%~IU{Dg䗽%UL�ULSeN.ok 0χ!@Ͽ%~IU{Dg䗽%U.?j]r|횺f\HV5Wz%~oIU{Ef<T?0p-�ul_)]s]STOEE1L}E.K;7*}//IG�kG�h6( m+6`NQ5df^Vpg#~8n.;qU^+ dc4 =m;-+clՎElOE,(.ei''#DkvȢK9Mrs`چwz^m9�:v'9M)*K| %ۛ3#[EnSɕ~lE_T>7skpqd7+P[,mZs,V˟# :WnA٢l4=z$ˣq.;G,:V_]w $A+vn9Yr}U@׬>z` ZH*Um}l�}516Yhߏ i,UPOjkV2fLk~Qsq[yKZ몚f9FьFd C[mKͲo]=o.p0^p c7(?9{Z {*c>c|NkArX)Wα*"wmOh3[{EnUB ơz#­@Z;Mlݘdjfw_Gi;Icx(-I3C$2'73cgvfv}f~fL1AsxppH߂Eve/SAjU\Mnk poyT^g+ٝT -/`c3 v7)3Ғ-&;d֖gCtSp:%nΤD-ר_X^o5ȈVUiL�VUiL�` ͞MǖM[ 6MƮC�fnxWF8%l%%(SU7v�tQ>Ҁ .]mLo'1K {~:߅ck9eRQ%V}G6ǣ=0&]\8{տaGEz%S2BA78ui/%-AbbL0\Z]s5ӷZQyɗ#Ȅ[C4Fx9k\;;#rhvGeY_m'e 4F\4qqJp&0({5A6+a6ǵrmS'ԐcV?dub֌z<t?1TQʽ;tS|0pkEDM�GܷO\r5mCYG.B SK6{&ٮv(.zlYZ<iFKk,/in`8⢛J# gg Jg{G|[h,-hࡢ^)`dm$@N7 'wd>wm{ֱp\�w:Hvi˽dBT5H�F~zegk6k`9-W`y&IVdJcԘ싽e;At/}rAPpx2p ڷQj{ݮ uw=R6N|/2L;)F[qikd{:Kt_vf9.ڛ7k=& _R�79NIN jsnIhCbe3 oh víٯ|)oڭj$Zo Fp'%MtvLW;U<F[+)} R;4c16ݛuiX73G[;eLZcDMtLN˒/vz+LML"Nh>YˋsOJ7ad[Z{ٻO#_xfI?Wl{g[fST]2ڠL%'.ݽ+Z?K靈>KRju^XH d;"Ҍ#\}c:�(nivV?&qbojѥ8qflǀX\Ql]~W(dܟYqVz[P1/]Inv {5\-28n#ŏX=h.^h`( Ic cE~| w'_UtmZC C~[uF=/%1M˦SM-򍟓mnZ2ASX5KEz*,{&� a7njó<XuAPcJU\D ;$$g3kD㯯CoqEͺ�umgQ\=aֽk;w[+8+ e<΍&s{sYwi^١{7gcQP9 Orryĕ5O<8h3�dҊE=no�L6_ojVqٛmCsCKMb1Tƌp 'vm�̳SkD8)1lk~f?|?cͿu%a=%[$Z߇}ٷ�2oe:J6QE~ݛ,6�YӤl%[$Z߇}ٷ�2oe:J6QE~ݛ,6�YӤl%[$Z߇}ٷ�2oe:J6QE~ݛ,6�YӤl%[$Z߇}ٷ�2oe:J6QE~ݛ,6�YӤl%[$Z߇}ٷ�2oe:J6QE~ݛ,6�YӤl%[$Z߇}ٷ�2oe:J6QE~ݛ,6�YӤl%[$Z}ط�2)i`l4NΗ88<*bjTTOB" """ """ """ """ """ ""ź 0YK/ ɵ?1YPpZO r͌˖R4_n˺ʭZ*wKJ5S'5I 55e۷ *[t_Y ئE5#po߃p/[+[)` UEO?#{?f:lkWlV棥~5j�>rAT4qc`;G 6VyMہ_piȷ*cաNES}̡_v+<kgQML/Zև!@Y7O_v+<na4=˃C~ m}ج'S}E7a0~B?6VyM݊)Mr?!_v+<kgQML&yph{ S}Dbo&Cܼ4=G݊)|@Y7Sv ^\#kgQ> m}ج) /. sBboVyM݄h{!@Y7O_v+<na4=˃C~ m}ج' S}E7a0~B?6VyM݊)Mr?! _v+<kgQML&yph{ S}Dbo&Cܼ4=G݊)|@Y7Sv ^\#kgQ> m}ج) /. sBboVyM݄h{!@Y7O_v+<na4=˃C~ -}ج' S}E7a0~B?6VyM݊)Mr?!_v+<kgQML&yph{ S}Dbo&Cܼ4=G݊)|@ZY7Sv ^\Wtv#Fh 'wuK-ۮO^źi)[H0#w<Z1Ϫp/IܩWZ8j mr֨>䋕ou0v2&SeKip yc�tUO'P*V84[dS[Hx8vӀ8%F}J:yK\?i|%>>&ޭyTk96mMWKTk09UaWr9UaNrO WiΟU9ʮ>,s]:}T*L>t Uv|S09UaNrO WiΟU9ʮ>,s]:}T*L>t Uv|S09UaNrO WiΟU9ʮ>,s]:}T*L>t H9X^o )bz�Y ""ZZ}zy_ Z|rF17Ax+hVm~`m_nή۳rޯEIJKuxο[Ĥ=ٺn@)#%tOiӆs4q++|¹'¸\xm B8$f[X)Y \"gOf PjCn-όd-ʺoViibtHh%> eifڽV[Nms9M+u9AG�H SUKj=ql}DthcH50T|ًOV?6 emTKdI ;^ff_N-jzIMKZ0%`s0 _6&vWHͣ:Ztlup/~3Vო.7)#/#7\bhmr6T\]>&%ZIg$qLN""(HJ/ Vmel7IM::VN,{XԖaDTN= `#pӴTq pђ.> '6XoNKm[µ׫|ƞfFË[pr_Rǯj'R~{ [v5wIAz<~0V$�SapZA;>Ux[upݝ Umꢒkt-#飍xS:=\_P>Y%^[ti48&ڜp3o}쩫]5|ʪ64<x$uu$Zvz*ltp;){!;p<pVQ߹yhmi%( j*bVJӮ8en2Γ.-n9a>=%jgmT}UQh{&rv7 e:~ؑ2m =f䮍ii[): AzgyfࢬboIڽQ$.4?7gt#]-inp]%^D"iZ9%uI3#^3""" """ !x /uW"CDeE~duDdyI98@h'�H7Uu4`;ܕC$Xb2Qׅ^1BƯ^"" /8 5l; 5폞u6rvMnG_j<E,͖7p /<l%EsvJᬘS'5o㲬Mձ[?Ewڋ-[nu6G=6< I]QLӗKuյ0RRR<#lc-sNA%jjvl궎.ѺIEw4kX\ #oaK\rm6O-G،$_cp2)q6YMYN9Zy[# i!SI{,Uޭ<y <ꛞHYc�A^*CU TpfUi?Hh՞8hߝÂ}'Tڢ"" """ """ ,[P7nB�k�Fڿ''ZdOOU[vupvݝ\%{Fv i6kUʞG uXhYF2 9‹}0n_ka] ߔ(vfZ$ƪHDt:Z5X7@\y'pqg?� ;`{R02A<9)dٻJ =RLN6BFMvmsO 6KmLOG15�DNtӜqo r&hJmC88=�'q-'4 ؍6?l0TأTXmZ9Ԭ0T^nWJ[\SW%c`lF2i'89SL6 YN~@yOֻPq#Y- xmv]E4-lj p޶ ;GZJ9l󈢓-cMwJ8`Bճf9e)&N~b 8{\tI w(uncu&J&CW+9c=| {lg8' Cc1NcW[aeD2f-`sFD zJݢkLV�ژꇶ*%g0␝M `�0nO7[;4me4&57#È*GF7O5{͵M$]( &&c)R_e45X516s?2HXD\' r;IѴGK\:Wk/נ`FYAOipl'es<6GEA=CH8~3b%]]5I"bY�6I-[49.s|sg=_T4Mk~ds3$lðwX;\$mr(%3ȭt7"13!CNfyU>{{c <08) T5.xl}0OHG}Gms sfy h`8n\P7CmfI$7[L0I1i�s?@A"*U?KYpW?1$ia1i!_akw]Dۢ=鵵v�g# ަKU5.ls'OJ"v8g$I;Ԕ1Q { "11qt~m5Zvv90A,ᤵKr4 ^P[~o,1J4?l6#,�J1wBS#$nc FA Ed͓׾ͳv}[~mn7ku-A=Tm8\4.!;9 >*%{Fv־^j6<5d:v^_}s{l2kd}.*db{_81KJߓnYhocڊM |&˹3Qn0%ϔcMVAkgGS\9* ts<I:ZS[-=$5A8Zf n`pܭ߬v{(T[#Cp@p.;Y]U=$Š0s 'v@[j*y(`[͆/x8 -m[+9; - ;;51Tlh4o7ŧNz]=.;.9_6Z mK\utuidΧPK:fHӟoiw\-QLi2\0 {;,6Kls)XL;tѽQl͞\_l9p n''$o9+*jL F6"*\$G'ɌȜIËݤ t(쒲fDy;-Bn3 An\NH!DNdً׺FT6R,RG4Of1=;s9ӓ }h.5L94>0 쉥QΠGp[ə8""" "" 5]O'?]M>:oE8u<T %u6 MX~^ʽw8"je:<)�uQ;/zUaT[GPbI\HnHð\az J6m.և4Q☇ZH20xddwhoP&}E\W褒8uVsܼI# �JprQ3.H@1î9*�CQL e c tNт ǧi s3GS]X湥.]sFTEœ: \mS f4R/飐ߖ].w[j*5ҟD^^D@DDD@DDuf`-ר_ r" _WD�+Q06�Inή۳/rܾ֓aR\{$4|N1;NdӇ7`o(ܪ37/Vj6*5EEM+(*SpHNesZZ;-1ǒJV|6vF(bl{ 3�۷nsGCoh 7H&h+�ݹ5q , 3*ci6 0 t]m E֖*H[+pp־8#KnZ0mζQP@D!=SAf Xᬂ/yzx٠kF7bO2ۤ ,4BjL`pwwو ȀF ck4 =(ửq=MvZjm,>d"Ӗl 7aU o.j.f=hwH077prDKg ,tTB]HkH.7Y.[]%<tј{itL#8nܳeAaI)dk pxr* 8[O7Ιk//.%Q [S* (c%[Z�q $XLً uQ#u\)Xsa7 «*[SUov45^u� GLA$�cw_D,zJxD" &DZ^C@t<c'9t*FJJJzvI(&=ぼ묤AMhSG,68kZNN�ȩJz[$r49iAqu`j <FO0,n#vP[EL"G9/2or̜d 嘈0f{Ns!4&؈`ݹ~~:x!?%?d" wR=ϦĻY&0Iv|[6j*cTLl0.iv3ޔ8;[A_n}$pk\V=;*Lb.y4?@9 ՌpYH�_ !B#ja 'G`+mx6S4/|HaisqO\=un}Dr24K CWs(i#Z2\׷~[ tR!xbyn0FIG[.qd~؞X5͖A,4!!c{I]W,Hعm2s`5qῆUm,6hSJce�)ա݌i[mj4MuAv2tRI<SPrgkwq>m#'7+d#˷n{wO�HkzntbQX\7cw:/m̷O8cO{*5zzJxg!Mk#q$9IOW<pk]ScPn^Ogv۴JSS$TƠ3wtǥ;uTŒ푦&/vOm[CL!xPb0wJ8i͘A^鈔Bo c�.%g(4tnF]mne10A܃e gigQ79xdɫ":J|nuWj;%=]#43sn {20A#g6[/4ji$uqZ�" """ "" 5]O'?]M>:oE8u<T %u6 MX~^ʽw8"jT1:\ZMٛuUCϙ.Sj;`tDz|;XgCE$JjkkZߴ0xFY}RZ;|Wdtr8姾l|)멮)fscɒ6>S]F:b^d%3壒6K#YKwt=tc1*яgd-g|悑0M.t@on^'m3iE 8ӌe:H� f>2e,n@p8[D4Uj_M]?= %RSCN$y(Cx=8p<xlDC&Q""" """ ,[P7nB�k�Fڿ''ZdOOU[vupvݝ\%{N6 �F( \Z\8$.QOi?F'Q_ܸOr=ςU?'*Z-U?'*AkOzʧ=euZ@S| rY]D?T�GܪWQU?'*AkOzʧ=euZ@S| rY]Dy�GD^*ă>%U,B" """ ""WAu]!d5ѱK\Ӝq1ZuS3CtW(%/I$w�hٹX&x8+eѯ^unn寻l[]G 1-0G1 8_ ]z(c|=ET,uG4$pƃf4TtE3YP#CK@.q';)F쵕#S6w3/lM;9 h�ޯڬV]UMU#&Z'|aqhˉz"9z zh�Ƃډ22:@GM<p9�{`Rcfa?7Lt2{��`[TvQHB#;@/~ao;�`nVv+eZX^& +-#Sp1 lCA䮦7"jO{h|t߄&߬?/He^ pDk5DD@DDhZz#M*j,ٓcޫNLb~Xŧ{6GSsu %ƞltƘKNG?8nwe`Ƿ*#HwKP5ťťg AI-MvӇA:Y:GnMï3ީmXր/34>L@vp] -)1qM_VOOO%WryHX궻;n 6޸1<g>)ikOg Ɛz%eSm-L3_#xvv8q쬜Q6X�l-p۝}⒂a1`as1ʨ!P73�Μg$K#`v3!5ͬ{c1dA#8me&Z*#rrCDE  /e,[P7D@+Q06�InVm~`m_Vݝ\%]gW r~?W?TC%<ܧ ~DǓǒ{Iv|hD@DDD@DDD@DDDA�$gm/Y�$gm/Y!WSOrWSmN5]O'?]M>:oEz2]8"" ""0 X5V^nstvIm3rںKrj`n57 ~j(`1R269 CHӀ mi"}]lf=Z;Mu3T|Lqjzp[5NFRffq""-ר_X^o5ȈVm~`m_ܭFڿ'':Jnή0kI0>Ky?9QOi?F''+$+></"hI/_ I/_2CA䮦7"jO{h|t߄&߬?/He^ pDk5DD@DDD@DDD@DDD@DDD@DDD@X^o )bz�Y ""ZdOO[rkjȟ*:K)¹'¤/F?W?TC%<<ܬ8OsྈE""" """ """ ""'ľ?i/'ľ?i DDD@DDD@DDD@DDD@DDD@DDD@DDD@DD<jO{h|t߄qy>Jm~,~!z'qpEbz�Y,uf`\j6?=mm "z۳.Oܧ ~DǓ{a\֓aR}ȗ~rOr=ς"->?l�m ?�?l�m ?�!D<Yy>Jm~)ƫPw+MHo]UX~^ATDDD@DDD@DDD@DDD@DDD@DDuf`-ר_ r" _WD�+Q06�Inή۳?r+~*O�OTaSsZOхI?"_=σ$;> 舴Z" """ """ """ �|K,�|K, D@DDD@DDD@DDD@DDD@DDD@DDD@DDD@CAfPw+MHA䮦7"ɽwWazBwZQ-ר_X^o5ȈVm~`m_ܭFڿ'':Jnή0kI0:Ky?9QP`_kI06& Ik z$+><2Y*?rgGSyLAyr)zT~7YVyʏܦ'9QS=dY*?rgGSyL^Ego)sM3Ayr)zT~7YVyʏܦ'9QS=dqVyʏܦ/t4s{(M~n'VFtݎVU,keii*p?=&!ӎAyD<Yy>Jm~)ƫPw+MHo]UX~^ATDDD@DDD@DDD@DDD@DDD@DDuf`-ר_ r" _WD�+Q06�JEUgW Wm\W i?F+D{XIHQOSi?F'O 2ܸOr=σ+MOnY4|[Kʙdګ ,qk_ӞjAlGs6&kMc YHDqkZ70Z/toav9Y–]z�@DDD@DDD@DDD@L"" """ """ """ """ """ """ """ !x U}S(;ܕC$SOSOrWSmd޻ ~!;-f /e,[P7D@+YpKU{KIO{dso�!lȶyKtT;^kcj)][͉`sdm\l$jp 1Hcn'-}==DMQOĎ> %<H+rÁwF@6;i-{Ufi>tc ǎ# qr- 9ת5.DYUtjX B<? +F?o]6 vqQVUWPOՒ8%}@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@C222@y'Ay6 ]Z@Ws9Vg<FIa>X"ck߽rܼrG`HdKKkr7L?e6"RƶLU_8Q�&1gṃY�N~"oD@DDD@DDD@DDD@DDD@DDD@X^o )bz�Y ""YV3*ɵ8 x W([k;#s3.`yO]�=ܶWM/o Fu5q󑽚N=V,̾;Qi4xf_r]ꨴk8tWf ;<48ǎgDL=If~i#_C[*ߩ" ~0, ~{>:"aTH{5<goܚ[)/,'4"aTH{4艇S!Erhgoܙ�x4"aTH{4艇S!Erhgoܙ�x4"aTH{4艇S!Erhgoܙ�x4"aTH{4艇S!Erhgoܙ�x4"aTH{4艇S!Erhgoܙ�x4"aTH{4艇S!Erhgoܙ�x4"aTH{4艇S!Erhgoܙ�x4"aTH{4艇S!Erhgoܙ�x4"aTH{4艇S!Erhgoܙ�x4"aTH{4艇S!Erhgoܙ�x4"aTH{4艇S!Erhgoܙ�x4"aTH{4艇S!Erhgoܙ�x4"aTH{4艇S!Erhgoܙ�x4"aTH{4艇S!Erhgoܙ�x4"aTH{4艇S!Erhgoܙ�x4"aTH{4艇S!Erhgoܙ�x4"aTH{4艇S!Erhgoܙ�x4"aTH{4艇S!Erhgoܙ�x4"aTH{4艇S!Erhgoܙ�x4"aTH{4艇S!Erhgoܙ�x4"aTH{4艇S!Erhgoܙ�x4"aTH{4艇S!Erhgoܙ�x4}pv2MKr Jvj\؜ $ĸ/SoX� Lzf6DD+ɷhmmcdDB%䇒HnxwEWuh0|t~۱3�_@_Veui]nW[8 DEbz�Y,v#e.hP?^ ;x#*]f4 Qݶo8SKlp]f4 Qݶo8SKlp]f4 Qݶo8SKlp]f4 Qݶo8SKlp]f4 Qݶo8SKlp]f4 Qݶo8SKlp]f4 Qݶo8SKlp]f4 Qݶo8SKlp]f4 Qݶo8SKlp]f4 Qݶo8SKlp]f4 Qݶo8SKlp]f4 Qݶo8SKlp]f4 Qݶo8SKlp]f4 Qݶo8SKlp]f4 Qݶo8SKlp]f4 Qݶo8SKlp]f4 Qݶo8SKlp]f4 Qݶo8SKlp]f4 Qݶo8SKlp]f4 Qݶo8P0jKGZ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ ""��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������flask-peewee-3.0.6/docs/getting-started.rst���������������������������������������������������������0000664�0000000�0000000�00000023740�14605757052�0020700�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. _getting-started: Getting Started =============== The goal of this document is to help get you up and running quickly. So without further ado, let's get started. .. note:: Hopefully you have some familiarity with the `flask framework <http://flask.pocoo.org/>`_ and the `peewee orm <https://peewee.readthedocs.io/>`_, but if not those links should help you get started. .. note:: For a complete example project, check the `example app <https://github.com/coleifer/flask-peewee/tree/master/example>`_ that ships with flask-peewee. Creating a flask app -------------------- First, be sure you have :ref:`installed flask-peewee and its dependencies <installation>`. You can verify by running the test suite: ``python setup.py test``. After ensuring things are installed, open a new file called "app.py" and enter the following code: .. code-block:: python from flask import Flask app = Flask(__name__) app.config.from_object(__name__) if __name__ == '__main__': app.run() This isn't very exciting, but we can check out our project by running the app: .. code-block:: console $ python app.py * Running on http://127.0.0.1:5000/ * Restarting with reloader Navigating to the url listed will show a simple 404 page, because we haven't configured any templates or views yet. Creating a simple model ----------------------- Let's add a simple model. Before we can do that, though, it is necessary to initialize the peewee database wrapper and configure the database: .. code-block:: python from flask import Flask # flask-peewee bindings from flask_peewee.db import Database # configure our database DATABASE = { 'name': 'example.db', 'engine': 'peewee.SqliteDatabase', } DEBUG = True SECRET_KEY = 'ssshhhh' app = Flask(__name__) app.config.from_object(__name__) # instantiate the db wrapper db = Database(app) if __name__ == '__main__': app.run() What this does is provides us with request handlers which connect to the database on each request and close it when the request is finished. It also provides a base model class which is configured to work with the database specified in the configuration. Now we can create a model: .. code-block:: python import datetime from peewee import * class Note(db.Model): message = TextField() created = DateTimeField(default=datetime.datetime.now) .. note:: The model we created, ``Note``, subclasses ``db.Model``, which in turn is a subclass of ``peewee.Model`` that is pre-configured to talk to our database. Setting up a simple base template --------------------------------- We'll need a simple template to serve as the base template for our app, so create a folder named ``templates``. In the ``templates`` folder create a file ``base.html`` and add the following: .. code-block:: html <!doctype html> <html> <title>Test site

{% block content_title %}{% endblock %}

{% block content %}{% endblock %} Adding users to the site ------------------------ Before we can edit these ``Note`` models in the admin, we'll need to have some way of authenticating users on the site. This is where :py:class:`Auth` comes in. :py:class:`Auth` provides a ``User`` model and views for logging in and logging out, among other things, and is required by the :py:class:`Admin`. .. code-block:: python from flask_peewee.auth import Auth # create an Auth object for use with our flask app and database wrapper auth = Auth(app, db) Let's also modify the code that runs our app to ensure our tables get created if need be: .. code-block:: python if __name__ == '__main__': auth.User.create_table(fail_silently=True) Note.create_table(fail_silently=True) app.run() After cleaning up the imports and declarations, we have something like the following: .. code-block:: python import datetime from flask import Flask from peewee import * from flask_peewee.auth import Auth from flask_peewee.db import Database # configure our database DATABASE = { 'name': 'example.db', 'engine': 'peewee.SqliteDatabase', } DEBUG = True SECRET_KEY = 'ssshhhh' app = Flask(__name__) app.config.from_object(__name__) # instantiate the db wrapper db = Database(app) class Note(db.Model): message = TextField() created = DateTimeField(default=datetime.datetime.now) # create an Auth object for use with our flask app and database wrapper auth = Auth(app, db) if __name__ == '__main__': auth.User.create_table(fail_silently=True) Note.create_table(fail_silently=True) app.run() Managing content using the admin area ------------------------------------- **Now** we're ready to add the admin. Place the following lines of code after the initialization of the ``Auth`` class: .. code-block:: python from flask_peewee.admin import Admin admin = Admin(app, auth) admin.register(Note) admin.setup() We now have a functioning admin site! Of course, we'll need a user log in with, so open up an interactive python shell in the directory alongside the app and run the following: .. code-block:: python from app import auth auth.User.create_table(fail_silently=True) # make sure table created. admin = auth.User(username='admin', email='', admin=True, active=True) admin.set_password('admin') admin.save() It should now be possible to: 1. navigate to http://127.0.0.1:5000/admin/ 2. enter in the username and password ("admin", "admin") 3. be redirected to the admin dashboard .. image:: fp-getting-started.jpg The dashboard is pretty empty right now. Go ahead and add a few notes (http://127.0.0.1:5000/admin/note/). If you navigate now to the note modeladmin you will see something like this: .. image:: fp-note-admin.jpg This is pretty lousy so let's clean it up to display the message and when it was published. We can do that by customizing the columns displayed. Edit the app with the following changes: .. code-block:: python from flask_peewee.admin import Admin, ModelAdmin class NoteAdmin(ModelAdmin): columns = ('message', 'created',) admin = Admin(app, auth) admin.register(Note, NoteAdmin) admin.setup() Now our modeladmin should look more like this: .. image:: fp-note-admin-2.jpg Let's go ahead and add the ``auth.User`` model to the admin as well: .. code-block:: python admin.register(Note, NoteAdmin) auth.register_admin(admin) admin.setup() Exposing content using a REST API --------------------------------- Adding a REST API is very similar to how we added the :py:class:`Admin` interface. We will create a :py:class:`RestAPI` object, and then register our project's models with it. If we want to customize things, we can subclass :py:class:`RestResource`. The first step, then, is to create the :py:class:`RestAPI` object: .. code-block:: python from flask_peewee.rest import RestAPI # create a RestAPI container api = RestAPI(app) api.setup() This doesn't do anything yet, we need to register models with it first. Let's register the ``Note`` model from earlier: .. code-block:: python # create a RestAPI container api = RestAPI(app) # register the Note model api.register(Note) api.setup() Assuming your project is still running, try executing the following command (or just browse to the url listed): .. code-block:: console $ curl http://127.0.0.1:5000/api/note/ You should see something like the following: .. code-block:: javascript { "meta": { "model": "note", "next": "", "page": 1, "previous": "" }, "objects": [ { "message": "blah blah blah this is a note", "id": 1, "created": "2011-09-23 09:07:39" }, { "message": "this is another note!", "id": 2, "created": "2011-09-23 09:07:54" } ] } Suppose we want it to also be possible for registered users to be able to POST messages using the API. If you try and make a POST right now, you will get a ``401`` response: .. code-block:: console $ curl -i -d '' http://127.0.0.1:5000/api/note/ HTTP/1.0 401 UNAUTHORIZED WWW-Authenticate: Basic realm="Login Required" Content-Type: text/html; charset=utf-8 Content-Length: 21 Server: Werkzeug/0.8-dev Python/2.6.6 Date: Fri, 23 Sep 2011 14:45:38 GMT Authentication failed This is because we have not configured any :py:class:`Authentication` method for our :py:class:`RestAPI`. .. note:: The default authentication mechanism for the API only accepts GET requests. In order to handle POST/PUT/DELETE you will need to use a subclass of the :py:class:`Authentication` class. In order to allow users of the site to post notes, we will use the :py:class:`UserAuthentication` subclass, which requires that API requests be made with HTTP Basic auth and that the auth credentials match those of one of the ``auth.User`` models. .. code-block:: python from flask_peewee.rest import RestAPI, UserAuthentication # instantiate the user auth user_auth = UserAuthentication(auth) # create a RestAPI container api = RestAPI(app, default_auth=user_auth) Now we can post new notes using a command-line tool like curl: .. code-block:: console $ curl -u admin:admin -d data='{"message": "hello api"}' http://127.0.0.1:5000/api/note/ { "message": "hello api", "id": 3, "created": "2011-09-23 13:14:56" } You can see that it returns a serialized copy of the new ``Note`` object. .. note:: This is just a small example of what you can do with the Rest API -- refer to the :ref:`Rest API docs ` for more detailed information, including * limiting access on a per-model basis * customizing which fields are returned by the API * filtering and querying using GET parameters flask-peewee-3.0.6/docs/gevent.rst000066400000000000000000000032131460575705200170540ustar00rootroot00000000000000.. _gevent: Using gevent ============ If you would like to serve your flask application using gevent, there are two small settings you will need to add. Database configuration ---------------------- Instruct peewee to store connection information in a thread local: .. code-block:: python # app configuration DATABASE = { 'name': 'my_db', 'engine': 'peewee.PostgresqlDatabase', 'user': 'postgres', 'threadlocals': True, # <-- this } Monkey-patch the thread module ------------------------------ Some time before instantiating a :py:class:`Database` object (and preferrably at the very "beginning" of your code) you will want to `monkey-patch `_ the standard library thread module: .. code-block:: python from gevent import monkey; monkey.patch_thread() If you want to patch everything (recommended): .. code-block:: python from gevent import monkey; monkey.patch_all() .. note:: Remember to monkey-patch before initializing your app Rationale --------- flask-peewee opens a connection-per-request. Flask stores things, like "per-request" information, in a special object called a `context local `_. Flask will ensure that this works even in a greened environment. Peewee does not automatically work in a "greened" environment, and stores connection state on the database instance in a local. Peewee can use a thread local instead, which ensures connections are not shared across threads. When using peewee with gevent, it is necessary to make this "threadlocal" a "greenlet local" by monkeypatching the thread module. flask-peewee-3.0.6/docs/index.rst000066400000000000000000000031621460575705200166760ustar00rootroot00000000000000.. flask-peewee documentation master file, created by sphinx-quickstart on Tue Sep 20 13:19:30 2011. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. flask-peewee ============ .. warning:: This package is in maintenance-only mode! ----------------------------------------- I'm sorry to announce that flask-peewee will now be in maintenance-only mode. This decision is motivated by a number of factors: * `Flask-Admin `_ provides a superior admin interface and has support for peewee models. * `Flask-Security `_ and `Flask-Login `_ both provide authentication functionality, and work well with Peewee. * Most importantly, though, I do not find myself wanting to work on flask-peewee. I plan on rewriting the ``Database`` and ``REST API`` portions of flask-peewee and repackaging them as a new library, but flask-peewee as it stands currently will be in maintenance-only mode. ------------------------------ Welcome to the flask-peewee documentation! provides a layer of integration between the `flask `_ web framework and the `peewee orm `_. Contents: .. toctree:: :maxdepth: 2 :glob: installation getting-started database admin auth rest-api utils gevent API in depth: .. toctree:: :maxdepth: 2 :glob: api/ Indices and tables ================== * :ref:`genindex` * :ref:`modindex` * :ref:`search` flask-peewee-3.0.6/docs/installation.rst000066400000000000000000000015621460575705200202720ustar00rootroot00000000000000.. _installation: Installing ========== flask-peewee can be installed very easily using `pip `_. .. code-block:: shell pip install flask-peewee If you do not have the dependencies installed already, pip will install them for you, but for reference they are: * `flask `_ * `peewee `_ * `wtforms `_ * `wtf-peewee `_ * python 2.5 or greater Using git --------- If you want to run the very latest, feel free to pull down the repo from github and install by hand. .. code-block:: shell git clone https://github.com/coleifer/flask-peewee.git cd flask-peewee python setup.py install You can run the tests using the test-runner:: python setup.py test flask-peewee-3.0.6/docs/rest-api.rst000066400000000000000000000320571460575705200173200ustar00rootroot00000000000000.. _rest-api: REST Api ======== flask-peewee comes with some tools for exposing your project's models via a RESTful API. There are several components to the ``rest`` module, but the basic setup is to create an instance of :py:class:`RestAPI` and then register your project's models with subclasses of :py:class:`RestResource`. Each :py:class:`RestResource` you expose via the API will support, by default, the following: * `/api//` -- GET and POST requests * `/api///` -- GET, PUT and DELETE requests Also, you can filter results by columns on the model using django-style syntax, for example: * `/api/blog/?name=Some%20Blog` * `/api/blog/?author__username=some_blogger` Getting started with the API ---------------------------- In this documentation we'll start with a very simple API and build it out. The complete version of this API is included in the :ref:`example-app`, so feel free to refer there. The project will be a simple 'twitter-like' app where users can post short messages and "follow" other users. .. note:: If you're using apache with mod_wsgi and would like to use any of the auth backends that use basic auth, you will need to add the following directive: ``WSGIPassAuthorization On`` Project models ^^^^^^^^^^^^^^ There are three main models - ``User``, ``Relationship`` and ``Message`` - which we will expose via the API. Here is a truncated version of what they look like: .. code-block:: python from flask_peewee.auth import BaseUser class User(db.Model, BaseUser): username = CharField() password = CharField() email = CharField() join_date = DateTimeField(default=datetime.datetime.now) active = BooleanField(default=True) admin = BooleanField(default=False) class Relationship(db.Model): from_user = ForeignKeyField(User, related_name='relationships') to_user = ForeignKeyField(User, related_name='related_to') class Message(db.Model): user = ForeignKeyField(User) content = TextField() pub_date = DateTimeField(default=datetime.datetime.now) Creating a RestAPI ------------------ The :py:class:`RestAPI` acts as a container for the various :py:class:`RestResource` objects we will expose. By default it binds all resources to ``/api//``. Here we'll create a simple api and register our models: .. code-block:: python from flask_peewee.rest import RestAPI from app import app # our project's Flask app # instantiate our api wrapper api = RestAPI(app) # register our models so they are exposed via /api// api.register(User) api.register(Relationship) api.register(Message) # configure the urls api.setup() Now if we hit our project at ``/api/message/`` we should get something like the following: .. code-block:: javascript { "meta": { "model": "message", "next": "", "page": 1, "previous": "" }, "objects": [ { "content": "flask and peewee, together at last!", "pub_date": "2011-09-16 18:36:15", "user_id": 1, "id": 1 }, { "content": "Hey, I'm just some user", "pub_date": "2011-09-16 18:46:59", "user_id": 2, "id": 2 } ] } Say we're interested in the first message, we can hit ``/api/message/1/`` to view just the details on that object: .. code-block:: javascript { content: "flask and peewee, together at last!" pub_date: "2011-09-16 18:36:15" user_id: 1 id: 1 } Customizing what is returned ---------------------------- If you access the ``User`` API endpoint, we quickly notice a problem: .. code-block:: console $ curl http://127.0.0.1:5000/api/user/ { "meta": { "model": "user", "next": "", "page": 1, "previous": "" }, "objects": [ { "username": "admin", "admin": true, "email": "", "join_date": "2011-09-16 18:34:49", "active": true, "password": "d033e22ae348aeb5660fc2140aec35850c4da997", "id": 1 }, { "username": "coleifer", "admin": false, "email": "coleifer@gmail.com", "join_date": "2011-09-16 18:35:56", "active": true, "password": "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3", "id": 2 } ] } Passwords and email addresses are being exposed. In order to exclude these fields from serialization, subclass :py:class:`RestResource`: .. code-block:: python from flask_peewee.rest import RestAPI, RestResource from app import app # our project's Flask app # instantiate our api wrapper api = RestAPI(app) # create a special resource for users that excludes email and password class UserResource(RestResource): exclude = ('password', 'email',) # register our models so they are exposed via /api// api.register(User, UserResource) # specify the UserResource api.register(Relationship) api.register(Message) Now emails and passwords are no longer returned by the API. Allowing users to post objects ------------------------------ What if we want to create new messages via the Api? Or modify/delete existing messages? .. code-block:: console $ curl -i -d '' http://127.0.0.1:5000/api/message/ HTTP/1.0 401 UNAUTHORIZED WWW-Authenticate: Basic realm="Login Required" Content-Type: text/html; charset=utf-8 Content-Length: 21 Server: Werkzeug/0.8-dev Python/2.6.6 Date: Thu, 22 Sep 2011 16:14:21 GMT Authentication failed The authentication failed because the default authentication mechanism only allows read-only access. In order to allow users to create messages via the API, we need to use a subclass of :py:class:`Authentication` that allows ``POST`` requests. We also want to ensure that the requesting user is a member of the site. For this we will use the :py:class:`UserAuthentication` class as the default auth mechanism. .. code-block:: python from auth import auth # import the Auth object used by our project from flask_peewee.rest import RestAPI, RestResource, UserAuthentication # create an instance of UserAuthentication user_auth = UserAuthentication(auth) # instantiate our api wrapper, specifying user_auth as the default api = RestAPI(app, default_auth=user_auth) # create a special resource for users that excludes email and password class UserResource(RestResource): exclude = ('password', 'email',) # register our models so they are exposed via /api// api.register(User, UserResource) # specify the UserResource api.register(Relationship) api.register(Message) # configure the urls api.setup() Now we should be able to POST new messages. .. code-block:: python import json import httplib2 sock = httplib2.Http() sock.add_credentials('admin', 'admin') # use basic auth message = {'user_id': 1, 'content': 'hello api'} msg_json = json.dumps(message) headers, resp = sock.request('http://localhost:5000/api/message/', 'POST', body=msg_json) response = json.loads(resp) The response object will look something like this: .. code-block:: javascript { 'content': 'hello api', 'user_id': 1, 'pub_date': '2011-09-22 11:25:02', 'id': 3 } There is a problem with this, however. Notice how the ``user_id`` was passed in with the POST data? This effectively will let a user post a message as another user. It also means a user can use PUT requests to modify another user's message: .. code-block:: python # continued from above script update = {'content': 'haxed you, bro'} update_json = json.dumps(update) headers, resp = sock.request('http://127.0.0.1:5000/api/message/2/', 'PUT', body=update_json) response = json.loads(resp) The response will look like this: .. code-block:: javascript { 'content': 'haxed you, bro', 'pub_date': '2011-09-16 18:36:15', 'user_id': 2, 'id': 2 } This is a problem -- we need a way of ensuring that users can only edit their own messages. Furthermore, when they create messages we need to make sure the message is assigned to them. Restricting API access on a per-model basis ------------------------------------------- flask-peewee comes with a special subclass of :py:class:`RestResource` that restricts POST/PUT/DELETE requests to prevent users from modifying another user's content. .. code-block:: python from flask_peewee.rest import RestrictOwnerResource class MessageResource(RestrictOwnerResource): owner_field = 'user' api.register(Message, MessageResource) Now, if we try and modify the message, we get a 403 Forbidden: .. code-block:: python headers, resp = sock.request('http://127.0.0.1:5000/api/message/2/', 'PUT', body=update_json) print headers['status'] # prints 403 It is fine to modify our own message, though (message with id=1): .. code-block:: python headers, resp = sock.request('http://127.0.0.1:5000/api/message/1/', 'PUT', body=update_json) print headers['status'] # prints 200 Under-the-hood, the `implementation `_ of the :py:class:`RestrictOwnerResource` is pretty simple. * PUT / DELETE -- verify the authenticated user is the owner of the object * POST -- assign the authenticated user as the owner of the new object Locking down a resource ----------------------- Suppose we want to restrict normal users from modifying ``User`` resources. For this we can use a special subclass of :py:class:`UserAuthentication` that restricts access to administrators: .. code-block:: python from flask_peewee.rest import AdminAuthentication # instantiate our user-based auth user_auth = UserAuthentication(auth) # instantiate admin-only auth admin_auth = AdminAuthentication(auth) # instantiate our api wrapper, specifying user_auth as the default api = RestAPI(app, default_auth=user_auth) # register the UserResource with admin auth api.register(User, UserResource, auth=admin_auth) Filtering records and querying ------------------------------ A REST Api is not very useful if it cannot be queried in a meaningful fashion. To this end, the flask-peewee :py:class:`RestResource` objects support "django-style" filtering: .. code-block:: console $ curl http://127.0.0.1:5000/api/message/?user=2 This call will return only messages by the ``User`` with id=2: .. code-block:: javascript { "meta": { "model": "message", "next": "", "page": 1, "previous": "" }, "objects": [ { "content": "haxed you, bro", "pub_date": "2011-09-16 18:36:15", "user_id": 2, "id": 2 } ] } Joins can be traversed using the django double-underscore notation: .. code-block:: console $ curl http://127.0.0.1:5000/api/message/?user__username=admin .. code-block:: javascript { "meta": { "model": "message", "next": "", "page": 1, "previous": "" }, "objects": [ { "content": "flask and peewee, together at last!", "pub_date": "2011-09-16 18:36:15", "user_id": 1, "id": 1 }, { "content": "hello api", "pub_date": "2011-09-22 11:25:02", "user_id": 1, "id": 3 } ] } It is also supported to use different comparison operators with the same double-underscore notation: .. code-block:: console $ curl http://127.0.0.1:5000/api/user/?user__lt=2 .. code-block:: javascript { "meta": { "model": "user", "next": "", "page": 1, "previous": "" }, "objects": [{ "username": "admin", "admin": true, "email": "admin@admin", "active": true, "password": "214de$25", "id": 1 }] } Valid Comparison Operators are: 'eq', 'lt', 'lte', 'gt', 'gte', 'ne', 'in', 'is', 'like', 'ilike' Sorting results --------------- Results can be sorted by specifying an ``ordering`` as a GET argument. The ordering must be a column on the model. `/api/message/?ordering=pub_date` If you would like to order objects "descending", place a "-" (hyphen character) before the column name: `/api/message/?ordering=-pub_date` Limiting results and pagination ------------------------------- By default, resources are paginated 20 per-page. If you want to return less, you can specify a ``limit`` in the querystring. `/api/message/?limit=2` In the "meta" section of the response, URIs for the "next" and "previous" sets of results are available: .. code-block:: javascript meta: { model: "message" next: "/api/message/?limit=1&page=3" page: 2 previous: "/api/message/?limit=1&page=1" } flask-peewee-3.0.6/docs/utils.rst000066400000000000000000000050511460575705200167260ustar00rootroot00000000000000.. _utils: Utilities ========= flask-peewee ships with several useful utilities. If you're coming from the django world, some of these functions may look familiar to you. Getting objects --------------- :py:func:`get_object_or_404` Provides a handy way of getting an object or 404ing if not found, useful for urls that match based on ID. .. code-block:: python @app.route('/blog//') def blog_detail(title): blog = get_object_or_404(Blog.select().where(Blog.active==True), Blog.title==title) return render_template('blog/detail.html', blog=blog) :py:func:`object_list` Wraps the given query and handles pagination automatically. Pagination defaults to ``20`` but can be changed by passing in ``paginate_by=XX``. .. code-block:: python @app.route('/blog/') def blog_list(): active = Blog.select().where(Blog.active==True) return object_list('blog/index.html', active) .. code-block:: html <!-- template --> {% for blog in object_list %} {# render the blog here #} {% endfor %} {% if page > 1 %} <a href="./?page={{ page - 1 }}">Prev</a> {% endif %} {% if page < pagination.get_pages() %} <a href="./?page={{ page + 1 }}">Next</a> {% endif %} :py:class:`PaginatedQuery` A wrapper around a query (or model class) that handles pagination. Example: .. code-block:: python query = Blog.select().where(Blog.active==True) pq = PaginatedQuery(query) # assume url was /?page=3 obj_list = pq.get_list() # returns 3rd page of results pq.get_page() # returns "3" pq.get_pages() # returns total objects / objects-per-page Misc ---- .. py:function:: slugify(string) Convert a string into something suitable for use as part of a URL, e.g. "This is a url" becomes "this-is-a-url" .. code-block:: python from flask_peewee.utils import slugify class Blog(db.Model): title = CharField() slug = CharField() def save(self, *args, **kwargs): self.slug = slugify(self.title) super(Blog, self).save(*args, **kwargs) .. py:function:: make_password(raw_password) Create a salted hash for the given plain-text password .. py:function:: check_password(raw_password, enc_password) Compare a plain-text password against a salted/hashed password ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������flask-peewee-3.0.6/example/�������������������������������������������������������������������������0000775�0000000�0000000�00000000000�14605757052�0015536�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������flask-peewee-3.0.6/example/__init__.py��������������������������������������������������������������0000664�0000000�0000000�00000000000�14605757052�0017635�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������flask-peewee-3.0.6/example/admin.py�����������������������������������������������������������������0000664�0000000�0000000�00000003654�14605757052�0017210�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������import datetime from flask import request, redirect from flask_peewee.admin import Admin, ModelAdmin, AdminPanel from flask_peewee.filters import QueryFilter from app import app, db from auth import auth from models import User, Message, Note, Relationship class NotePanel(AdminPanel): template_name = 'admin/notes.html' def get_urls(self): return ( ('/create/', self.create), ) def create(self): if request.method == 'POST': if request.form.get('message'): Note.create( user=auth.get_logged_in_user(), message=request.form['message'], ) next = request.form.get('next') or self.dashboard_url() return redirect(next) def get_context(self): return { 'note_list': Note.select().order_by(Note.created_date.desc()).paginate(1, 3) } class UserStatsPanel(AdminPanel): template_name = 'admin/user_stats.html' def get_context(self): last_week = datetime.datetime.now() - datetime.timedelta(days=7) signups_this_week = User.select().where(User.join_date > last_week).count() messages_this_week = Message.select().where(Message.pub_date > last_week).count() return { 'signups': signups_this_week, 'messages': messages_this_week, } admin = Admin(app, auth, branding='Example Site') class MessageAdmin(ModelAdmin): columns = ('user', 'content', 'pub_date',) foreign_key_lookups = {'user': 'username'} filter_fields = ('user', 'content', 'pub_date', 'user__username') class NoteAdmin(ModelAdmin): columns = ('user', 'message', 'created_date',) exclude = ('created_date',) auth.register_admin(admin) admin.register(Relationship) admin.register(Message, MessageAdmin) admin.register(Note, NoteAdmin) admin.register_panel('Notes', NotePanel) admin.register_panel('User stats', UserStatsPanel) ������������������������������������������������������������������������������������flask-peewee-3.0.6/example/api.py�������������������������������������������������������������������0000664�0000000�0000000�00000002345�14605757052�0016665�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������from flask_peewee.rest import RestAPI, RestResource, UserAuthentication, AdminAuthentication, RestrictOwnerResource from app import app from auth import auth from models import User, Message, Note, Relationship user_auth = UserAuthentication(auth) admin_auth = AdminAuthentication(auth) # instantiate our api wrapper api = RestAPI(app, default_auth=user_auth) class UserResource(RestResource): exclude = ('password', 'email',) class MessageResource(RestrictOwnerResource): owner_field = 'user' include_resources = {'user': UserResource} class RelationshipResource(RestrictOwnerResource): owner_field = 'from_user' include_resources = { 'from_user': UserResource, 'to_user': UserResource, } paginate_by = None class NoteResource(RestrictOwnerResource): owner_field = 'user' include_resources = { 'user': UserResource, } def get_query(self): query = super(NoteResource, self).get_query() return query.where(Note.status == 1) # register our models so they are exposed via /api/<model>/ api.register(User, UserResource, auth=admin_auth) api.register(Relationship, RelationshipResource) api.register(Message, MessageResource) api.register(Note, NoteResource) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������flask-peewee-3.0.6/example/app.py�������������������������������������������������������������������0000664�0000000�0000000�00000000653�14605757052�0016674�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������from flask import Flask # flask-peewee bindings from flask_peewee.db import Database app = Flask(__name__) app.config.from_object('config.Configuration') db = Database(app) def create_tables(): User.create_table() Relationship.create_table() Message.create_table() Note.create_table() @app.template_filter('is_following') def is_following(from_user, to_user): return from_user.is_following(to_user) �������������������������������������������������������������������������������������flask-peewee-3.0.6/example/auth.py������������������������������������������������������������������0000664�0000000�0000000�00000000174�14605757052�0017053�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������from flask_peewee.auth import Auth from app import app, db from models import User auth = Auth(app, db, user_model=User) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������flask-peewee-3.0.6/example/config.py����������������������������������������������������������������0000664�0000000�0000000�00000000325�14605757052�0017355�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# config class Configuration(object): DATABASE = { 'name': 'example.db', 'engine': 'peewee.SqliteDatabase', 'check_same_thread': False, } DEBUG = True SECRET_KEY = 'shhhh' �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������flask-peewee-3.0.6/example/example.db���������������������������������������������������������������0000664�0000000�0000000�00000042000�14605757052�0017474�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������SQLite format 3���@ ���:�������������� �������������������������������������������������:�-$������� �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ���R�|vpjd^XR����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������      ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ���A�A���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������?KA�I'm an admin on this crazy site2011-09-16 18:47:17.0458847;A�Hey, I'm just some user2011-09-16 18:46:59.670759CSA�flask and peewee, together at last!2011-09-16 18:36:15.668596 ������.�����������������������������������������������������������������������������������������������������������������������������������������������������������������uMtableuseruserCREATE TABLE user (username VARCHAR(255) NOT NULL, admin SMALLINT NOT NULL, id INTEGER NOT NULL PRIMARY KEY, join_date DATETIME NOT NULL, active SMALLINT NOT NULL, password VARCHAR(255) NOT NULL, email VARCHAR(255) NOT NULL)>[indexuser_iduserCREATE UNIQUE INDEX user_id ON user(id)F%%OtablerelationshiprelationshipCREATE TABLE relationship (from_user_id INTEGER NOT NULL REFERENCES user (id), to_user_id INTEGER NOT NULL REFERENCES user (id), id INTEGER NOT NULL PRIMARY KEY)v?%indexrelationship_from_user_idrelationshipCREATE INDEX relationship_from_user_id ON relationship(from_user_id)p;% indexrelationship_to_user_idrelationshipCREATE INDEX relationship_to_user_id ON relationship(to_user_id)^+%{indexrelationship_idrelationshipCREATE UNIQUE INDEX relationship_id ON relationship(id) ���_�_ix�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������3=tablemessagemessageCREATE TABLE message (content TEXT NOT NULL, pub_date DATETIME NOT NULL, user_id INTEGER NOT NULL REFERENCES user (id), id INTEGER NOT NULL PRIMARY KEY)R+mindexmessage_user_idmessage CREATE INDEX message_user_id ON message(user_id)J !gindexmessage_idmessage CREATE UNIQUE INDEX message_id ON message(id)@ ctablenotenote CREATE TABLE note (message TEXT NOT NULL, user_id INTEGER NOT NULL REFERENCES user (id), id INTEGER NOT NULL PRIMARY KEY, created_date DATETIME NOT NULL, "status" INTEGER)F %aindexnote_user_idnoteCREATE INDEX note_user_id ON note(user_id)> [indexnote_idnoteCREATE UNIQUE INDEX note_id ON note(id) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ ��q���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Z}�Ahey everyone, keep an eye on "coleifer", may be spam bot2011-09-16 18:35:36.06774433�AHere's another note2011-10-29 17:48:11.911884���Z�������������������������������������������������������������������������������������� �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ����RFb6 Z.���~�R��������������������������������������*�A OOOOOO�2012-03-13 02:49:31.992156*�A NNNNNN�2012-03-13 02:49:31.990125*�A MMMMMM�2012-03-13 02:49:31.987221*�A LLLLLL�2012-03-13 02:49:31.984260*�A KKKKKK�2012-03-13 02:49:31.981245* �A JJJJJJ�2012-03-13 02:49:31.979428* �A IIIIII�2012-03-13 02:49:31.977035* �A HHHHHH�2012-03-13 02:49:31.972886* �A GGGGGG�2012-03-13 02:49:31.970255* �A FFFFFF�2012-03-13 02:49:31.967091*�A EEEEEE�2012-03-13 02:49:31.963988*�A DDDDDD�2012-03-13 02:49:31.961231*�A CCCCCC�2012-03-13 02:49:31.958624*�A BBBBBB�2012-03-13 02:49:31.955460*�A AAAAAA�2012-03-13 02:49:31.950733]�3i)user�2011-09-16 18:46:49778f7$4093f52a85615a6450eb538ea799587df8eb0b97user@user.user�e�3i1coleifer�2011-09-16 18:35:56e1ef7$dd4949985c4b168136b45a84d5d9770da8951243coleifer@gmail.com�P�3i admin2011-09-16 18:34:493af90$5e3bc2fc0348f13a4866556a1cbac20e222e8610 ��� �|P$tH������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������*�A ZZZZZZ�2012-03-13 02:49:32.030799*�A YYYYYY�2012-03-13 02:49:32.027586*�A XXXXXX�2012-03-13 02:49:32.024213*�A WWWWWW�2012-03-13 02:49:32.021126*�A VVVVVV�2012-03-13 02:49:32.015616*�A UUUUUU�2012-03-13 02:49:32.013264*�A TTTTTT�2012-03-13 02:49:32.010231*�A SSSSSS�2012-03-13 02:49:32.007132*�A RRRRRR�2012-03-13 02:49:32.004115*�A QQQQQQ�2012-03-13 02:49:32.001454*�A PPPPPP�2012-03-13 02:49:31.998571flask-peewee-3.0.6/example/main.py������������������������������������������������������������������0000664�0000000�0000000�00000000307�14605757052�0017034�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������from app import app, db from auth import * from admin import admin from api import api from models import * from views import * admin.setup() api.setup() if __name__ == '__main__': app.run() �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������flask-peewee-3.0.6/example/models.py����������������������������������������������������������������0000664�0000000�0000000�00000003513�14605757052�0017375�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������from hashlib import md5 import datetime from flask_peewee.auth import BaseUser from peewee import * from app import db class User(db.Model, BaseUser): username = CharField() password = CharField() email = CharField() join_date = DateTimeField(default=datetime.datetime.now) active = BooleanField(default=True) admin = BooleanField(default=False) def __str__(self): return self.username def following(self): return User.select().join( Relationship, on=Relationship.to_user ).where(Relationship.from_user==self).order_by(User.username) def followers(self): return User.select().join( Relationship, on=Relationship.from_user ).where(Relationship.to_user==self).order_by(User.username) def is_following(self, user): return Relationship.select().where( Relationship.from_user==self, Relationship.to_user==user ).exists() def gravatar_url(self, size=80): return 'http://www.gravatar.com/avatar/%s?d=identicon&s=%d' % \ (md5(self.email.strip().lower().encode('utf-8')).hexdigest(), size) class Relationship(db.Model): from_user = ForeignKeyField(User, related_name='relationships') to_user = ForeignKeyField(User, related_name='related_to') def __str__(self): return 'Relationship from %s to %s' % (self.from_user, self.to_user) class Message(db.Model): user = ForeignKeyField(User) content = TextField() pub_date = DateTimeField(default=datetime.datetime.now) def __str__(self): return '%s: %s' % (self.user, self.content) class Note(db.Model): user = ForeignKeyField(User) message = TextField() status = IntegerField(choices=((1, 'live'), (2, 'deleted')), null=True) created_date = DateTimeField(default=datetime.datetime.now) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������flask-peewee-3.0.6/example/requirements.txt���������������������������������������������������������0000664�0000000�0000000�00000000060�14605757052�0021016�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������flask werkzeug jinja2 peewee wtforms wtf-peewee ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������flask-peewee-3.0.6/example/run_example.py�����������������������������������������������������������0000775�0000000�0000000�00000000127�14605757052�0020432�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python import sys sys.path.insert(0, '..') import main main.app.run() �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������flask-peewee-3.0.6/example/static/������������������������������������������������������������������0000775�0000000�0000000�00000000000�14605757052�0017025�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������flask-peewee-3.0.6/example/static/style.css���������������������������������������������������������0000664�0000000�0000000�00000001521�14605757052�0020676�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������body { font-family: sans-serif; background: #eee; } a, h1, h2 { color: #377BA8; } h1, h2 { font-family: 'Georgia', serif; margin: 0; } h1 { border-bottom: 2px solid #eee; } h2 { font-size: 1.2em; } .page { margin: 2em auto; width: 35em; border: 5px solid #ccc; padding: 0.8em; background: white; } .page ul { list-style-type: none; } .page li { clear: both; } .metanav { text-align: right; font-size: 0.8em; padding: 0.3em; margin-bottom: 1em; background: #fafafa; } .flash { background: #CEE5F5; padding: 0.5em; border: 1px solid #AACBE2; } .avatar { display: block; float: left; margin: 0 10px 0 0; } .message-content { min-height: 80px; } .message-edit { float: right; font-size: 0.6em; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������flask-peewee-3.0.6/example/templates/���������������������������������������������������������������0000775�0000000�0000000�00000000000�14605757052�0017534�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������flask-peewee-3.0.6/example/templates/admin/���������������������������������������������������������0000775�0000000�0000000�00000000000�14605757052�0020624�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������flask-peewee-3.0.6/example/templates/admin/notes.html�����������������������������������������������0000664�0000000�0000000�00000000666�14605757052�0022652�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{% extends "admin/panels/default.html" %} {% block panel_content %} {% for note in note_list %} <p>{{ note.user.username }}: {{ note.message }}</p> {% endfor %} <form method="post" action="{{ url_for(panel.get_url_name('create')) }}"> <input type="hidden" value="{{ request.url }}" /> <p><textarea name="message"></textarea></p> <p><button type="submit" class="btn small">Save</button></p> </form> {% endblock %} ��������������������������������������������������������������������������flask-peewee-3.0.6/example/templates/admin/user_stats.html������������������������������������������0000664�0000000�0000000�00000000254�14605757052�0023707�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{% extends "admin/panels/default.html" %} {% block panel_content %} <p>New users this week: {{ signups }}</p> <p>Messages this week: {{ messages }}</p> {% endblock %} ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������flask-peewee-3.0.6/example/templates/base.html������������������������������������������������������0000664�0000000�0000000�00000001370�14605757052�0021335�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!doctype html> <title>Tweepee

Tweepee

{% if not session.logged_in %} log in join {% else %} public timeline create log out {% endif %}
{% for message in get_flashed_messages() %}
{{ message }}
{% endfor %}

{% block content_title %}{% endblock %}

{% block content %}{% endblock %}
flask-peewee-3.0.6/example/templates/create.html000066400000000000000000000005021460575705200216620ustar00rootroot00000000000000{% extends "base.html" %} {% block content_title %}Create{% endblock %} {% block content %}
Message:
{% endblock %} flask-peewee-3.0.6/example/templates/edit.html000066400000000000000000000005601460575705200213500ustar00rootroot00000000000000{% extends "base.html" %} {% block content_title %}Edit message{% endblock %} {% block content %}
Message:
{% endblock %} flask-peewee-3.0.6/example/templates/homepage.html000066400000000000000000000002111460575705200222010ustar00rootroot00000000000000{% extends "base.html" %} {% block content_title %}Home{% endblock %} {% block content %}

Welcome to the site!

{% endblock %} flask-peewee-3.0.6/example/templates/includes/000077500000000000000000000000001460575705200213425ustar00rootroot00000000000000flask-peewee-3.0.6/example/templates/includes/message.html000066400000000000000000000005141460575705200236540ustar00rootroot00000000000000{% if user and message.user == user %}edit{% endif %}

{{ message.content|urlize }}

flask-peewee-3.0.6/example/templates/includes/pagination.html000066400000000000000000000003131460575705200243560ustar00rootroot00000000000000{% if page > 1 %} {% endif %} {% if pagination.get_pages() > page %} {% endif %} flask-peewee-3.0.6/example/templates/join.html000066400000000000000000000010061460575705200213560ustar00rootroot00000000000000{% extends "base.html" %} {% block content_title %}Join{% endblock %} {% block content %}
Username:
Password:
Email:

(used for gravatar)

{% endblock %} flask-peewee-3.0.6/example/templates/private_messages.html000066400000000000000000000004351460575705200237650ustar00rootroot00000000000000{% extends "base.html" %} {% block content_title %}Private Timeline{% endblock %} {% block content %}
    {% for message in message_list %}
  • {% include "includes/message.html" %}
  • {% endfor %}
{% include "includes/pagination.html" %} {% endblock %} flask-peewee-3.0.6/example/templates/public_messages.html000066400000000000000000000004341460575705200235700ustar00rootroot00000000000000{% extends "base.html" %} {% block content_title %}Public Timeline{% endblock %} {% block content %}
    {% for message in message_list %}
  • {% include "includes/message.html" %}
  • {% endfor %}
{% include "includes/pagination.html" %} {% endblock %} flask-peewee-3.0.6/example/templates/user_detail.html000066400000000000000000000016021460575705200227210ustar00rootroot00000000000000{% extends "base.html" %} {% block content_title %}Message from {{ person.username }}{% endblock %} {% block content %} {% if user %} {% if person.username != user.username %} {% if user|is_following(person) %}
{% else %}
{% endif %} {% endif %} {% else %}

Log-in to follow

{% endif %}
    {% for message in message_list %}
  • {% include "includes/message.html" %}
  • {% endfor %}
{% include "includes/pagination.html" %} {% endblock %} flask-peewee-3.0.6/example/templates/user_followers.html000066400000000000000000000005161460575705200234760ustar00rootroot00000000000000{% extends "base.html" %} {% block content_title %}Followers{% endblock %} {% block content %} {% include "includes/pagination.html" %} {% endblock %} flask-peewee-3.0.6/example/templates/user_following.html000066400000000000000000000005161460575705200234620ustar00rootroot00000000000000{% extends "base.html" %} {% block content_title %}Following{% endblock %} {% block content %} {% include "includes/pagination.html" %} {% endblock %} flask-peewee-3.0.6/example/templates/user_list.html000066400000000000000000000005031460575705200224310ustar00rootroot00000000000000{% extends "base.html" %} {% block content_title %}Users{% endblock %} {% block content %} {% include "includes/pagination.html" %} {% endblock %} flask-peewee-3.0.6/example/views.py000066400000000000000000000101161460575705200172440ustar00rootroot00000000000000import datetime from flask import request, redirect, url_for, render_template, flash from flask_peewee.utils import get_object_or_404, object_list from app import app from auth import auth from models import User, Message, Relationship @app.route('/') def homepage(): if auth.get_logged_in_user(): return private_timeline() else: return public_timeline() @app.route('/private/') @auth.login_required def private_timeline(): user = auth.get_logged_in_user() messages = Message.select().where( Message.user << user.following() ).order_by(Message.pub_date.desc()) return object_list('private_messages.html', messages, 'message_list') @app.route('/public/') def public_timeline(): messages = Message.select().order_by(Message.pub_date.desc()) return object_list('public_messages.html', messages, 'message_list') @app.route('/join/', methods=['GET', 'POST']) def join(): if request.method == 'POST' and request.form['username']: try: user = User.select().where(User.username==request.form['username']).get() flash('That username is already taken') except User.DoesNotExist: user = User( username=request.form['username'], email=request.form['email'], join_date=datetime.datetime.now() ) user.set_password(request.form['password']) user.save() auth.login_user(user) return redirect(url_for('homepage')) return render_template('join.html') @app.route('/following/') @auth.login_required def following(): user = auth.get_logged_in_user() return object_list('user_following.html', user.following(), 'user_list') @app.route('/followers/') @auth.login_required def followers(): user = auth.get_logged_in_user() return object_list('user_followers.html', user.followers(), 'user_list') @app.route('/users/') def user_list(): users = User.select().order_by(User.username) return object_list('user_list.html', users, 'user_list') @app.route('/users//') def user_detail(username): user = get_object_or_404(User, User.username==username) messages = user.message_set.order_by(Message.pub_date.desc()) return object_list('user_detail.html', messages, 'message_list', person=user) @app.route('/users//follow/', methods=['POST']) @auth.login_required def user_follow(username): user = get_object_or_404(User, User.username==username) Relationship.get_or_create( from_user=auth.get_logged_in_user(), to_user=user, ) flash('You are now following %s' % user.username) return redirect(url_for('user_detail', username=user.username)) @app.route('/users//unfollow/', methods=['POST']) @auth.login_required def user_unfollow(username): user = get_object_or_404(User, User.username==username) Relationship.delete().where( Relationship.from_user==auth.get_logged_in_user(), Relationship.to_user==user, ).execute() flash('You are no longer following %s' % user.username) return redirect(url_for('user_detail', username=user.username)) @app.route('/create/', methods=['GET', 'POST']) @auth.login_required def create(): user = auth.get_logged_in_user() if request.method == 'POST' and request.form['content']: message = Message.create( user=user, content=request.form['content'], ) flash('Your message has been created') return redirect(url_for('user_detail', username=user.username)) return render_template('create.html') @app.route('/edit//', methods=['GET', 'POST']) @auth.login_required def edit(message_id): user = auth.get_logged_in_user() message = get_object_or_404(Message, Message.user==user, Message.id==message_id) if request.method == 'POST' and request.form['content']: message.content = request.form['content'] message.save() flash('Your changes were saved') return redirect(url_for('user_detail', username=user.username)) return render_template('edit.html', message=message) flask-peewee-3.0.6/flask_peewee/000077500000000000000000000000001460575705200165355ustar00rootroot00000000000000flask-peewee-3.0.6/flask_peewee/__init__.py000066400000000000000000000000261460575705200206440ustar00rootroot00000000000000__version__ = '3.0.5' flask-peewee-3.0.6/flask_peewee/_compat.py000066400000000000000000000003751460575705200205360ustar00rootroot00000000000000import sys PY2 = sys.version_info[0] == 2 if PY2: text_type = unicode string_types = (str, unicode) unichr = unichr reduce = reduce else: text_type = str string_types = (str,) unichr = chr from functools import reduce flask-peewee-3.0.6/flask_peewee/_wtforms_compat.py000066400000000000000000000002671460575705200223170ustar00rootroot00000000000000# Helpers to work around wtforms 2/3 differences. try: from wtforms.validators import DataRequired except ImportError: from wtforms.validators import Required as DataRequired flask-peewee-3.0.6/flask_peewee/admin.py000066400000000000000000000613731460575705200202110ustar00rootroot00000000000000import functools import operator import os import re try: import simplejson as json except ImportError: import json from flask import Blueprint from flask import Response from flask import abort from flask import flash from flask import redirect from flask import render_template from flask import request from flask import session from flask import url_for from flask_peewee.filters import FilterForm from flask_peewee.filters import FilterMapping from flask_peewee.filters import FilterModelConverter from flask_peewee.forms import BaseModelConverter from flask_peewee.forms import ChosenAjaxSelectWidget from flask_peewee.forms import LimitedModelSelectField from flask_peewee.serializer import Serializer from flask_peewee.utils import PaginatedQuery from flask_peewee.utils import get_next from flask_peewee.utils import path_to_models from flask_peewee.utils import slugify from peewee import BooleanField from peewee import DateField from peewee import DateTimeField from peewee import ForeignKeyField from peewee import TextField from werkzeug.datastructures import Headers from wtforms import fields from wtforms import widgets from wtfpeewee.fields import ModelHiddenField from wtfpeewee.fields import ModelSelectField from wtfpeewee.fields import ModelSelectMultipleField from wtfpeewee.orm import model_form current_dir = os.path.dirname(__file__) class AdminModelConverter(BaseModelConverter): def __init__(self, model_admin, additional=None): super(AdminModelConverter, self).__init__(additional) self.model_admin = model_admin def handle_foreign_key(self, model, field, **kwargs): if field.null: kwargs['allow_blank'] = True if field.name in (self.model_admin.foreign_key_lookups or ()): form_field = ModelHiddenField(model=field.rel_model, **kwargs) else: form_field = ModelSelectField(model=field.rel_model, **kwargs) return field.name, form_field class AdminFilterModelConverter(FilterModelConverter): def __init__(self, model_admin, additional=None): super(AdminFilterModelConverter, self).__init__(additional) self.model_admin = model_admin def handle_foreign_key(self, model, field, **kwargs): if field.name in (self.model_admin.foreign_key_lookups or ()): data_source = url_for(self.model_admin.get_url_name('ajax_list')) widget = ChosenAjaxSelectWidget(data_source, field.name) form_field = LimitedModelSelectField(model=field.rel_model, widget=widget, **kwargs) else: form_field = ModelSelectField(model=field.rel_model, **kwargs) return field.name, form_field class Action(object): def __init__(self, name=None, description=None): self.name = name or (type(self).__name__.replace('Action', '')) self.description = description or re.sub('[\-_]', ' ', self.name).title() def callback(self, id_list): """ Perform an action on the list of IDs specified. If the return value is a Response object, then that will be returned to the user. Otherwise, the return value is ignored and the user is redirected to the index. """ raise NotImplementedError class ModelAdmin(object): """ ModelAdmin provides create/edit/delete functionality for a peewee Model. """ paginate_by = 20 filter_paginate_by = 15 # columns to display in the list index - can be field names or callables on # a model instance, though in the latter case they will not be sortable columns = None # exclude certian fields from being exposed as filters -- for related fields # use "__" notation, e.g. user__password filter_exclude = None filter_fields = None # form parameters, lists of fields exclude = None fields = None form_converter = AdminModelConverter # User-defined bulk actions. List or tuple of Action instances. actions = None # foreign_key_field --> related field to search on, e.g. {'user': 'username'} foreign_key_lookups = None # delete behavior delete_collect_objects = True delete_recursive = True filter_mapping = FilterMapping filter_converter = AdminFilterModelConverter # templates, to override see get_template_overrides() base_templates = { 'index': 'admin/models/index.html', 'add': 'admin/models/add.html', 'edit': 'admin/models/edit.html', 'delete': 'admin/models/delete.html', 'export': 'admin/models/export.html', } def __init__(self, admin, model): self.admin = admin self.model = model self.db = model._meta.database self.pk = self.model._meta.primary_key self.templates = dict(self.base_templates) self.templates.update(self.get_template_overrides()) self.action_map = dict((action.name, action) for action in (self.actions or ())) def get_template_overrides(self): return {} def get_url_name(self, name): return '%s.%s_%s' % ( self.admin.blueprint.name, self.get_admin_name(), name, ) def get_filter_form(self): return FilterForm( self.model, self.filter_converter(self), self.filter_mapping(), self.filter_fields, self.filter_exclude, ) def process_filters(self, query): filter_form = self.get_filter_form() form, query, cleaned = filter_form.process_request(query) return form, query, cleaned, filter_form._field_tree def get_form(self, adding=False): allow_pk = adding and not self.model._meta.auto_increment return model_form(self.model, allow_pk=allow_pk, only=self.fields, exclude=self.exclude, converter=self.form_converter(self), ) def get_add_form(self): return self.get_form(adding=True) def get_edit_form(self, instance): return self.get_form() def get_query(self): return self.model.select() def get_object(self, pk): return self.get_query().where(self.pk==pk).get() def get_urls(self): return ( ('/', self.index), ('/add/', self.add), ('/delete/', self.delete), ('/export/', self.export), ('//', self.edit), ('/_ajax/', self.ajax_list), ) def get_columns(self): return self.model._meta.sorted_field_names def column_is_sortable(self, col): return col in self.model._meta.fields def get_display_name(self): return self.model.__name__ def get_admin_name(self): return slugify(self.model.__name__) def save_model(self, instance, form, adding=False): form.populate_obj(instance) instance.save(force_insert=adding) return instance def apply_ordering(self, query, ordering): if ordering: desc, column = ordering.startswith('-'), ordering.lstrip('-') if self.column_is_sortable(column): field = self.model._meta.fields[column] query = query.order_by(field.asc() if not desc else field.desc()) return query def get_extra_context(self): return {} def index(self): if request.method == 'POST': id_list = request.form.getlist('id') action = request.form['action'] if action == 'delete': return redirect(url_for(self.get_url_name('delete'), id=id_list)) elif action == 'export': return redirect(url_for(self.get_url_name('export'), id=id_list)) elif action in self.action_map: id_list = request.form.getlist('id') if not id_list: flash('Please select one or more rows.', 'warning') else: action_obj = self.action_map[action] maybe_response = action_obj.callback(id_list) if isinstance(maybe_response, Response): return maybe_response else: flash('Unknown action: "%s".' % action, 'danger') return self._index_redirect() session['%s.index' % self.get_admin_name()] = request.url query = self.get_query() ordering = request.args.get('ordering') or '' query = self.apply_ordering(query, ordering) # process the filters from the request filter_form, query, cleaned, field_tree = self.process_filters(query) # create a paginated query out of our filtered results pq = PaginatedQuery(query, self.paginate_by) return render_template(self.templates['index'], model_admin=self, query=pq, ordering=ordering, filter_form=filter_form, field_tree=field_tree, active_filters=cleaned, **self.get_extra_context() ) def _index_redirect(self): url = (session.get('%s.index' % self.get_admin_name()) or url_for(self.get_url_name('index'))) return redirect(url) def dispatch_save_redirect(self, instance): if 'save' in request.form: return self._index_redirect() elif 'save_add' in request.form: return redirect(url_for(self.get_url_name('add'))) else: return redirect( url_for(self.get_url_name('edit'), pk=instance._pk) ) def add(self): Form = self.get_add_form() instance = self.model() if request.method == 'POST': form = Form(request.form) if form.validate(): instance = self.save_model(instance, form, True) flash('New %s saved successfully' % self.get_display_name(), 'success') return self.dispatch_save_redirect(instance) else: form = Form() return render_template(self.templates['add'], model_admin=self, form=form, instance=instance, **self.get_extra_context() ) def edit(self, pk): try: instance = self.get_object(pk) except self.model.DoesNotExist: abort(404) Form = self.get_edit_form(instance) if request.method == 'POST': form = Form(request.form, obj=instance) if form.validate(): self.save_model(instance, form, False) flash('Changes to %s saved successfully' % self.get_display_name(), 'success') return self.dispatch_save_redirect(instance) else: form = Form(obj=instance) return render_template(self.templates['edit'], model_admin=self, instance=instance, form=form, **self.get_extra_context() ) def collect_objects(self, obj): deps = obj.dependencies() objects = [] for query, fk in obj.dependencies(): if not fk.null: sq = fk.model.select().where(query) collected = [rel_obj for rel_obj in sq.execute().iterator()] if collected: objects.append((0, fk.model, collected)) return sorted(objects, key=lambda i: (i[0], i[1].__name__)) def delete(self): if request.method == 'GET': id_list = request.args.getlist('id') else: id_list = request.form.getlist('id') query = self.model.select().where(self.pk << id_list) if request.method == 'GET': collected = {} if self.delete_collect_objects: for obj in query: collected[obj._pk] = self.collect_objects(obj) elif request.method == 'POST': count = query.count() for obj in query: obj.delete_instance(recursive=self.delete_recursive) flash('Successfully deleted %s %ss' % (count, self.get_display_name()), 'success') return self._index_redirect() return render_template(self.templates['delete'], **dict( model_admin=self, query=query, collected=collected, **self.get_extra_context() )) def collect_related_fields(self, model, accum, path, seen=None): seen = seen or set() path_str = '__'.join(path) for field in model._meta.sorted_fields: if isinstance(field, ForeignKeyField) and field not in seen: seen.add(field) self.collect_related_fields(field.rel_model, accum, path + [field.name], seen) elif model != self.model: accum.setdefault((model, path_str), []) accum[(model, path_str)].append(field) return accum def export(self): query = self.get_query() ordering = request.args.get('ordering') or '' query = self.apply_ordering(query, ordering) # process the filters from the request filter_form, query, cleaned, field_tree = self.process_filters(query) related = self.collect_related_fields(self.model, {}, []) # check for raw id id_list = request.args.getlist('id') if id_list: query = query.where(self.pk << id_list) if request.method == 'POST': raw_fields = request.form.getlist('fields') export = Export(query, related, raw_fields) return export.json_response('export-%s.json' % self.get_admin_name()) return render_template(self.templates['export'], model_admin=self, model=query.model, query=query, filter_form=filter_form, field_tree=field_tree, active_filters=cleaned, related_fields=related, sql=query.sql(), **self.get_extra_context() ) def ajax_list(self): field_name = request.args.get('field') prev_page = 0 next_page = 0 try: models = path_to_models(self.model, field_name) except AttributeError: data = [] else: field = self.model._meta.fields[field_name] rel_model = models.pop() rel_field = rel_model._meta.fields[self.foreign_key_lookups[field_name]] query = rel_model.select().order_by(rel_field) query_string = request.args.get('query') if query_string: query = query.where(rel_field ** ('%%%s%%' % query_string)) pq = PaginatedQuery(query, self.filter_paginate_by) current_page = pq.get_page() if current_page > 1: prev_page = current_page - 1 if current_page < pq.get_pages(): next_page = current_page + 1 data = [] # if the field is nullable, include the "None" option at the top of the list if field.null: data.append({'id': '__None', 'repr': 'None'}) data.extend([{'id': obj._pk, 'repr': str(obj)} for obj in pq.get_list()]) json_data = json.dumps({'prev_page': prev_page, 'next_page': next_page, 'object_list': data}) return Response(json_data, mimetype='application/json') class AdminPanel(object): template_name = 'admin/panels/default.html' def __init__(self, admin, title): self.admin = admin self.title = title self.slug = slugify(self.title) def dashboard_url(self): return url_for('%s.index' % (self.admin.blueprint.name)) def get_urls(self): return () def get_url_name(self, name): return '%s.panel_%s_%s' % ( self.admin.blueprint.name, self.slug, name, ) def get_template_name(self): return self.template_name def get_context(self): return {} def render(self): return render_template(self.get_template_name(), panel=self, **self.get_context()) class AdminTemplateHelper(object): def __init__(self, admin): self.admin = admin self.app = self.admin.app def get_model_field(self, model, field): try: attr = getattr(model, field) except AttributeError: model_admin = self.admin[type(model)] try: attr = getattr(model_admin, field) except AttributeError: raise AttributeError('Could not find attribute or method ' 'named "%s".' % field) else: return attr(model) else: if callable(attr): attr = attr() return attr def get_form_field(self, form, field_name): return getattr(form, field_name) def fix_underscores(self, s): return s.replace('_', ' ').title() def update_querystring(self, querystring, key, val): if not querystring: return '%s=%s' % (key, val) else: querystring = re.sub('%s(?:[^&]+)?&?' % key, '', querystring.decode('utf8')).rstrip('&') return ('%s&%s=%s' % (querystring, key, val)).lstrip('&') def get_verbose_name(self, model, column_name): try: field = model._meta.fields[column_name] except KeyError: return self.fix_underscores(column_name) else: return field.verbose_name or self.fix_underscores(field.name) def get_model_admins(self): return {'model_admins': self.admin.get_model_admins(), 'branding': self.admin.branding} def get_admin_url(self, obj): model_admin = self.admin.get_admin_for(type(obj)) if model_admin: return url_for(model_admin.get_url_name('edit'), pk=obj._pk) def get_model_name(self, model_class): model_admin = self.admin.get_admin_for(model_class) if model_admin: return model_admin.get_display_name() return model_class.__name__ def apply_prefix(self, field_name, prefix_accum, field_prefix, rel_prefix='fr_', rel_sep='-'): accum = [] for prefix in prefix_accum: accum.append('%s%s' % (rel_prefix, prefix)) accum.append('%s%s' % (field_prefix, field_name)) return rel_sep.join(accum) def prepare_environment(self): self.app.template_context_processors[None].append(self.get_model_admins) self.app.jinja_env.globals['get_model_field'] = self.get_model_field self.app.jinja_env.globals['get_form_field'] = self.get_form_field self.app.jinja_env.globals['get_verbose_name'] = self.get_verbose_name self.app.jinja_env.filters['fix_underscores'] = self.fix_underscores self.app.jinja_env.globals['update_querystring'] = self.update_querystring self.app.jinja_env.globals['get_admin_url'] = self.get_admin_url self.app.jinja_env.globals['get_model_name'] = self.get_model_name self.app.jinja_env.filters['apply_prefix'] = self.apply_prefix class Admin(object): def __init__(self, app, auth, template_helper=AdminTemplateHelper, prefix='/admin', name='admin', branding='flask-peewee'): self.app = app self.auth = auth self._admin_models = {} self._registry = {} self._panels = {} self.blueprint = self.get_blueprint(name) self.url_prefix = prefix self.template_helper = template_helper(self) self.template_helper.prepare_environment() self.branding = branding def auth_required(self, func): @functools.wraps(func) def inner(*args, **kwargs): user = self.auth.get_logged_in_user() if not user: login_url = url_for('%s.login' % self.auth.blueprint.name, next=get_next()) return redirect(login_url) if not self.check_user_permission(user): abort(403) return func(*args, **kwargs) return inner def check_user_permission(self, user): return user.admin def get_urls(self): return ( ('/', self.auth_required(self.index)), ) def __contains__(self, item): return item in self._registry def __getitem__(self, item): return self._registry[item] def register(self, model, admin_class=ModelAdmin): model_admin = admin_class(self, model) admin_name = model_admin.get_admin_name() self._registry[model] = model_admin def unregister(self, model): del(self._registry[model]) def register_panel(self, title, panel): panel_instance = panel(self, title) self._panels[title] = panel_instance def unregister_panel(self, title): del(self._panels[title]) def get_admin_for(self, model): return self._registry.get(model) def get_model_admins(self): return sorted(self._registry.values(), key=lambda o: o.get_admin_name()) def get_panels(self): return sorted(self._panels.values(), key=lambda o: o.slug) def index(self): return render_template('admin/index.html', model_admins=self.get_model_admins(), panels=self.get_panels(), ) def get_blueprint(self, blueprint_name): return Blueprint( blueprint_name, __name__, static_folder=os.path.join(current_dir, 'static'), template_folder=os.path.join(current_dir, 'templates'), ) def register_blueprint(self, **kwargs): self.app.register_blueprint( self.blueprint, url_prefix=self.url_prefix, **kwargs ) def configure_routes(self): for url, callback in self.get_urls(): self.blueprint.route(url, methods=['GET', 'POST'])(callback) for model_admin in self._registry.values(): admin_name = model_admin.get_admin_name() for url, callback in model_admin.get_urls(): full_url = '/%s%s' % (admin_name, url) self.blueprint.add_url_rule( full_url, '%s_%s' % (admin_name, callback.__name__), self.auth_required(callback), methods=['GET', 'POST'], ) for panel in self._panels.values(): for url, callback in panel.get_urls(): full_url = '/%s%s' % (panel.slug, url) self.blueprint.add_url_rule( full_url, 'panel_%s_%s' % (panel.slug, callback.__name__), self.auth_required(callback), methods=['GET', 'POST'], ) def setup(self): self.configure_routes() self.register_blueprint() class Export(object): def __init__(self, query, related, fields): self.query = query self.related = related self.fields = fields self.alias_to_model = dict([(k[1], k[0]) for k in self.related.keys()]) def prepare_query(self): clone = self.query.clone() select = [] joined = set() def ensure_join(query, m, p): if m not in joined: if '__' not in p: next_model = query.model else: next, _ = p.rsplit('__', 1) next_model = self.alias_to_model[next] query = ensure_join(query, next_model, next) joined.add(m) return query.switch(next_model).join(m) else: return query for lookup in self.fields: # lookup may be something like "content" or "user__user_name" if '__' in lookup: path, column = lookup.rsplit('__', 1) model = self.alias_to_model[path] clone = ensure_join(clone, model, path) else: model = self.query.model column = lookup field = model._meta.fields[column] select.append(field) clone._select = select return clone def json_response(self, filename='export.json'): serializer = Serializer() prepared_query = self.prepare_query() field_dict = {} for field in prepared_query._select: field_dict.setdefault(field.model, []) field_dict[field.model].append(field.name) def generate(): i = prepared_query.count() yield b'[\n' for obj in prepared_query: i -= 1 obj_data = serializer.serialize_object(obj, field_dict) yield json.dumps(obj_data).encode('utf-8') if i > 0: yield b',\n' yield b'\n]' headers = Headers() headers.add('Content-Type', 'application/javascript') headers.add('Content-Disposition', 'attachment; filename=%s' % filename) return Response(generate(), mimetype='text/javascript', headers=headers, direct_passthrough=True) flask-peewee-3.0.6/flask_peewee/auth.py000066400000000000000000000156241460575705200200600ustar00rootroot00000000000000import functools import os from flask import Blueprint from flask import abort from flask import flash from flask import g from flask import redirect from flask import render_template from flask import request from flask import session from flask import url_for from peewee import * from wtforms import Form from wtforms import PasswordField from wtforms.fields import StringField from flask_peewee.utils import check_password from flask_peewee.utils import get_next from flask_peewee.utils import make_password from flask_peewee._wtforms_compat import DataRequired current_dir = os.path.dirname(__file__) class LoginForm(Form): username = StringField('Username', validators=[DataRequired()]) password = PasswordField('Password', validators=[DataRequired()]) class BaseUser(object): def set_password(self, password): self.password = make_password(password) def check_password(self, password): return check_password(password, self.password) class Auth(object): def __init__(self, app, db, user_model=None, prefix='/accounts', name='auth', clear_session=False, default_next_url='/', db_table='user'): self.app = app self.db = db self.db_table = db_table self.User = user_model or self.get_user_model() self.blueprint = self.get_blueprint(name) self.url_prefix = prefix self.clear_session = clear_session self.default_next_url = default_next_url self.setup() def get_context_user(self): return {'user': self.get_logged_in_user()} def get_user_model(self): class User(self.db.Model, BaseUser): username = CharField(unique=True) password = CharField() email = CharField(unique=True) active = BooleanField() admin = BooleanField(default=False) def __unicode__(self): return self.username class Meta: table_name = self.db_table return User def get_model_admin(self, model_admin=None): if model_admin is None: from flask_peewee.admin import ModelAdmin model_admin = ModelAdmin class UserAdmin(model_admin): columns = getattr(model_admin, 'columns') or ( ['username', 'email', 'active', 'admin']) def save_model(self, instance, form, adding=False): orig_password = instance.password user = super(UserAdmin, self).save_model(instance, form, adding) if orig_password != form.password.data: user.set_password(form.password.data) user.save() return user return UserAdmin def register_admin(self, admin_site, model_admin=None): admin_site.register(self.User, self.get_model_admin(model_admin)) def get_blueprint(self, blueprint_name): return Blueprint( blueprint_name, __name__, static_folder=os.path.join(current_dir, 'static'), template_folder=os.path.join(current_dir, 'templates'), ) def get_urls(self): return ( ('/logout/', self.logout), ('/login/', self.login), ) def get_login_form(self): return LoginForm def test_user(self, test_fn): def decorator(fn): @functools.wraps(fn) def inner(*args, **kwargs): user = self.get_logged_in_user() if not user or not test_fn(user): login_url = url_for('%s.login' % self.blueprint.name, next=get_next()) return redirect(login_url) return fn(*args, **kwargs) return inner return decorator def login_required(self, func): return self.test_user(lambda u: True)(func) def admin_required(self, func): return self.test_user(lambda u: u.admin)(func) def authenticate(self, username, password): active = self.User.select().where(self.User.active==True) try: user = active.where(self.User.username==username).get() except self.User.DoesNotExist: return False else: if not user.check_password(password): return False return user def login_user(self, user): session['logged_in'] = True session['user_pk'] = user._pk session.permanent = True g.user = user flash('You are logged in as %s' % user, 'success') def logout_user(self): if self.clear_session: session.clear() else: session.pop('logged_in', None) g.user = None flash('You are now logged out', 'success') def get_logged_in_user(self): if session.get('logged_in'): if getattr(g, 'user', None): return g.user try: return self.User.select().where( self.User.active==True, self.User.id==session.get('user_pk') ).get() except self.User.DoesNotExist: pass def login(self): error = None Form = self.get_login_form() if request.method == 'POST': form = Form(request.form) next_url = request.form.get('next') or self.default_next_url if form.validate(): authenticated_user = self.authenticate( form.username.data, form.password.data, ) if authenticated_user: self.login_user(authenticated_user) return redirect(next_url) else: flash('Incorrect username or password') else: form = Form() next_url = request.args.get('next') return render_template( 'auth/login.html', error=error, form=form, login_url=url_for('%s.login' % self.blueprint.name), next=next_url) def logout(self): self.logout_user() return redirect(request.args.get('next') or self.default_next_url) def configure_routes(self): for url, callback in self.get_urls(): self.blueprint.route(url, methods=['GET', 'POST'])(callback) def register_blueprint(self, **kwargs): self.app.register_blueprint(self.blueprint, url_prefix=self.url_prefix, **kwargs) def load_user(self): g.user = self.get_logged_in_user() def register_handlers(self): self.app.before_request_funcs.setdefault(None, []) self.app.before_request_funcs[None].append(self.load_user) def register_context_processors(self): self.app.template_context_processors[None].append(self.get_context_user) def setup(self): self.configure_routes() self.register_blueprint() self.register_handlers() self.register_context_processors() flask-peewee-3.0.6/flask_peewee/db.py000066400000000000000000000035561460575705200175050ustar00rootroot00000000000000import peewee from peewee import * from flask_peewee.exceptions import ImproperlyConfigured from flask_peewee.utils import load_class class Database(object): def __init__(self, app, database=None): self.app = app self.database = database if self.database is None: self.load_database() self.register_handlers() self.Model = self.get_model_class() def load_database(self): self.database_config = dict(self.app.config['DATABASE']) try: self.database_name = self.database_config.pop('name') self.database_engine = self.database_config.pop('engine') except KeyError: raise ImproperlyConfigured('Please specify a "name" and "engine" for your database') try: self.database_class = load_class(self.database_engine) assert issubclass(self.database_class, peewee.Database) except ImportError: raise ImproperlyConfigured('Unable to import: "%s"' % self.database_engine) except AttributeError: raise ImproperlyConfigured('Database engine not found: "%s"' % self.database_engine) except AssertionError: raise ImproperlyConfigured('Database engine not a subclass of peewee.Database: "%s"' % self.database_engine) self.database = self.database_class(self.database_name, **self.database_config) def get_model_class(self): class BaseModel(Model): class Meta: database = self.database return BaseModel def connect_db(self): if self.database.is_closed(): self.database.connect() def close_db(self, exc): if not self.database.is_closed(): self.database.close() def register_handlers(self): self.app.before_request(self.connect_db) self.app.teardown_request(self.close_db) flask-peewee-3.0.6/flask_peewee/exceptions.py000066400000000000000000000000601460575705200212640ustar00rootroot00000000000000class ImproperlyConfigured(Exception): pass flask-peewee-3.0.6/flask_peewee/filters.py000066400000000000000000000304721460575705200205650ustar00rootroot00000000000000import datetime import operator from flask import request from peewee import * from wtforms import fields from wtforms import form from wtforms import validators from wtforms import widgets from flask_peewee.forms import BaseModelConverter from flask_peewee._compat import reduce class QueryFilter(object): """ Basic class representing a named field (with or without a list of options) and an operation against a given value """ def __init__(self, field, name, options=None): self.field = field self.name = name self.options = options def query(self, value): raise NotImplementedError def operation(self): raise NotImplementedError def get_options(self): return self.options class EqualQueryFilter(QueryFilter): def query(self, value): return self.field == value def operation(self): return 'equal to' class NotEqualQueryFilter(QueryFilter): def query(self, value): return self.field != value def operation(self): return 'not equal to' class LessThanQueryFilter(QueryFilter): def query(self, value): return self.field < value def operation(self): return 'less than' class LessThanEqualToQueryFilter(QueryFilter): def query(self, value): return self.field <= value def operation(self): return 'less than or equal to' class GreaterThanQueryFilter(QueryFilter): def query(self, value): return self.field > value def operation(self): return 'greater than' class GreaterThanEqualToQueryFilter(QueryFilter): def query(self, value): return self.field >= value def operation(self): return 'greater than or equal to' class StartsWithQueryFilter(QueryFilter): def query(self, value): return fn.Lower(fn.Substr(self.field, 1, len(value))) == value.lower() def operation(self): return 'starts with' class ContainsQueryFilter(QueryFilter): def query(self, value): return self.field ** ('%%%s%%' % value) def operation(self): return 'contains' class YearFilter(QueryFilter): def query(self, value): value = int(value) return self.field.year == value def operation(self): return 'year equals' class MonthFilter(QueryFilter): def query(self, value): value = int(value) return self.field.month == value def operation(self): return 'month equals' class WithinDaysAgoFilter(QueryFilter): def query(self, value): value = int(value) return self.field >= ( datetime.date.today() - datetime.timedelta(days=value)) def operation(self): return 'within X days ago' class OlderThanDaysAgoFilter(QueryFilter): def query(self, value): value = int(value) return self.field < ( datetime.date.today() - datetime.timedelta(days=value)) def operation(self): return 'older than X days ago' class FilterMapping(object): """ Map a peewee field to a list of valid query filters for that field """ string = ( EqualQueryFilter, NotEqualQueryFilter, StartsWithQueryFilter, ContainsQueryFilter) numeric = ( EqualQueryFilter, NotEqualQueryFilter, LessThanQueryFilter, GreaterThanQueryFilter, LessThanEqualToQueryFilter, GreaterThanEqualToQueryFilter) datetime_date = (numeric + ( WithinDaysAgoFilter, OlderThanDaysAgoFilter, YearFilter, MonthFilter)) foreign_key = (EqualQueryFilter, NotEqualQueryFilter) boolean = (EqualQueryFilter, NotEqualQueryFilter) def get_field_types(self): return { CharField: 'string', TextField: 'string', DateTimeField: 'datetime_date', DateField: 'datetime_date', TimeField: 'numeric', IntegerField: 'numeric', BigIntegerField: 'numeric', FloatField: 'numeric', DoubleField: 'numeric', DecimalField: 'numeric', BooleanField: 'boolean', AutoField: 'numeric', ForeignKeyField: 'foreign_key', } def convert(self, field): mapping = self.get_field_types() for klass in type(field).__mro__: if klass in mapping: mapping_fn = getattr(self, 'convert_%s' % mapping[klass]) return mapping_fn(field) # fall back to numeric return self.convert_numeric(field) def convert_string(self, field): return [f(field, field.verbose_name, field.choices) for f in self.string] def convert_numeric(self, field): return [f(field, field.verbose_name, field.choices) for f in self.numeric] def convert_datetime_date(self, field): return [f(field, field.verbose_name, field.choices) for f in self.datetime_date] def convert_boolean(self, field): boolean_choices = [('True', '1', 'False', '')] return [f(field, field.verbose_name, boolean_choices) for f in self.boolean] def convert_foreign_key(self, field): return [f(field, field.verbose_name, field.choices) for f in self.foreign_key] class FieldTreeNode(object): def __init__(self, model, fields, children=None): self.model = model self.fields = fields self.children = children or {} def make_field_tree(model, fields, exclude, force_recursion=False, seen=None): no_explicit_fields = fields is None # assume we want all of them if no_explicit_fields: fields = model._meta.sorted_field_names exclude = exclude or [] seen = seen or set() model_fields = [] children = {} for field_obj in model._meta.sorted_fields: if field_obj.name in exclude or field_obj in seen: continue if field_obj.name in fields: model_fields.append(field_obj) if isinstance(field_obj, ForeignKeyField): seen.add(field_obj) if no_explicit_fields: rel_fields = None else: rel_fields = [ rf.replace('%s__' % field_obj.name, '') \ for rf in fields if rf.startswith('%s__' % field_obj.name) ] if not rel_fields and force_recursion: rel_fields = None rel_exclude = [ rx.replace('%s__' % field_obj.name, '') \ for rx in exclude if rx.startswith('%s__' % field_obj.name) ] children[field_obj.name] = make_field_tree(field_obj.rel_model, rel_fields, rel_exclude, force_recursion, seen) return FieldTreeNode(model, model_fields, children) class SmallSelectWidget(widgets.Select): def __call__(self, field, **kwargs): kwargs['class'] = 'span2' return super(SmallSelectWidget, self).__call__(field, **kwargs) class FilterForm(object): base_class = form.Form separator = '-' field_operation_prefix = 'fo_' field_value_prefix = 'fv_' field_relation_prefix = 'fr_' def __init__(self, model, model_converter, filter_mapping, fields=None, exclude=None): self.model = model self.model_converter = model_converter self.filter_mapping = filter_mapping # convert fields and exclude into a tree self._field_tree = make_field_tree(model, fields, exclude) self._query_filters = self.load_query_filters() def load_query_filters(self): query_filters = {} queue = [self._field_tree] while queue: curr = queue.pop(0) for field in curr.fields: query_filters[field] = self.filter_mapping.convert(field) queue.extend(curr.children.values()) return query_filters def get_operation_field(self, field): choices = [] for i, query_filter in enumerate(self._query_filters[field]): choices.append((str(i), query_filter.operation())) return fields.SelectField(choices=choices, validators=[validators.Optional()], widget=SmallSelectWidget()) def get_field_default(self, field): if isinstance(field, DateTimeField): return datetime.datetime.now() elif isinstance(field, DateField): return datetime.date.today() elif isinstance(field, TimeField): return datetime.time(0, 0) return field.default def get_value_field(self, field): field_name, form_field = self.model_converter.convert(field.model, field, None) form_field.kwargs['default'] = self.get_field_default(field) form_field.kwargs['validators'] = [validators.Optional()] return form_field def get_field_dict(self, node=None, prefix=None): field_dict = {} node = node or self._field_tree for field in node.fields: op_field = self.get_operation_field(field) val_field = self.get_value_field(field) field_dict['%s%s' % (self.field_operation_prefix, field.name)] = op_field field_dict['%s%s' % (self.field_value_prefix, field.name)] = val_field for prefix, node in node.children.items(): child_fd = self.get_field_dict(node, prefix) field_dict['%s%s' % (self.field_relation_prefix, prefix)] = fields.FormField( self.get_form(child_fd), separator=self.separator, ) return field_dict def get_form(self, field_dict): return type( self.model.__name__ + 'FilterForm', (self.base_class, ), field_dict, ) def parse_query_filters(self): # reconstruct the "select" and "value" fields we are searching for in the # arguments from the request by depth-first searching the field tree -- # basically what we should have at the end is the field we're querying, # the type of query (QueryFilter), the value requested, and the path we # took to get there (joins) accum = {} def _dfs(node, prefix, models, join_columns): for field in node.fields: qf_select = self.field_operation_prefix.join((prefix, field.name)) qf_value = self.field_value_prefix.join((prefix, field.name)) if qf_select in request.args and qf_value in request.args: accum.setdefault(field, []) accum[field].append(( request.args.getlist(qf_select), request.args.getlist(qf_value), models, join_columns, qf_select, qf_value, )) for child_prefix, child in node.children.items(): new_prefix = prefix + self.field_relation_prefix + child_prefix + self.separator model_copy = list(models) + [child.model] join_copy = list(join_columns) + [node.model._meta.fields[child_prefix]] _dfs(child, new_prefix, model_copy, join_copy) _dfs(self._field_tree, '', [], []) return accum def process_request(self, query): field_dict = self.get_field_dict() FormClass = self.get_form(field_dict) form = FormClass(request.args) query_filters = self.parse_query_filters() cleaned = [] for field, filters in query_filters.items(): for (filter_idx_list, filter_value_list, path, join_path, qf_s, qf_v) in filters: query = query.switch(self.model) for join, model in zip(join_path, path): query = query.join(model, on=join) q_objects = [] for filter_idx, filter_value in zip(filter_idx_list, filter_value_list): idx = int(filter_idx) cleaned.append((qf_s, idx, qf_v, filter_value)) query_filter = self._query_filters[field][idx] q_objects.append(query_filter.query(field.db_value(filter_value))) query = query.where(reduce(operator.or_, q_objects)) return form, query, cleaned class FilterModelConverter(BaseModelConverter): def __init__(self, *args, **kwargs): super(FilterModelConverter, self).__init__(*args, **kwargs) self.defaults = dict(self.defaults) self.defaults[TextField] = fields.StringField self.defaults[DateTimeField] = fields.DateTimeField flask-peewee-3.0.6/flask_peewee/forms.py000066400000000000000000000025771460575705200202500ustar00rootroot00000000000000from peewee import BooleanField from wtforms import widgets from wtfpeewee.fields import BooleanSelectField from wtfpeewee.fields import ModelSelectField from wtfpeewee.orm import ModelConverter class BaseModelConverter(ModelConverter): def __init__(self, *args, **kwargs): super(BaseModelConverter, self).__init__(*args, **kwargs) self.converters[BooleanField] = self.handle_boolean def handle_boolean(self, model, field, **kwargs): return field.name, BooleanSelectField(**kwargs) class ChosenAjaxSelectWidget(widgets.Select): def __init__(self, data_source, data_param, *args, **kwargs): self.data_source = data_source self.data_param = data_param super(ChosenAjaxSelectWidget, self).__init__(*args, **kwargs) def __call__(self, field, **kwargs): if field.allow_blank and not self.multiple: kwargs['data-role'] = u'ajax-chosenblank' else: kwargs['data-role'] = u'ajax-chosen' kwargs['data-source'] = self.data_source kwargs['data-param'] = self.data_param kwargs['data-placeholder'] = 'Type to search...' return super(ChosenAjaxSelectWidget, self).__call__(field, **kwargs) class LimitedModelSelectField(ModelSelectField): def iter_choices(self): for obj in self.query.limit(20): yield (obj._pk, self.get_label(obj), obj == self.data) flask-peewee-3.0.6/flask_peewee/rest.py000066400000000000000000000425321460575705200200720ustar00rootroot00000000000000import functools import operator try: import simplejson as json except ImportError: import json from flask import Blueprint from flask import Response from flask import abort from flask import g from flask import redirect from flask import request from flask import session from flask import url_for from peewee import * from peewee import DJANGO_MAP from flask_peewee.filters import make_field_tree from flask_peewee.serializer import Deserializer from flask_peewee.serializer import Serializer from flask_peewee.utils import PaginatedQuery from flask_peewee.utils import get_object_or_404 from flask_peewee.utils import slugify from flask_peewee._compat import reduce class Authentication(object): def __init__(self, protected_methods=None): if protected_methods is None: protected_methods = ['POST', 'PUT', 'DELETE'] self.protected_methods = protected_methods def authorize(self): if request.method in self.protected_methods: return False return True class APIKeyAuthentication(Authentication): """ Requires a model that has at least two fields, "key" and "secret", which will be searched for when authing a request. """ key_field = 'key' secret_field = 'secret' def __init__(self, model, protected_methods=None): super(APIKeyAuthentication, self).__init__(protected_methods) self.model = model self._key_field = model._meta.fields[self.key_field] self._secret_field = model._meta.fields[self.secret_field] def get_query(self): return self.model.select() def get_key(self, k, s): try: return self.get_query().where( self._key_field==k, self._secret_field==s ).get() except self.model.DoesNotExist: pass def get_key_secret(self): for search in [request.args, request.headers, request.form]: if 'key' in search and 'secret' in search: return search['key'], search['secret'] return None, None def authorize(self): g.api_key = None if request.method not in self.protected_methods: return True key, secret = self.get_key_secret() if key or secret: g.api_key = self.get_key(key, secret) return g.api_key class UserAuthentication(Authentication): def __init__(self, auth, protected_methods=None): super(UserAuthentication, self).__init__(protected_methods) self.auth = auth def authorize(self): g.user = None if request.method not in self.protected_methods: return True basic_auth = request.authorization if not basic_auth: return False g.user = self.auth.authenticate(basic_auth.username, basic_auth.password) return g.user class AdminAuthentication(UserAuthentication): def verify_user(self, user): return user.admin def authorize(self): res = super(AdminAuthentication, self).authorize() if res and g.user: return self.verify_user(g.user) return res class RestResource(object): paginate_by = 20 value_transforms = {'False': False, 'false': False, 'True': True, 'true': True, 'None': None, 'none': None} # serializing: dictionary of model -> field names to restrict output fields = None exclude = None # exclude certian fields from being exposed as filters -- for related fields # use "__" notation, e.g. user__password filter_exclude = None filter_fields = None filter_recursive = True # mapping of field name to resource class include_resources = None # delete behavior delete_recursive = True def __init__(self, rest_api, model, authentication, allowed_methods=None): self.api = rest_api self.model = model self.pk = model._meta.primary_key self.authentication = authentication self.allowed_methods = allowed_methods or ['GET', 'POST', 'PUT', 'DELETE'] self._fields = {self.model: self.fields or self.model._meta.sorted_field_names} if self.exclude: self._exclude = {self.model: self.exclude} else: self._exclude = {} self._filter_fields = self.filter_fields or list(self.model._meta.sorted_field_names) self._filter_exclude = self.filter_exclude or [] self._resources = {} # recurse into nested resources if self.include_resources: for field_name, resource in self.include_resources.items(): field_obj = self.model._meta.fields[field_name] resource_obj = resource(self.api, field_obj.rel_model, self.authentication, self.allowed_methods) self._resources[field_name] = resource_obj self._fields.update(resource_obj._fields) self._exclude.update(resource_obj._exclude) self._filter_fields.extend(['%s__%s' % (field_name, ff) for ff in resource_obj._filter_fields]) self._filter_exclude.extend(['%s__%s' % (field_name, ff) for ff in resource_obj._filter_exclude]) self._include_foreign_keys = False else: self._include_foreign_keys = True self._field_tree = make_field_tree(self.model, self._filter_fields, self._filter_exclude, self.filter_recursive) def authorize(self): return self.authentication.authorize() def get_api_name(self): return slugify(self.model.__name__) def get_url_name(self, name): return '%s.%s_%s' % ( self.api.blueprint.name, self.get_api_name(), name, ) def get_query(self): return self.model.select() def process_query(self, query): raw_filters = {} # clean and normalize the request parameters for key in request.args: orig_key = key if key.startswith('-'): negated = True key = key[1:] else: negated = False if '__' in key: expr, op = key.rsplit('__', 1) if op not in DJANGO_MAP: expr = key op = 'eq' else: expr = key op = 'eq' raw_filters.setdefault(expr, []) raw_filters[expr].append((op, request.args.getlist(orig_key), negated)) # do a breadth first search across the field tree created by filter_fields, # searching for matching keys in the request parameters -- when found, # filter the query accordingly queue = [(self._field_tree, '')] while queue: node, prefix = queue.pop(0) for field in node.fields: filter_expr = '%s%s' % (prefix, field.name) if filter_expr in raw_filters: for op, arg_list, negated in raw_filters[filter_expr]: clean_args = self.clean_arg_list(arg_list) query = self.apply_filter(query, filter_expr, op, clean_args, negated) for child_prefix, child_node in node.children.items(): queue.append((child_node, prefix + child_prefix + '__')) return query def clean_arg_list(self, arg_list): return [self.value_transforms.get(arg, arg) for arg in arg_list] def apply_filter(self, query, expr, op, arg_list, negated): query_expr = '%s__%s' % (expr, op) constructor = lambda kwargs: negated and ~DQ(**kwargs) or DQ(**kwargs) if op == 'in': # in gives us a string format list '1,2,3,4' # we have to turn it into a list before passing to # the filter. arg_list = [i.strip() for i in arg_list[0].split(',')] return query.filter(constructor({query_expr: arg_list})) elif len(arg_list) == 1: return query.filter(constructor({query_expr: arg_list[0]})) else: query_clauses = [ constructor({query_expr: val}) for val in arg_list] return query.filter(reduce(operator.or_, query_clauses)) def get_serializer(self): return Serializer() def get_deserializer(self): return Deserializer() def prepare_data(self, obj, data): """ Hook for modifying outgoing data """ return data def serialize_object(self, obj): s = self.get_serializer() return self.prepare_data( obj, s.serialize_object(obj, self._fields, self._exclude) ) def serialize_query(self, query): s = self.get_serializer() return [ self.prepare_data(obj, s.serialize_object(obj, self._fields, self._exclude)) \ for obj in query ] def deserialize_object(self, data, instance): d = self.get_deserializer() return d.deserialize_object(instance, data) def response_forbidden(self): return Response('Forbidden', 403) def response_bad_method(self): return Response('Unsupported method "%s"' % (request.method), 405) def response_bad_request(self): return Response('Bad request', 400) def response(self, data): return Response(json.dumps(data), mimetype='application/json') def require_method(self, func, methods): @functools.wraps(func) def inner(*args, **kwargs): if request.method not in methods: return self.response_bad_method() return func(*args, **kwargs) return inner def get_urls(self): return ( ('/', self.require_method(self.api_list, ['GET', 'POST'])), ('//', self.require_method(self.api_detail, ['GET', 'POST', 'PUT', 'DELETE'])), ('//delete/', self.require_method(self.post_delete, ['POST', 'DELETE'])), ) def check_get(self, obj=None): return True def check_post(self, obj=None): return True def check_put(self, obj): return True def check_delete(self, obj): return True def save_object(self, instance, raw_data): instance.save() return instance def api_list(self): if not getattr(self, 'check_%s' % request.method.lower())(): return self.response_forbidden() if request.method == 'GET': return self.object_list() elif request.method == 'POST': return self.create() def api_detail(self, pk, method=None): obj = get_object_or_404(self.get_query(), self.pk==pk) method = method or request.method if not getattr(self, 'check_%s' % method.lower())(obj): return self.response_forbidden() if method == 'GET': return self.object_detail(obj) elif method in ('PUT', 'POST'): return self.edit(obj) elif method == 'DELETE': return self.delete(obj) def post_delete(self, pk): return self.api_detail(pk, 'DELETE') def apply_ordering(self, query): ordering = request.args.get('ordering') or '' if ordering: desc, column = ordering.startswith('-'), ordering.lstrip('-') if column in self.model._meta.fields: field = self.model._meta.fields[column] query = query.order_by(field.asc() if not desc else field.desc()) return query def get_request_metadata(self, paginated_query): var = paginated_query.page_var request_arguments = request.args.copy() current_page = paginated_query.get_page() next = previous = '' if current_page > 1: request_arguments[var] = current_page - 1 previous = url_for(self.get_url_name('api_list'), **request_arguments) if current_page < paginated_query.get_pages(): request_arguments[var] = current_page + 1 next = url_for(self.get_url_name('api_list'), **request_arguments) return { 'model': self.get_api_name(), 'page': current_page, 'previous': previous, 'next': next, } def get_paginate_by(self): try: paginate_by = int(request.args.get('limit', self.paginate_by)) except ValueError: paginate_by = self.paginate_by else: if self.paginate_by: paginate_by = min(paginate_by, self.paginate_by) # restrict return paginate_by def paginated_object_list(self, filtered_query): paginate_by = self.get_paginate_by() pq = PaginatedQuery(filtered_query, paginate_by) meta_data = self.get_request_metadata(pq) query_dict = self.serialize_query(pq.get_list()) return self.response({ 'meta': meta_data, 'objects': query_dict, }) def object_list(self): query = self.get_query() query = self.apply_ordering(query) # process any filters query = self.process_query(query) if self.paginate_by or 'limit' in request.args: return self.paginated_object_list(query) return self.response(self.serialize_query(query)) def object_detail(self, obj): return self.response(self.serialize_object(obj)) def save_related_objects(self, instance, data): for k, v in data.items(): if k in self._resources and isinstance(v, dict): rel_resource = self._resources[k] rel_obj, rel_models = rel_resource.deserialize_object(v, getattr(instance, k)) rel_resource.save_related_objects(rel_obj, v) setattr(instance, k, rel_resource.save_object(rel_obj, v)) def read_request_data(self): if request.data: return json.loads(request.data.decode('utf-8')) elif request.form.get('data'): return json.loads(request.form['data']) else: return dict(request.form) def create(self): try: data = self.read_request_data() except ValueError: return self.response_bad_request() obj, models = self.deserialize_object(data, self.model()) self.save_related_objects(obj, data) obj = self.save_object(obj, data) return self.response(self.serialize_object(obj)) def edit(self, obj): try: data = self.read_request_data() except ValueError: return self.response_bad_request() obj, models = self.deserialize_object(data, obj) self.save_related_objects(obj, data) obj = self.save_object(obj, data) return self.response(self.serialize_object(obj)) def delete(self, obj): res = obj.delete_instance(recursive=self.delete_recursive) return self.response({'deleted': res}) class RestrictOwnerResource(RestResource): # restrict PUT/DELETE to owner of an object, likewise apply owner to any # incoming POSTs owner_field = 'user' def validate_owner(self, user, obj): return user == getattr(obj, self.owner_field) def set_owner(self, obj, user): setattr(obj, self.owner_field, user) def check_put(self, obj): return self.validate_owner(g.user, obj) def check_delete(self, obj): return self.validate_owner(g.user, obj) def save_object(self, instance, raw_data): self.set_owner(instance, g.user) return super(RestrictOwnerResource, self).save_object(instance, raw_data) class RestAPI(object): def __init__(self, app, prefix='/api', default_auth=None, name='api'): self.app = app self._registry = {} self.url_prefix = prefix self.blueprint = self.get_blueprint(name) self.default_auth = default_auth or Authentication() def register(self, model, provider=RestResource, auth=None, allowed_methods=None): self._registry[model] = provider(self, model, auth or self.default_auth, allowed_methods) def unregister(self, model): del(self._registry[model]) def is_registered(self, model): return self._registry.get(model) def response_auth_failed(self): return Response('Authentication failed', 401, { 'WWW-Authenticate': 'Basic realm="Login Required"' }) def auth_wrapper(self, func, provider): @functools.wraps(func) def inner(*args, **kwargs): if not provider.authorize(): return self.response_auth_failed() return func(*args, **kwargs) return inner def get_blueprint(self, blueprint_name): return Blueprint(blueprint_name, __name__) def get_urls(self): return () def configure_routes(self): for url, callback in self.get_urls(): self.blueprint.route(url)(callback) for provider in self._registry.values(): api_name = provider.get_api_name() for url, callback in provider.get_urls(): full_url = '/%s%s' % (api_name, url) self.blueprint.add_url_rule( full_url, '%s_%s' % (api_name, callback.__name__), self.auth_wrapper(callback, provider), methods=provider.allowed_methods, ) def register_blueprint(self, **kwargs): self.app.register_blueprint(self.blueprint, url_prefix=self.url_prefix, **kwargs) def setup(self): self.configure_routes() self.register_blueprint() flask-peewee-3.0.6/flask_peewee/serializer.py000066400000000000000000000027231460575705200212640ustar00rootroot00000000000000import datetime import sys import uuid from peewee import Model from flask_peewee.utils import get_dictionary_from_model from flask_peewee.utils import get_model_from_dictionary class Serializer(object): date_format = '%Y-%m-%d' time_format = '%H:%M:%S' datetime_format = ' '.join([date_format, time_format]) def convert_value(self, value): if isinstance(value, datetime.datetime): return value.strftime(self.datetime_format) elif isinstance(value, datetime.date): return value.strftime(self.date_format) elif isinstance(value, datetime.time): return value.strftime(self.time_format) elif isinstance(value, Model): return value._pk elif isinstance(value, uuid.UUID): return str(value) else: return value def clean_data(self, data): for key, value in data.items(): if isinstance(value, dict): self.clean_data(value) elif isinstance(value, (list, tuple)): data[key] = map(self.clean_data, value) else: data[key] = self.convert_value(value) return data def serialize_object(self, obj, fields=None, exclude=None): data = get_dictionary_from_model(obj, fields, exclude) return self.clean_data(data) class Deserializer(object): def deserialize_object(self, model, data): return get_model_from_dictionary(model, data) flask-peewee-3.0.6/flask_peewee/static/000077500000000000000000000000001460575705200200245ustar00rootroot00000000000000flask-peewee-3.0.6/flask_peewee/static/css/000077500000000000000000000000001460575705200206145ustar00rootroot00000000000000flask-peewee-3.0.6/flask_peewee/static/css/admin.css000066400000000000000000000021031460575705200224120ustar00rootroot00000000000000html, body { background-color: #fff; } body { padding-top: 60px; } .container > footer p { text-align: center; /* center align it with the container */ } /* The white background content wrapper */ .content { background-color: #fff; -webkit-border-radius: 0 0 6px 6px; -moz-border-radius: 0 0 6px 6px; border-radius: 0 0 6px 6px; } /* modeladmin filters */ form.modeladmin-filters { margin: 0; } form.modeladmin-filters ul { list-style-type: none; } form.modeladmin-filters select { margin-right: 10px; } div.form-wrapper { width: 100%; overflow: auto; } form textarea { height: 150px; } form input[type="text"].datetime-widget { width: 100px; margin-right: 10px; } div.sidebar li.active { font-weight: bold; } table.table-striped td.links .inline { margin: 0; } table.table-striped td.links .inline li { display: inline-block; } table.table-striped td.links .inline li a { border-right: 1px solid #DDDDDD; padding-right: 5px; } table.table-striped td.links .inline li:last-child a { border-right: medium none; } /* helpers */ .hidden { display: none; } flask-peewee-3.0.6/flask_peewee/static/css/bootstrap-responsive.css000066400000000000000000000244571460575705200255520ustar00rootroot00000000000000/*! * Bootstrap Responsive v2.0.0 * * Copyright 2012 Twitter, Inc * Licensed under the Apache License v2.0 * http://www.apache.org/licenses/LICENSE-2.0 * * Designed and built with all the love in the world @twitter by @mdo and @fat. */ .hidden { display: none; visibility: hidden; } @media (max-width: 480px) { .nav-collapse { -webkit-transform: translate3d(0, 0, 0); } .page-header h1 small { display: block; line-height: 18px; } input[class*="span"], select[class*="span"], textarea[class*="span"], .uneditable-input { display: block; width: 100%; height: 28px; /* Make inputs at least the height of their button counterpart */ /* Makes inputs behave like true block-level elements */ -webkit-box-sizing: border-box; /* Older Webkit */ -moz-box-sizing: border-box; /* Older FF */ -ms-box-sizing: border-box; /* IE8 */ box-sizing: border-box; /* CSS3 spec*/ } .input-prepend input[class*="span"], .input-append input[class*="span"] { width: auto; } input[type="checkbox"], input[type="radio"] { border: 1px solid #ccc; } .form-horizontal .control-group > label { float: none; width: auto; padding-top: 0; text-align: left; } .form-horizontal .controls { margin-left: 0; } .form-horizontal .control-list { padding-top: 0; } .form-horizontal .form-actions { padding-left: 10px; padding-right: 10px; } .modal { position: absolute; top: 10px; left: 10px; right: 10px; width: auto; margin: 0; } .modal.fade.in { top: auto; } .modal-header .close { padding: 10px; margin: -10px; } .carousel-caption { position: static; } } @media (max-width: 768px) { .container { width: auto; padding: 0 20px; } .row-fluid { width: 100%; } .row { margin-left: 0; } .row > [class*="span"], .row-fluid > [class*="span"] { float: none; display: block; width: auto; margin: 0; } } @media (min-width: 768px) and (max-width: 980px) { .row { margin-left: -20px; *zoom: 1; } .row:before, .row:after { display: table; content: ""; } .row:after { clear: both; } [class*="span"] { float: left; margin-left: 20px; } .span1 { width: 42px; } .span2 { width: 104px; } .span3 { width: 166px; } .span4 { width: 228px; } .span5 { width: 290px; } .span6 { width: 352px; } .span7 { width: 414px; } .span8 { width: 476px; } .span9 { width: 538px; } .span10 { width: 600px; } .span11 { width: 662px; } .span12, .container { width: 724px; } .offset1 { margin-left: 82px; } .offset2 { margin-left: 144px; } .offset3 { margin-left: 206px; } .offset4 { margin-left: 268px; } .offset5 { margin-left: 330px; } .offset6 { margin-left: 392px; } .offset7 { margin-left: 454px; } .offset8 { margin-left: 516px; } .offset9 { margin-left: 578px; } .offset10 { margin-left: 640px; } .offset11 { margin-left: 702px; } .row-fluid { width: 100%; *zoom: 1; } .row-fluid:before, .row-fluid:after { display: table; content: ""; } .row-fluid:after { clear: both; } .row-fluid > [class*="span"] { float: left; margin-left: 2.762430939%; } .row-fluid > [class*="span"]:first-child { margin-left: 0; } .row-fluid .span1 { width: 5.801104972%; } .row-fluid .span2 { width: 14.364640883%; } .row-fluid .span3 { width: 22.928176794%; } .row-fluid .span4 { width: 31.491712705%; } .row-fluid .span5 { width: 40.055248616%; } .row-fluid .span6 { width: 48.618784527%; } .row-fluid .span7 { width: 57.182320438000005%; } .row-fluid .span8 { width: 65.74585634900001%; } .row-fluid .span9 { width: 74.30939226%; } .row-fluid .span10 { width: 82.87292817100001%; } .row-fluid .span11 { width: 91.436464082%; } .row-fluid .span12 { width: 99.999999993%; } input.span1, textarea.span1, .uneditable-input.span1 { width: 32px; } input.span2, textarea.span2, .uneditable-input.span2 { width: 94px; } input.span3, textarea.span3, .uneditable-input.span3 { width: 156px; } input.span4, textarea.span4, .uneditable-input.span4 { width: 218px; } input.span5, textarea.span5, .uneditable-input.span5 { width: 280px; } input.span6, textarea.span6, .uneditable-input.span6 { width: 342px; } input.span7, textarea.span7, .uneditable-input.span7 { width: 404px; } input.span8, textarea.span8, .uneditable-input.span8 { width: 466px; } input.span9, textarea.span9, .uneditable-input.span9 { width: 528px; } input.span10, textarea.span10, .uneditable-input.span10 { width: 590px; } input.span11, textarea.span11, .uneditable-input.span11 { width: 652px; } input.span12, textarea.span12, .uneditable-input.span12 { width: 714px; } } @media (max-width: 980px) { body { padding-top: 0; } .navbar-fixed-top { position: static; margin-bottom: 18px; } .navbar-fixed-top .navbar-inner { padding: 5px; } .navbar .container { width: auto; padding: 0; } .navbar .brand { padding-left: 10px; padding-right: 10px; margin: 0 0 0 -5px; } .navbar .nav-collapse { clear: left; } .navbar .nav { float: none; margin: 0 0 9px; } .navbar .nav > li { float: none; } .navbar .nav > li > a { margin-bottom: 2px; } .navbar .nav > .divider-vertical { display: none; } .navbar .nav > li > a, .navbar .dropdown-menu a { padding: 6px 15px; font-weight: bold; color: #999999; -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; } .navbar .dropdown-menu li + li a { margin-bottom: 2px; } .navbar .nav > li > a:hover, .navbar .dropdown-menu a:hover { background-color: #222222; } .navbar .dropdown-menu { position: static; top: auto; left: auto; float: none; display: block; max-width: none; margin: 0 15px; padding: 0; background-color: transparent; border: none; -webkit-border-radius: 0; -moz-border-radius: 0; border-radius: 0; -webkit-box-shadow: none; -moz-box-shadow: none; box-shadow: none; } .navbar .dropdown-menu:before, .navbar .dropdown-menu:after { display: none; } .navbar .dropdown-menu .divider { display: none; } .navbar-form, .navbar-search { float: none; padding: 9px 15px; margin: 9px 0; border-top: 1px solid #222222; border-bottom: 1px solid #222222; -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); } .navbar .nav.pull-right { float: none; margin-left: 0; } .navbar-static .navbar-inner { padding-left: 10px; padding-right: 10px; } .btn-navbar { display: block; } .nav-collapse { overflow: hidden; height: 0; } } @media (min-width: 980px) { .nav-collapse.collapse { height: auto !important; } } @media (min-width: 1200px) { .row { margin-left: -30px; *zoom: 1; } .row:before, .row:after { display: table; content: ""; } .row:after { clear: both; } [class*="span"] { float: left; margin-left: 30px; } .span1 { width: 70px; } .span2 { width: 170px; } .span3 { width: 270px; } .span4 { width: 370px; } .span5 { width: 470px; } .span6 { width: 570px; } .span7 { width: 670px; } .span8 { width: 770px; } .span9 { width: 870px; } .span10 { width: 970px; } .span11 { width: 1070px; } .span12, .container { width: 1170px; } .offset1 { margin-left: 130px; } .offset2 { margin-left: 230px; } .offset3 { margin-left: 330px; } .offset4 { margin-left: 430px; } .offset5 { margin-left: 530px; } .offset6 { margin-left: 630px; } .offset7 { margin-left: 730px; } .offset8 { margin-left: 830px; } .offset9 { margin-left: 930px; } .offset10 { margin-left: 1030px; } .offset11 { margin-left: 1130px; } .row-fluid { width: 100%; *zoom: 1; } .row-fluid:before, .row-fluid:after { display: table; content: ""; } .row-fluid:after { clear: both; } .row-fluid > [class*="span"] { float: left; margin-left: 2.564102564%; } .row-fluid > [class*="span"]:first-child { margin-left: 0; } .row-fluid .span1 { width: 5.982905983%; } .row-fluid .span2 { width: 14.529914530000001%; } .row-fluid .span3 { width: 23.076923077%; } .row-fluid .span4 { width: 31.623931624%; } .row-fluid .span5 { width: 40.170940171000005%; } .row-fluid .span6 { width: 48.717948718%; } .row-fluid .span7 { width: 57.264957265%; } .row-fluid .span8 { width: 65.81196581200001%; } .row-fluid .span9 { width: 74.358974359%; } .row-fluid .span10 { width: 82.905982906%; } .row-fluid .span11 { width: 91.45299145300001%; } .row-fluid .span12 { width: 100%; } input.span1, textarea.span1, .uneditable-input.span1 { width: 60px; } input.span2, textarea.span2, .uneditable-input.span2 { width: 160px; } input.span3, textarea.span3, .uneditable-input.span3 { width: 260px; } input.span4, textarea.span4, .uneditable-input.span4 { width: 360px; } input.span5, textarea.span5, .uneditable-input.span5 { width: 460px; } input.span6, textarea.span6, .uneditable-input.span6 { width: 560px; } input.span7, textarea.span7, .uneditable-input.span7 { width: 660px; } input.span8, textarea.span8, .uneditable-input.span8 { width: 760px; } input.span9, textarea.span9, .uneditable-input.span9 { width: 860px; } input.span10, textarea.span10, .uneditable-input.span10 { width: 960px; } input.span11, textarea.span11, .uneditable-input.span11 { width: 1060px; } input.span12, textarea.span12, .uneditable-input.span12 { width: 1160px; } .thumbnails { margin-left: -30px; } .thumbnails > li { margin-left: 30px; } } flask-peewee-3.0.6/flask_peewee/static/css/bootstrap-responsive.min.css000066400000000000000000000362711460575705200263310ustar00rootroot00000000000000/*! * Bootstrap Responsive v2.1.0 * * Copyright 2012 Twitter, Inc * Licensed under the Apache License v2.0 * http://www.apache.org/licenses/LICENSE-2.0 * * Designed and built with all the love in the world @twitter by @mdo and @fat. */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.hidden{display:none;visibility:hidden}.visible-phone{display:none!important}.visible-tablet{display:none!important}.hidden-desktop{display:none!important}.visible-desktop{display:inherit!important}@media(min-width:768px) and (max-width:979px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-tablet{display:inherit!important}.hidden-tablet{display:none!important}}@media(max-width:767px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-phone{display:inherit!important}.hidden-phone{display:none!important}}@media(min-width:1200px){.row{margin-left:-30px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;margin-left:30px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:1170px}.span12{width:1170px}.span11{width:1070px}.span10{width:970px}.span9{width:870px}.span8{width:770px}.span7{width:670px}.span6{width:570px}.span5{width:470px}.span4{width:370px}.span3{width:270px}.span2{width:170px}.span1{width:70px}.offset12{margin-left:1230px}.offset11{margin-left:1130px}.offset10{margin-left:1030px}.offset9{margin-left:930px}.offset8{margin-left:830px}.offset7{margin-left:730px}.offset6{margin-left:630px}.offset5{margin-left:530px}.offset4{margin-left:430px}.offset3{margin-left:330px}.offset2{margin-left:230px}.offset1{margin-left:130px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.564102564102564%;*margin-left:2.5109110747408616%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.45299145299145%;*width:91.39979996362975%}.row-fluid .span10{width:82.90598290598291%;*width:82.8527914166212%}.row-fluid .span9{width:74.35897435897436%;*width:74.30578286961266%}.row-fluid .span8{width:65.81196581196582%;*width:65.75877432260411%}.row-fluid .span7{width:57.26495726495726%;*width:57.21176577559556%}.row-fluid .span6{width:48.717948717948715%;*width:48.664757228587014%}.row-fluid .span5{width:40.17094017094017%;*width:40.11774868157847%}.row-fluid .span4{width:31.623931623931625%;*width:31.570740134569924%}.row-fluid .span3{width:23.076923076923077%;*width:23.023731587561375%}.row-fluid .span2{width:14.52991452991453%;*width:14.476723040552828%}.row-fluid .span1{width:5.982905982905983%;*width:5.929714493544281%}.row-fluid .offset12{margin-left:105.12820512820512%;*margin-left:105.02182214948171%}.row-fluid .offset12:first-child{margin-left:102.56410256410257%;*margin-left:102.45771958537915%}.row-fluid .offset11{margin-left:96.58119658119658%;*margin-left:96.47481360247316%}.row-fluid .offset11:first-child{margin-left:94.01709401709402%;*margin-left:93.91071103837061%}.row-fluid .offset10{margin-left:88.03418803418803%;*margin-left:87.92780505546462%}.row-fluid .offset10:first-child{margin-left:85.47008547008548%;*margin-left:85.36370249136206%}.row-fluid .offset9{margin-left:79.48717948717949%;*margin-left:79.38079650845607%}.row-fluid .offset9:first-child{margin-left:76.92307692307693%;*margin-left:76.81669394435352%}.row-fluid .offset8{margin-left:70.94017094017094%;*margin-left:70.83378796144753%}.row-fluid .offset8:first-child{margin-left:68.37606837606839%;*margin-left:68.26968539734497%}.row-fluid .offset7{margin-left:62.393162393162385%;*margin-left:62.28677941443899%}.row-fluid .offset7:first-child{margin-left:59.82905982905982%;*margin-left:59.72267685033642%}.row-fluid .offset6{margin-left:53.84615384615384%;*margin-left:53.739770867430444%}.row-fluid .offset6:first-child{margin-left:51.28205128205128%;*margin-left:51.175668303327875%}.row-fluid .offset5{margin-left:45.299145299145295%;*margin-left:45.1927623204219%}.row-fluid .offset5:first-child{margin-left:42.73504273504273%;*margin-left:42.62865975631933%}.row-fluid .offset4{margin-left:36.75213675213675%;*margin-left:36.645753773413354%}.row-fluid .offset4:first-child{margin-left:34.18803418803419%;*margin-left:34.081651209310785%}.row-fluid .offset3{margin-left:28.205128205128204%;*margin-left:28.0987452264048%}.row-fluid .offset3:first-child{margin-left:25.641025641025642%;*margin-left:25.53464266230224%}.row-fluid .offset2{margin-left:19.65811965811966%;*margin-left:19.551736679396257%}.row-fluid .offset2:first-child{margin-left:17.094017094017094%;*margin-left:16.98763411529369%}.row-fluid .offset1{margin-left:11.11111111111111%;*margin-left:11.004728132387708%}.row-fluid .offset1:first-child{margin-left:8.547008547008547%;*margin-left:8.440625568285142%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:30px}input.span12,textarea.span12,.uneditable-input.span12{width:1156px}input.span11,textarea.span11,.uneditable-input.span11{width:1056px}input.span10,textarea.span10,.uneditable-input.span10{width:956px}input.span9,textarea.span9,.uneditable-input.span9{width:856px}input.span8,textarea.span8,.uneditable-input.span8{width:756px}input.span7,textarea.span7,.uneditable-input.span7{width:656px}input.span6,textarea.span6,.uneditable-input.span6{width:556px}input.span5,textarea.span5,.uneditable-input.span5{width:456px}input.span4,textarea.span4,.uneditable-input.span4{width:356px}input.span3,textarea.span3,.uneditable-input.span3{width:256px}input.span2,textarea.span2,.uneditable-input.span2{width:156px}input.span1,textarea.span1,.uneditable-input.span1{width:56px}.thumbnails{margin-left:-30px}.thumbnails>li{margin-left:30px}.row-fluid .thumbnails{margin-left:0}}@media(min-width:768px) and (max-width:979px){.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:724px}.span12{width:724px}.span11{width:662px}.span10{width:600px}.span9{width:538px}.span8{width:476px}.span7{width:414px}.span6{width:352px}.span5{width:290px}.span4{width:228px}.span3{width:166px}.span2{width:104px}.span1{width:42px}.offset12{margin-left:764px}.offset11{margin-left:702px}.offset10{margin-left:640px}.offset9{margin-left:578px}.offset8{margin-left:516px}.offset7{margin-left:454px}.offset6{margin-left:392px}.offset5{margin-left:330px}.offset4{margin-left:268px}.offset3{margin-left:206px}.offset2{margin-left:144px}.offset1{margin-left:82px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.7624309392265194%;*margin-left:2.709239449864817%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.43646408839778%;*width:91.38327259903608%}.row-fluid .span10{width:82.87292817679558%;*width:82.81973668743387%}.row-fluid .span9{width:74.30939226519337%;*width:74.25620077583166%}.row-fluid .span8{width:65.74585635359117%;*width:65.69266486422946%}.row-fluid .span7{width:57.18232044198895%;*width:57.12912895262725%}.row-fluid .span6{width:48.61878453038674%;*width:48.56559304102504%}.row-fluid .span5{width:40.05524861878453%;*width:40.00205712942283%}.row-fluid .span4{width:31.491712707182323%;*width:31.43852121782062%}.row-fluid .span3{width:22.92817679558011%;*width:22.87498530621841%}.row-fluid .span2{width:14.3646408839779%;*width:14.311449394616199%}.row-fluid .span1{width:5.801104972375691%;*width:5.747913483013988%}.row-fluid .offset12{margin-left:105.52486187845304%;*margin-left:105.41847889972962%}.row-fluid .offset12:first-child{margin-left:102.76243093922652%;*margin-left:102.6560479605031%}.row-fluid .offset11{margin-left:96.96132596685082%;*margin-left:96.8549429881274%}.row-fluid .offset11:first-child{margin-left:94.1988950276243%;*margin-left:94.09251204890089%}.row-fluid .offset10{margin-left:88.39779005524862%;*margin-left:88.2914070765252%}.row-fluid .offset10:first-child{margin-left:85.6353591160221%;*margin-left:85.52897613729868%}.row-fluid .offset9{margin-left:79.8342541436464%;*margin-left:79.72787116492299%}.row-fluid .offset9:first-child{margin-left:77.07182320441989%;*margin-left:76.96544022569647%}.row-fluid .offset8{margin-left:71.2707182320442%;*margin-left:71.16433525332079%}.row-fluid .offset8:first-child{margin-left:68.50828729281768%;*margin-left:68.40190431409427%}.row-fluid .offset7{margin-left:62.70718232044199%;*margin-left:62.600799341718584%}.row-fluid .offset7:first-child{margin-left:59.94475138121547%;*margin-left:59.838368402492065%}.row-fluid .offset6{margin-left:54.14364640883978%;*margin-left:54.037263430116376%}.row-fluid .offset6:first-child{margin-left:51.38121546961326%;*margin-left:51.27483249088986%}.row-fluid .offset5{margin-left:45.58011049723757%;*margin-left:45.47372751851417%}.row-fluid .offset5:first-child{margin-left:42.81767955801105%;*margin-left:42.71129657928765%}.row-fluid .offset4{margin-left:37.01657458563536%;*margin-left:36.91019160691196%}.row-fluid .offset4:first-child{margin-left:34.25414364640884%;*margin-left:34.14776066768544%}.row-fluid .offset3{margin-left:28.45303867403315%;*margin-left:28.346655695309746%}.row-fluid .offset3:first-child{margin-left:25.69060773480663%;*margin-left:25.584224756083227%}.row-fluid .offset2{margin-left:19.88950276243094%;*margin-left:19.783119783707537%}.row-fluid .offset2:first-child{margin-left:17.12707182320442%;*margin-left:17.02068884448102%}.row-fluid .offset1{margin-left:11.32596685082873%;*margin-left:11.219583872105325%}.row-fluid .offset1:first-child{margin-left:8.56353591160221%;*margin-left:8.457152932878806%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:710px}input.span11,textarea.span11,.uneditable-input.span11{width:648px}input.span10,textarea.span10,.uneditable-input.span10{width:586px}input.span9,textarea.span9,.uneditable-input.span9{width:524px}input.span8,textarea.span8,.uneditable-input.span8{width:462px}input.span7,textarea.span7,.uneditable-input.span7{width:400px}input.span6,textarea.span6,.uneditable-input.span6{width:338px}input.span5,textarea.span5,.uneditable-input.span5{width:276px}input.span4,textarea.span4,.uneditable-input.span4{width:214px}input.span3,textarea.span3,.uneditable-input.span3{width:152px}input.span2,textarea.span2,.uneditable-input.span2{width:90px}input.span1,textarea.span1,.uneditable-input.span1{width:28px}}@media(max-width:767px){body{padding-right:20px;padding-left:20px}.navbar-fixed-top,.navbar-fixed-bottom{margin-right:-20px;margin-left:-20px}.container-fluid{padding:0}.dl-horizontal dt{float:none;width:auto;clear:none;text-align:left}.dl-horizontal dd{margin-left:0}.container{width:auto}.row-fluid{width:100%}.row,.thumbnails{margin-left:0}.thumbnails>li{float:none;margin-left:0}[class*="span"],.row-fluid [class*="span"]{display:block;float:none;width:auto;margin-left:0}.span12,.row-fluid .span12{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.input-large,.input-xlarge,.input-xxlarge,input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.input-prepend input,.input-append input,.input-prepend input[class*="span"],.input-append input[class*="span"]{display:inline-block;width:auto}.modal{position:fixed;top:20px;right:20px;left:20px;width:auto;margin:0}.modal.fade.in{top:auto}}@media(max-width:480px){.nav-collapse{-webkit-transform:translate3d(0,0,0)}.page-header h1 small{display:block;line-height:20px}input[type="checkbox"],input[type="radio"]{border:1px solid #ccc}.form-horizontal .control-group>label{float:none;width:auto;padding-top:0;text-align:left}.form-horizontal .controls{margin-left:0}.form-horizontal .control-list{padding-top:0}.form-horizontal .form-actions{padding-right:10px;padding-left:10px}.modal{top:10px;right:10px;left:10px}.modal-header .close{padding:10px;margin:-10px}.carousel-caption{position:static}}@media(max-width:979px){body{padding-top:0}.navbar-fixed-top,.navbar-fixed-bottom{position:static}.navbar-fixed-top{margin-bottom:20px}.navbar-fixed-bottom{margin-top:20px}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding:5px}.navbar .container{width:auto;padding:0}.navbar .brand{padding-right:10px;padding-left:10px;margin:0 0 0 -5px}.nav-collapse{clear:both}.nav-collapse .nav{float:none;margin:0 0 10px}.nav-collapse .nav>li{float:none}.nav-collapse .nav>li>a{margin-bottom:2px}.nav-collapse .nav>.divider-vertical{display:none}.nav-collapse .nav .nav-header{color:#555;text-shadow:none}.nav-collapse .nav>li>a,.nav-collapse .dropdown-menu a{padding:9px 15px;font-weight:bold;color:#555;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.nav-collapse .btn{padding:4px 10px 4px;font-weight:normal;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.nav-collapse .dropdown-menu li+li a{margin-bottom:2px}.nav-collapse .nav>li>a:hover,.nav-collapse .dropdown-menu a:hover{background-color:#f2f2f2}.navbar-inverse .nav-collapse .nav>li>a:hover,.navbar-inverse .nav-collapse .dropdown-menu a:hover{background-color:#111}.nav-collapse.in .btn-group{padding:0;margin-top:5px}.nav-collapse .dropdown-menu{position:static;top:auto;left:auto;display:block;float:none;max-width:none;padding:0;margin:0 15px;background-color:transparent;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.nav-collapse .dropdown-menu:before,.nav-collapse .dropdown-menu:after{display:none}.nav-collapse .dropdown-menu .divider{display:none}.nav-collapse .navbar-form,.nav-collapse .navbar-search{float:none;padding:10px 15px;margin:10px 0;border-top:1px solid #f2f2f2;border-bottom:1px solid #f2f2f2;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}.navbar .nav-collapse .nav.pull-right{float:none;margin-left:0}.nav-collapse,.nav-collapse.collapse{height:0;overflow:hidden}.navbar .btn-navbar{display:block}.navbar-static .navbar-inner{padding-right:10px;padding-left:10px}}@media(min-width:980px){.nav-collapse.collapse{height:auto!important;overflow:visible!important}} flask-peewee-3.0.6/flask_peewee/static/css/bootstrap.css000066400000000000000000002647271460575705200233650ustar00rootroot00000000000000/*! * Bootstrap v2.0.2 * * Copyright 2012 Twitter, Inc * Licensed under the Apache License v2.0 * http://www.apache.org/licenses/LICENSE-2.0 * * Designed and built with all the love in the world @twitter by @mdo and @fat. */ article, aside, details, figcaption, figure, footer, header, hgroup, nav, section { display: block; } audio, canvas, video { display: inline-block; *display: inline; *zoom: 1; } audio:not([controls]) { display: none; } html { font-size: 100%; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; } a:focus { outline: thin dotted #333; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } a:hover, a:active { outline: 0; } sub, sup { position: relative; font-size: 75%; line-height: 0; vertical-align: baseline; } sup { top: -0.5em; } sub { bottom: -0.25em; } img { height: auto; border: 0; -ms-interpolation-mode: bicubic; vertical-align: middle; } button, input, select, textarea { margin: 0; font-size: 100%; vertical-align: middle; } button, input { *overflow: visible; line-height: normal; } button::-moz-focus-inner, input::-moz-focus-inner { padding: 0; border: 0; } button, input[type="button"], input[type="reset"], input[type="submit"] { cursor: pointer; -webkit-appearance: button; } input[type="search"] { -webkit-appearance: textfield; -webkit-box-sizing: content-box; -moz-box-sizing: content-box; box-sizing: content-box; } input[type="search"]::-webkit-search-decoration, input[type="search"]::-webkit-search-cancel-button { -webkit-appearance: none; } textarea { overflow: auto; vertical-align: top; } .clearfix { *zoom: 1; } .clearfix:before, .clearfix:after { display: table; content: ""; } .clearfix:after { clear: both; } .hide-text { overflow: hidden; text-indent: 100%; white-space: nowrap; } .input-block-level { display: block; width: 100%; min-height: 28px; /* Make inputs at least the height of their button counterpart */ /* Makes inputs behave like true block-level elements */ -webkit-box-sizing: border-box; -moz-box-sizing: border-box; -ms-box-sizing: border-box; box-sizing: border-box; } body { margin: 0; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 13px; line-height: 18px; color: #333333; background-color: #ffffff; } a { color: #0088cc; text-decoration: none; } a:hover { color: #005580; text-decoration: underline; } .row { margin-left: -20px; *zoom: 1; } .row:before, .row:after { display: table; content: ""; } .row:after { clear: both; } [class*="span"] { float: left; margin-left: 20px; } .container, .navbar-fixed-top .container, .navbar-fixed-bottom .container { width: 940px; } .span12 { width: 940px; } .span11 { width: 860px; } .span10 { width: 780px; } .span9 { width: 700px; } .span8 { width: 620px; } .span7 { width: 540px; } .span6 { width: 460px; } .span5 { width: 380px; } .span4 { width: 300px; } .span3 { width: 220px; } .span2 { width: 140px; } .span1 { width: 60px; } .offset12 { margin-left: 980px; } .offset11 { margin-left: 900px; } .offset10 { margin-left: 820px; } .offset9 { margin-left: 740px; } .offset8 { margin-left: 660px; } .offset7 { margin-left: 580px; } .offset6 { margin-left: 500px; } .offset5 { margin-left: 420px; } .offset4 { margin-left: 340px; } .offset3 { margin-left: 260px; } .offset2 { margin-left: 180px; } .offset1 { margin-left: 100px; } .row-fluid { width: 100%; *zoom: 1; } .row-fluid:before, .row-fluid:after { display: table; content: ""; } .row-fluid:after { clear: both; } .row-fluid > [class*="span"] { float: left; margin-left: 2.127659574%; } .row-fluid > [class*="span"]:first-child { margin-left: 0; } .row-fluid > .span12 { width: 99.99999998999999%; } .row-fluid > .span11 { width: 91.489361693%; } .row-fluid > .span10 { width: 82.97872339599999%; } .row-fluid > .span9 { width: 74.468085099%; } .row-fluid > .span8 { width: 65.95744680199999%; } .row-fluid > .span7 { width: 57.446808505%; } .row-fluid > .span6 { width: 48.93617020799999%; } .row-fluid > .span5 { width: 40.425531911%; } .row-fluid > .span4 { width: 31.914893614%; } .row-fluid > .span3 { width: 23.404255317%; } .row-fluid > .span2 { width: 14.89361702%; } .row-fluid > .span1 { width: 6.382978723%; } .container { margin-left: auto; margin-right: auto; *zoom: 1; } .container:before, .container:after { display: table; content: ""; } .container:after { clear: both; } .container-fluid { padding-left: 20px; padding-right: 20px; *zoom: 1; } .container-fluid:before, .container-fluid:after { display: table; content: ""; } .container-fluid:after { clear: both; } p { margin: 0 0 9px; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 13px; line-height: 18px; } p small { font-size: 11px; color: #999999; } .lead { margin-bottom: 18px; font-size: 20px; font-weight: 200; line-height: 27px; } h1, h2, h3, h4, h5, h6 { margin: 0; font-family: inherit; font-weight: bold; color: inherit; text-rendering: optimizelegibility; } h1 small, h2 small, h3 small, h4 small, h5 small, h6 small { font-weight: normal; color: #999999; } h1 { font-size: 30px; line-height: 36px; } h1 small { font-size: 18px; } h2 { font-size: 24px; line-height: 36px; } h2 small { font-size: 18px; } h3 { line-height: 27px; font-size: 18px; } h3 small { font-size: 14px; } h4, h5, h6 { line-height: 18px; } h4 { font-size: 14px; } h4 small { font-size: 12px; } h5 { font-size: 12px; } h6 { font-size: 11px; color: #999999; text-transform: uppercase; } .page-header { padding-bottom: 17px; margin: 18px 0; border-bottom: 1px solid #eeeeee; } .page-header h1 { line-height: 1; } ul, ol { padding: 0; margin: 0 0 9px 25px; } ul ul, ul ol, ol ol, ol ul { margin-bottom: 0; } ul { list-style: disc; } ol { list-style: decimal; } li { line-height: 18px; } ul.unstyled, ol.unstyled { margin-left: 0; list-style: none; } dl { margin-bottom: 18px; } dt, dd { line-height: 18px; } dt { font-weight: bold; line-height: 17px; } dd { margin-left: 9px; } .dl-horizontal dt { float: left; clear: left; width: 120px; text-align: right; } .dl-horizontal dd { margin-left: 130px; } hr { margin: 18px 0; border: 0; border-top: 1px solid #eeeeee; border-bottom: 1px solid #ffffff; } strong { font-weight: bold; } em { font-style: italic; } .muted { color: #999999; } abbr[title] { border-bottom: 1px dotted #ddd; cursor: help; } abbr.initialism { font-size: 90%; text-transform: uppercase; } blockquote { padding: 0 0 0 15px; margin: 0 0 18px; border-left: 5px solid #eeeeee; } blockquote p { margin-bottom: 0; font-size: 16px; font-weight: 300; line-height: 22.5px; } blockquote small { display: block; line-height: 18px; color: #999999; } blockquote small:before { content: '\2014 \00A0'; } blockquote.pull-right { float: right; padding-left: 0; padding-right: 15px; border-left: 0; border-right: 5px solid #eeeeee; } blockquote.pull-right p, blockquote.pull-right small { text-align: right; } q:before, q:after, blockquote:before, blockquote:after { content: ""; } address { display: block; margin-bottom: 18px; line-height: 18px; font-style: normal; } small { font-size: 100%; } cite { font-style: normal; } code, pre { padding: 0 3px 2px; font-family: Menlo, Monaco, "Courier New", monospace; font-size: 12px; color: #333333; -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; } code { padding: 2px 4px; color: #d14; background-color: #f7f7f9; border: 1px solid #e1e1e8; } pre { display: block; padding: 8.5px; margin: 0 0 9px; font-size: 12.025px; line-height: 18px; background-color: #f5f5f5; border: 1px solid #ccc; border: 1px solid rgba(0, 0, 0, 0.15); -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; white-space: pre; white-space: pre-wrap; word-break: break-all; word-wrap: break-word; } pre.prettyprint { margin-bottom: 18px; } pre code { padding: 0; color: inherit; background-color: transparent; border: 0; } .pre-scrollable { max-height: 340px; overflow-y: scroll; } form { margin: 0 0 18px; } fieldset { padding: 0; margin: 0; border: 0; } legend { display: block; width: 100%; padding: 0; margin-bottom: 27px; font-size: 19.5px; line-height: 36px; color: #333333; border: 0; border-bottom: 1px solid #eee; } legend small { font-size: 13.5px; color: #999999; } label, input, button, select, textarea { font-size: 13px; font-weight: normal; line-height: 18px; } input, button, select, textarea { font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; } label { display: block; margin-bottom: 5px; color: #333333; } input, textarea, select, .uneditable-input { display: inline-block; width: 210px; height: 18px; padding: 4px; margin-bottom: 9px; font-size: 13px; line-height: 18px; color: #555555; border: 1px solid #cccccc; -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; } .uneditable-textarea { width: auto; height: auto; } label input, label textarea, label select { display: block; } input[type="image"], input[type="checkbox"], input[type="radio"] { width: auto; height: auto; padding: 0; margin: 3px 0; *margin-top: 0; /* IE7 */ line-height: normal; cursor: pointer; -webkit-border-radius: 0; -moz-border-radius: 0; border-radius: 0; border: 0 \9; /* IE9 and down */ } input[type="image"] { border: 0; } input[type="file"] { width: auto; padding: initial; line-height: initial; border: initial; background-color: #ffffff; background-color: initial; -webkit-box-shadow: none; -moz-box-shadow: none; box-shadow: none; } input[type="button"], input[type="reset"], input[type="submit"] { width: auto; height: auto; } select, input[type="file"] { height: 28px; /* In IE7, the height of the select element cannot be changed by height, only font-size */ *margin-top: 4px; /* For IE7, add top margin to align select with labels */ line-height: 28px; } input[type="file"] { line-height: 18px \9; } select { width: 220px; background-color: #ffffff; } select[multiple], select[size] { height: auto; } input[type="image"] { -webkit-box-shadow: none; -moz-box-shadow: none; box-shadow: none; } textarea { height: auto; } input[type="hidden"] { display: none; } .radio, .checkbox { padding-left: 18px; } .radio input[type="radio"], .checkbox input[type="checkbox"] { float: left; margin-left: -18px; } .controls > .radio:first-child, .controls > .checkbox:first-child { padding-top: 5px; } .radio.inline, .checkbox.inline { display: inline-block; padding-top: 5px; margin-bottom: 0; vertical-align: middle; } .radio.inline + .radio.inline, .checkbox.inline + .checkbox.inline { margin-left: 10px; } input, textarea { -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; -moz-transition: border linear 0.2s, box-shadow linear 0.2s; -ms-transition: border linear 0.2s, box-shadow linear 0.2s; -o-transition: border linear 0.2s, box-shadow linear 0.2s; transition: border linear 0.2s, box-shadow linear 0.2s; } input:focus, textarea:focus { border-color: rgba(82, 168, 236, 0.8); -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); outline: 0; outline: thin dotted \9; /* IE6-9 */ } input[type="file"]:focus, input[type="radio"]:focus, input[type="checkbox"]:focus, select:focus { -webkit-box-shadow: none; -moz-box-shadow: none; box-shadow: none; outline: thin dotted #333; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } .input-mini { width: 60px; } .input-small { width: 90px; } .input-medium { width: 150px; } .input-large { width: 210px; } .input-xlarge { width: 270px; } .input-xxlarge { width: 530px; } input[class*="span"], select[class*="span"], textarea[class*="span"], .uneditable-input { float: none; margin-left: 0; } input, textarea, .uneditable-input { margin-left: 0; } input.span12, textarea.span12, .uneditable-input.span12 { width: 930px; } input.span11, textarea.span11, .uneditable-input.span11 { width: 850px; } input.span10, textarea.span10, .uneditable-input.span10 { width: 770px; } input.span9, textarea.span9, .uneditable-input.span9 { width: 690px; } input.span8, textarea.span8, .uneditable-input.span8 { width: 610px; } input.span7, textarea.span7, .uneditable-input.span7 { width: 530px; } input.span6, textarea.span6, .uneditable-input.span6 { width: 450px; } input.span5, textarea.span5, .uneditable-input.span5 { width: 370px; } input.span4, textarea.span4, .uneditable-input.span4 { width: 290px; } input.span3, textarea.span3, .uneditable-input.span3 { width: 210px; } input.span2, textarea.span2, .uneditable-input.span2 { width: 130px; } input.span1, textarea.span1, .uneditable-input.span1 { width: 50px; } input[disabled], select[disabled], textarea[disabled], input[readonly], select[readonly], textarea[readonly] { background-color: #eeeeee; border-color: #ddd; cursor: not-allowed; } .control-group.warning > label, .control-group.warning .help-block, .control-group.warning .help-inline { color: #c09853; } .control-group.warning input, .control-group.warning select, .control-group.warning textarea { color: #c09853; border-color: #c09853; } .control-group.warning input:focus, .control-group.warning select:focus, .control-group.warning textarea:focus { border-color: #a47e3c; -webkit-box-shadow: 0 0 6px #dbc59e; -moz-box-shadow: 0 0 6px #dbc59e; box-shadow: 0 0 6px #dbc59e; } .control-group.warning .input-prepend .add-on, .control-group.warning .input-append .add-on { color: #c09853; background-color: #fcf8e3; border-color: #c09853; } .control-group.error > label, .control-group.error .help-block, .control-group.error .help-inline { color: #b94a48; } .control-group.error input, .control-group.error select, .control-group.error textarea { color: #b94a48; border-color: #b94a48; } .control-group.error input:focus, .control-group.error select:focus, .control-group.error textarea:focus { border-color: #953b39; -webkit-box-shadow: 0 0 6px #d59392; -moz-box-shadow: 0 0 6px #d59392; box-shadow: 0 0 6px #d59392; } .control-group.error .input-prepend .add-on, .control-group.error .input-append .add-on { color: #b94a48; background-color: #f2dede; border-color: #b94a48; } .control-group.success > label, .control-group.success .help-block, .control-group.success .help-inline { color: #468847; } .control-group.success input, .control-group.success select, .control-group.success textarea { color: #468847; border-color: #468847; } .control-group.success input:focus, .control-group.success select:focus, .control-group.success textarea:focus { border-color: #356635; -webkit-box-shadow: 0 0 6px #7aba7b; -moz-box-shadow: 0 0 6px #7aba7b; box-shadow: 0 0 6px #7aba7b; } .control-group.success .input-prepend .add-on, .control-group.success .input-append .add-on { color: #468847; background-color: #dff0d8; border-color: #468847; } input:focus:required:invalid, textarea:focus:required:invalid, select:focus:required:invalid { color: #b94a48; border-color: #ee5f5b; } input:focus:required:invalid:focus, textarea:focus:required:invalid:focus, select:focus:required:invalid:focus { border-color: #e9322d; -webkit-box-shadow: 0 0 6px #f8b9b7; -moz-box-shadow: 0 0 6px #f8b9b7; box-shadow: 0 0 6px #f8b9b7; } .form-actions { padding: 17px 20px 18px; margin-top: 18px; margin-bottom: 18px; background-color: #eeeeee; border-top: 1px solid #ddd; *zoom: 1; } .form-actions:before, .form-actions:after { display: table; content: ""; } .form-actions:after { clear: both; } .uneditable-input { display: block; background-color: #ffffff; border-color: #eee; -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); cursor: not-allowed; } :-moz-placeholder { color: #999999; } ::-webkit-input-placeholder { color: #999999; } .help-block, .help-inline { color: #555555; } .help-block { display: block; margin-bottom: 9px; } .help-inline { display: inline-block; *display: inline; /* IE7 inline-block hack */ *zoom: 1; vertical-align: middle; padding-left: 5px; } .input-prepend, .input-append { margin-bottom: 5px; } .input-prepend input, .input-append input, .input-prepend select, .input-append select, .input-prepend .uneditable-input, .input-append .uneditable-input { *margin-left: 0; -webkit-border-radius: 0 3px 3px 0; -moz-border-radius: 0 3px 3px 0; border-radius: 0 3px 3px 0; } .input-prepend input:focus, .input-append input:focus, .input-prepend select:focus, .input-append select:focus, .input-prepend .uneditable-input:focus, .input-append .uneditable-input:focus { position: relative; z-index: 2; } .input-prepend .uneditable-input, .input-append .uneditable-input { border-left-color: #ccc; } .input-prepend .add-on, .input-append .add-on { display: inline-block; width: auto; min-width: 16px; height: 18px; padding: 4px 5px; font-weight: normal; line-height: 18px; text-align: center; text-shadow: 0 1px 0 #ffffff; vertical-align: middle; background-color: #eeeeee; border: 1px solid #ccc; } .input-prepend .add-on, .input-append .add-on, .input-prepend .btn, .input-append .btn { -webkit-border-radius: 3px 0 0 3px; -moz-border-radius: 3px 0 0 3px; border-radius: 3px 0 0 3px; } .input-prepend .active, .input-append .active { background-color: #a9dba9; border-color: #46a546; } .input-prepend .add-on, .input-prepend .btn { margin-right: -1px; } .input-append input, .input-append select .uneditable-input { -webkit-border-radius: 3px 0 0 3px; -moz-border-radius: 3px 0 0 3px; border-radius: 3px 0 0 3px; } .input-append .uneditable-input { border-left-color: #eee; border-right-color: #ccc; } .input-append .add-on, .input-append .btn { margin-left: -1px; -webkit-border-radius: 0 3px 3px 0; -moz-border-radius: 0 3px 3px 0; border-radius: 0 3px 3px 0; } .input-prepend.input-append input, .input-prepend.input-append select, .input-prepend.input-append .uneditable-input { -webkit-border-radius: 0; -moz-border-radius: 0; border-radius: 0; } .input-prepend.input-append .add-on:first-child, .input-prepend.input-append .btn:first-child { margin-right: -1px; -webkit-border-radius: 3px 0 0 3px; -moz-border-radius: 3px 0 0 3px; border-radius: 3px 0 0 3px; } .input-prepend.input-append .add-on:last-child, .input-prepend.input-append .btn:last-child { margin-left: -1px; -webkit-border-radius: 0 3px 3px 0; -moz-border-radius: 0 3px 3px 0; border-radius: 0 3px 3px 0; } .search-query { padding-left: 14px; padding-right: 14px; margin-bottom: 0; -webkit-border-radius: 14px; -moz-border-radius: 14px; border-radius: 14px; } .form-search input, .form-inline input, .form-horizontal input, .form-search textarea, .form-inline textarea, .form-horizontal textarea, .form-search select, .form-inline select, .form-horizontal select, .form-search .help-inline, .form-inline .help-inline, .form-horizontal .help-inline, .form-search .uneditable-input, .form-inline .uneditable-input, .form-horizontal .uneditable-input, .form-search .input-prepend, .form-inline .input-prepend, .form-horizontal .input-prepend, .form-search .input-append, .form-inline .input-append, .form-horizontal .input-append { display: inline-block; margin-bottom: 0; } .form-search .hide, .form-inline .hide, .form-horizontal .hide { display: none; } .form-search label, .form-inline label { display: inline-block; } .form-search .input-append, .form-inline .input-append, .form-search .input-prepend, .form-inline .input-prepend { margin-bottom: 0; } .form-search .radio, .form-search .checkbox, .form-inline .radio, .form-inline .checkbox { padding-left: 0; margin-bottom: 0; vertical-align: middle; } .form-search .radio input[type="radio"], .form-search .checkbox input[type="checkbox"], .form-inline .radio input[type="radio"], .form-inline .checkbox input[type="checkbox"] { float: left; margin-left: 0; margin-right: 3px; } .control-group { margin-bottom: 9px; } legend + .control-group { margin-top: 18px; -webkit-margin-top-collapse: separate; } .form-horizontal .control-group { margin-bottom: 18px; *zoom: 1; } .form-horizontal .control-group:before, .form-horizontal .control-group:after { display: table; content: ""; } .form-horizontal .control-group:after { clear: both; } .form-horizontal .control-label { float: left; width: 140px; padding-top: 5px; text-align: right; } .form-horizontal .controls { margin-left: 160px; /* Super jank IE7 fix to ensure the inputs in .input-append and input-prepend don't inherit the margin of the parent, in this case .controls */ *display: inline-block; *margin-left: 0; *padding-left: 20px; } .form-horizontal .help-block { margin-top: 9px; margin-bottom: 0; } .form-horizontal .form-actions { padding-left: 160px; } table { max-width: 100%; border-collapse: collapse; border-spacing: 0; background-color: transparent; } .table { width: 100%; margin-bottom: 18px; } .table th, .table td { padding: 8px; line-height: 18px; text-align: left; vertical-align: top; border-top: 1px solid #dddddd; } .table th { font-weight: bold; } .table thead th { vertical-align: bottom; } .table colgroup + thead tr:first-child th, .table colgroup + thead tr:first-child td, .table thead:first-child tr:first-child th, .table thead:first-child tr:first-child td { border-top: 0; } .table tbody + tbody { border-top: 2px solid #dddddd; } .table-condensed th, .table-condensed td { padding: 4px 5px; } .table-bordered { border: 1px solid #dddddd; border-left: 0; border-collapse: separate; *border-collapse: collapsed; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; } .table-bordered th, .table-bordered td { border-left: 1px solid #dddddd; } .table-bordered thead:first-child tr:first-child th, .table-bordered tbody:first-child tr:first-child th, .table-bordered tbody:first-child tr:first-child td { border-top: 0; } .table-bordered thead:first-child tr:first-child th:first-child, .table-bordered tbody:first-child tr:first-child td:first-child { -webkit-border-radius: 4px 0 0 0; -moz-border-radius: 4px 0 0 0; border-radius: 4px 0 0 0; } .table-bordered thead:first-child tr:first-child th:last-child, .table-bordered tbody:first-child tr:first-child td:last-child { -webkit-border-radius: 0 4px 0 0; -moz-border-radius: 0 4px 0 0; border-radius: 0 4px 0 0; } .table-bordered thead:last-child tr:last-child th:first-child, .table-bordered tbody:last-child tr:last-child td:first-child { -webkit-border-radius: 0 0 0 4px; -moz-border-radius: 0 0 0 4px; border-radius: 0 0 0 4px; } .table-bordered thead:last-child tr:last-child th:last-child, .table-bordered tbody:last-child tr:last-child td:last-child { -webkit-border-radius: 0 0 4px 0; -moz-border-radius: 0 0 4px 0; border-radius: 0 0 4px 0; } .table-striped tbody tr:nth-child(odd) td, .table-striped tbody tr:nth-child(odd) th { background-color: #f9f9f9; } .table tbody tr:hover td, .table tbody tr:hover th { background-color: #f5f5f5; } table .span1 { float: none; width: 44px; margin-left: 0; } table .span2 { float: none; width: 124px; margin-left: 0; } table .span3 { float: none; width: 204px; margin-left: 0; } table .span4 { float: none; width: 284px; margin-left: 0; } table .span5 { float: none; width: 364px; margin-left: 0; } table .span6 { float: none; width: 444px; margin-left: 0; } table .span7 { float: none; width: 524px; margin-left: 0; } table .span8 { float: none; width: 604px; margin-left: 0; } table .span9 { float: none; width: 684px; margin-left: 0; } table .span10 { float: none; width: 764px; margin-left: 0; } table .span11 { float: none; width: 844px; margin-left: 0; } table .span12 { float: none; width: 924px; margin-left: 0; } table .span13 { float: none; width: 1004px; margin-left: 0; } table .span14 { float: none; width: 1084px; margin-left: 0; } table .span15 { float: none; width: 1164px; margin-left: 0; } table .span16 { float: none; width: 1244px; margin-left: 0; } table .span17 { float: none; width: 1324px; margin-left: 0; } table .span18 { float: none; width: 1404px; margin-left: 0; } table .span19 { float: none; width: 1484px; margin-left: 0; } table .span20 { float: none; width: 1564px; margin-left: 0; } table .span21 { float: none; width: 1644px; margin-left: 0; } table .span22 { float: none; width: 1724px; margin-left: 0; } table .span23 { float: none; width: 1804px; margin-left: 0; } table .span24 { float: none; width: 1884px; margin-left: 0; } [class^="icon-"], [class*=" icon-"] { display: inline-block; width: 14px; height: 14px; line-height: 14px; vertical-align: text-top; background-image: url("../img/glyphicons-halflings.png"); background-position: 14px 14px; background-repeat: no-repeat; *margin-right: .3em; } [class^="icon-"]:last-child, [class*=" icon-"]:last-child { *margin-left: 0; } .icon-white { background-image: url("../img/glyphicons-halflings-white.png"); } .icon-glass { background-position: 0 0; } .icon-music { background-position: -24px 0; } .icon-search { background-position: -48px 0; } .icon-envelope { background-position: -72px 0; } .icon-heart { background-position: -96px 0; } .icon-star { background-position: -120px 0; } .icon-star-empty { background-position: -144px 0; } .icon-user { background-position: -168px 0; } .icon-film { background-position: -192px 0; } .icon-th-large { background-position: -216px 0; } .icon-th { background-position: -240px 0; } .icon-th-list { background-position: -264px 0; } .icon-ok { background-position: -288px 0; } .icon-remove { background-position: -312px 0; } .icon-zoom-in { background-position: -336px 0; } .icon-zoom-out { background-position: -360px 0; } .icon-off { background-position: -384px 0; } .icon-signal { background-position: -408px 0; } .icon-cog { background-position: -432px 0; } .icon-trash { background-position: -456px 0; } .icon-home { background-position: 0 -24px; } .icon-file { background-position: -24px -24px; } .icon-time { background-position: -48px -24px; } .icon-road { background-position: -72px -24px; } .icon-download-alt { background-position: -96px -24px; } .icon-download { background-position: -120px -24px; } .icon-upload { background-position: -144px -24px; } .icon-inbox { background-position: -168px -24px; } .icon-play-circle { background-position: -192px -24px; } .icon-repeat { background-position: -216px -24px; } .icon-refresh { background-position: -240px -24px; } .icon-list-alt { background-position: -264px -24px; } .icon-lock { background-position: -287px -24px; } .icon-flag { background-position: -312px -24px; } .icon-headphones { background-position: -336px -24px; } .icon-volume-off { background-position: -360px -24px; } .icon-volume-down { background-position: -384px -24px; } .icon-volume-up { background-position: -408px -24px; } .icon-qrcode { background-position: -432px -24px; } .icon-barcode { background-position: -456px -24px; } .icon-tag { background-position: 0 -48px; } .icon-tags { background-position: -25px -48px; } .icon-book { background-position: -48px -48px; } .icon-bookmark { background-position: -72px -48px; } .icon-print { background-position: -96px -48px; } .icon-camera { background-position: -120px -48px; } .icon-font { background-position: -144px -48px; } .icon-bold { background-position: -167px -48px; } .icon-italic { background-position: -192px -48px; } .icon-text-height { background-position: -216px -48px; } .icon-text-width { background-position: -240px -48px; } .icon-align-left { background-position: -264px -48px; } .icon-align-center { background-position: -288px -48px; } .icon-align-right { background-position: -312px -48px; } .icon-align-justify { background-position: -336px -48px; } .icon-list { background-position: -360px -48px; } .icon-indent-left { background-position: -384px -48px; } .icon-indent-right { background-position: -408px -48px; } .icon-facetime-video { background-position: -432px -48px; } .icon-picture { background-position: -456px -48px; } .icon-pencil { background-position: 0 -72px; } .icon-map-marker { background-position: -24px -72px; } .icon-adjust { background-position: -48px -72px; } .icon-tint { background-position: -72px -72px; } .icon-edit { background-position: -96px -72px; } .icon-share { background-position: -120px -72px; } .icon-check { background-position: -144px -72px; } .icon-move { background-position: -168px -72px; } .icon-step-backward { background-position: -192px -72px; } .icon-fast-backward { background-position: -216px -72px; } .icon-backward { background-position: -240px -72px; } .icon-play { background-position: -264px -72px; } .icon-pause { background-position: -288px -72px; } .icon-stop { background-position: -312px -72px; } .icon-forward { background-position: -336px -72px; } .icon-fast-forward { background-position: -360px -72px; } .icon-step-forward { background-position: -384px -72px; } .icon-eject { background-position: -408px -72px; } .icon-chevron-left { background-position: -432px -72px; } .icon-chevron-right { background-position: -456px -72px; } .icon-plus-sign { background-position: 0 -96px; } .icon-minus-sign { background-position: -24px -96px; } .icon-remove-sign { background-position: -48px -96px; } .icon-ok-sign { background-position: -72px -96px; } .icon-question-sign { background-position: -96px -96px; } .icon-info-sign { background-position: -120px -96px; } .icon-screenshot { background-position: -144px -96px; } .icon-remove-circle { background-position: -168px -96px; } .icon-ok-circle { background-position: -192px -96px; } .icon-ban-circle { background-position: -216px -96px; } .icon-arrow-left { background-position: -240px -96px; } .icon-arrow-right { background-position: -264px -96px; } .icon-arrow-up { background-position: -289px -96px; } .icon-arrow-down { background-position: -312px -96px; } .icon-share-alt { background-position: -336px -96px; } .icon-resize-full { background-position: -360px -96px; } .icon-resize-small { background-position: -384px -96px; } .icon-plus { background-position: -408px -96px; } .icon-minus { background-position: -433px -96px; } .icon-asterisk { background-position: -456px -96px; } .icon-exclamation-sign { background-position: 0 -120px; } .icon-gift { background-position: -24px -120px; } .icon-leaf { background-position: -48px -120px; } .icon-fire { background-position: -72px -120px; } .icon-eye-open { background-position: -96px -120px; } .icon-eye-close { background-position: -120px -120px; } .icon-warning-sign { background-position: -144px -120px; } .icon-plane { background-position: -168px -120px; } .icon-calendar { background-position: -192px -120px; } .icon-random { background-position: -216px -120px; } .icon-comment { background-position: -240px -120px; } .icon-magnet { background-position: -264px -120px; } .icon-chevron-up { background-position: -288px -120px; } .icon-chevron-down { background-position: -313px -119px; } .icon-retweet { background-position: -336px -120px; } .icon-shopping-cart { background-position: -360px -120px; } .icon-folder-close { background-position: -384px -120px; } .icon-folder-open { background-position: -408px -120px; } .icon-resize-vertical { background-position: -432px -119px; } .icon-resize-horizontal { background-position: -456px -118px; } .dropdown { position: relative; } .dropdown-toggle { *margin-bottom: -3px; } .dropdown-toggle:active, .open .dropdown-toggle { outline: 0; } .caret { display: inline-block; width: 0; height: 0; vertical-align: top; border-left: 4px solid transparent; border-right: 4px solid transparent; border-top: 4px solid #000000; opacity: 0.3; filter: alpha(opacity=30); content: ""; } .dropdown .caret { margin-top: 8px; margin-left: 2px; } .dropdown:hover .caret, .open.dropdown .caret { opacity: 1; filter: alpha(opacity=100); } .dropdown-menu { position: absolute; top: 100%; left: 0; z-index: 1000; float: left; display: none; min-width: 160px; padding: 4px 0; margin: 0; list-style: none; background-color: #ffffff; border-color: #ccc; border-color: rgba(0, 0, 0, 0.2); border-style: solid; border-width: 1px; -webkit-border-radius: 0 0 5px 5px; -moz-border-radius: 0 0 5px 5px; border-radius: 0 0 5px 5px; -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); -webkit-background-clip: padding-box; -moz-background-clip: padding; background-clip: padding-box; *border-right-width: 2px; *border-bottom-width: 2px; } .dropdown-menu.pull-right { right: 0; left: auto; } .dropdown-menu .divider { height: 1px; margin: 8px 1px; overflow: hidden; background-color: #e5e5e5; border-bottom: 1px solid #ffffff; *width: 100%; *margin: -5px 0 5px; } .dropdown-menu a { display: block; padding: 3px 15px; clear: both; font-weight: normal; line-height: 18px; color: #333333; white-space: nowrap; } .dropdown-menu li > a:hover, .dropdown-menu .active > a, .dropdown-menu .active > a:hover { color: #ffffff; text-decoration: none; background-color: #0088cc; } .dropdown.open { *z-index: 1000; } .dropdown.open .dropdown-toggle { color: #ffffff; background: #ccc; background: rgba(0, 0, 0, 0.3); } .dropdown.open .dropdown-menu { display: block; } .pull-right .dropdown-menu { left: auto; right: 0; } .dropup .caret, .navbar-fixed-bottom .dropdown .caret { border-top: 0; border-bottom: 4px solid #000000; content: "\2191"; } .dropup .dropdown-menu, .navbar-fixed-bottom .dropdown .dropdown-menu { top: auto; bottom: 100%; margin-bottom: 1px; } .typeahead { margin-top: 2px; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; } .well { min-height: 20px; padding: 19px; margin-bottom: 20px; background-color: #f5f5f5; border: 1px solid #eee; border: 1px solid rgba(0, 0, 0, 0.05); -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); } .well blockquote { border-color: #ddd; border-color: rgba(0, 0, 0, 0.15); } .well-large { padding: 24px; -webkit-border-radius: 6px; -moz-border-radius: 6px; border-radius: 6px; } .well-small { padding: 9px; -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; } .fade { -webkit-transition: opacity 0.15s linear; -moz-transition: opacity 0.15s linear; -ms-transition: opacity 0.15s linear; -o-transition: opacity 0.15s linear; transition: opacity 0.15s linear; opacity: 0; } .fade.in { opacity: 1; } .collapse { -webkit-transition: height 0.35s ease; -moz-transition: height 0.35s ease; -ms-transition: height 0.35s ease; -o-transition: height 0.35s ease; transition: height 0.35s ease; position: relative; overflow: hidden; height: 0; } .collapse.in { height: auto; } .close { float: right; font-size: 20px; font-weight: bold; line-height: 18px; color: #000000; text-shadow: 0 1px 0 #ffffff; opacity: 0.2; filter: alpha(opacity=20); } .close:hover { color: #000000; text-decoration: none; opacity: 0.4; filter: alpha(opacity=40); cursor: pointer; } .btn { display: inline-block; *display: inline; /* IE7 inline-block hack */ *zoom: 1; padding: 4px 10px 4px; margin-bottom: 0; font-size: 13px; line-height: 18px; color: #333333; text-align: center; text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); vertical-align: middle; background-color: #f5f5f5; background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); background-image: -ms-linear-gradient(top, #ffffff, #e6e6e6); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); background-image: linear-gradient(top, #ffffff, #e6e6e6); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0); border-color: #e6e6e6 #e6e6e6 #bfbfbf; border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); filter: progid:dximagetransform.microsoft.gradient(enabled=false); border: 1px solid #cccccc; border-bottom-color: #b3b3b3; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); cursor: pointer; *margin-left: .3em; } .btn:hover, .btn:active, .btn.active, .btn.disabled, .btn[disabled] { background-color: #e6e6e6; } .btn:active, .btn.active { background-color: #cccccc \9; } .btn:first-child { *margin-left: 0; } .btn:hover { color: #333333; text-decoration: none; background-color: #e6e6e6; background-position: 0 -15px; -webkit-transition: background-position 0.1s linear; -moz-transition: background-position 0.1s linear; -ms-transition: background-position 0.1s linear; -o-transition: background-position 0.1s linear; transition: background-position 0.1s linear; } .btn:focus { outline: thin dotted #333; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } .btn.active, .btn:active { background-image: none; -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); background-color: #e6e6e6; background-color: #d9d9d9 \9; outline: 0; } .btn.disabled, .btn[disabled] { cursor: default; background-image: none; background-color: #e6e6e6; opacity: 0.65; filter: alpha(opacity=65); -webkit-box-shadow: none; -moz-box-shadow: none; box-shadow: none; } .btn-large { padding: 9px 14px; font-size: 15px; line-height: normal; -webkit-border-radius: 5px; -moz-border-radius: 5px; border-radius: 5px; } .btn-large [class^="icon-"] { margin-top: 1px; } .btn-small { padding: 5px 9px; font-size: 11px; line-height: 16px; } .btn-small [class^="icon-"] { margin-top: -1px; } .btn-mini { padding: 2px 6px; font-size: 11px; line-height: 14px; } .btn-primary, .btn-primary:hover, .btn-warning, .btn-warning:hover, .btn-danger, .btn-danger:hover, .btn-success, .btn-success:hover, .btn-info, .btn-info:hover, .btn-inverse, .btn-inverse:hover { text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); color: #ffffff; } .btn-primary.active, .btn-warning.active, .btn-danger.active, .btn-success.active, .btn-info.active, .btn-inverse.active { color: rgba(255, 255, 255, 0.75); } .btn-primary { background-color: #0074cc; background-image: -moz-linear-gradient(top, #0088cc, #0055cc); background-image: -ms-linear-gradient(top, #0088cc, #0055cc); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0055cc)); background-image: -webkit-linear-gradient(top, #0088cc, #0055cc); background-image: -o-linear-gradient(top, #0088cc, #0055cc); background-image: linear-gradient(top, #0088cc, #0055cc); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0055cc', GradientType=0); border-color: #0055cc #0055cc #003580; border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); filter: progid:dximagetransform.microsoft.gradient(enabled=false); } .btn-primary:hover, .btn-primary:active, .btn-primary.active, .btn-primary.disabled, .btn-primary[disabled] { background-color: #0055cc; } .btn-primary:active, .btn-primary.active { background-color: #004099 \9; } .btn-warning { background-color: #faa732; background-image: -moz-linear-gradient(top, #fbb450, #f89406); background-image: -ms-linear-gradient(top, #fbb450, #f89406); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); background-image: -webkit-linear-gradient(top, #fbb450, #f89406); background-image: -o-linear-gradient(top, #fbb450, #f89406); background-image: linear-gradient(top, #fbb450, #f89406); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0); border-color: #f89406 #f89406 #ad6704; border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); filter: progid:dximagetransform.microsoft.gradient(enabled=false); } .btn-warning:hover, .btn-warning:active, .btn-warning.active, .btn-warning.disabled, .btn-warning[disabled] { background-color: #f89406; } .btn-warning:active, .btn-warning.active { background-color: #c67605 \9; } .btn-danger { background-color: #da4f49; background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f); background-image: -ms-linear-gradient(top, #ee5f5b, #bd362f); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f)); background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f); background-image: -o-linear-gradient(top, #ee5f5b, #bd362f); background-image: linear-gradient(top, #ee5f5b, #bd362f); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#bd362f', GradientType=0); border-color: #bd362f #bd362f #802420; border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); filter: progid:dximagetransform.microsoft.gradient(enabled=false); } .btn-danger:hover, .btn-danger:active, .btn-danger.active, .btn-danger.disabled, .btn-danger[disabled] { background-color: #bd362f; } .btn-danger:active, .btn-danger.active { background-color: #942a25 \9; } .btn-success { background-color: #5bb75b; background-image: -moz-linear-gradient(top, #62c462, #51a351); background-image: -ms-linear-gradient(top, #62c462, #51a351); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351)); background-image: -webkit-linear-gradient(top, #62c462, #51a351); background-image: -o-linear-gradient(top, #62c462, #51a351); background-image: linear-gradient(top, #62c462, #51a351); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#51a351', GradientType=0); border-color: #51a351 #51a351 #387038; border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); filter: progid:dximagetransform.microsoft.gradient(enabled=false); } .btn-success:hover, .btn-success:active, .btn-success.active, .btn-success.disabled, .btn-success[disabled] { background-color: #51a351; } .btn-success:active, .btn-success.active { background-color: #408140 \9; } .btn-info { background-color: #49afcd; background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4); background-image: -ms-linear-gradient(top, #5bc0de, #2f96b4); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4)); background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4); background-image: -o-linear-gradient(top, #5bc0de, #2f96b4); background-image: linear-gradient(top, #5bc0de, #2f96b4); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#2f96b4', GradientType=0); border-color: #2f96b4 #2f96b4 #1f6377; border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); filter: progid:dximagetransform.microsoft.gradient(enabled=false); } .btn-info:hover, .btn-info:active, .btn-info.active, .btn-info.disabled, .btn-info[disabled] { background-color: #2f96b4; } .btn-info:active, .btn-info.active { background-color: #24748c \9; } .btn-inverse { background-color: #414141; background-image: -moz-linear-gradient(top, #555555, #222222); background-image: -ms-linear-gradient(top, #555555, #222222); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#555555), to(#222222)); background-image: -webkit-linear-gradient(top, #555555, #222222); background-image: -o-linear-gradient(top, #555555, #222222); background-image: linear-gradient(top, #555555, #222222); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#555555', endColorstr='#222222', GradientType=0); border-color: #222222 #222222 #000000; border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); filter: progid:dximagetransform.microsoft.gradient(enabled=false); } .btn-inverse:hover, .btn-inverse:active, .btn-inverse.active, .btn-inverse.disabled, .btn-inverse[disabled] { background-color: #222222; } .btn-inverse:active, .btn-inverse.active { background-color: #080808 \9; } button.btn, input[type="submit"].btn { *padding-top: 2px; *padding-bottom: 2px; } button.btn::-moz-focus-inner, input[type="submit"].btn::-moz-focus-inner { padding: 0; border: 0; } button.btn.btn-large, input[type="submit"].btn.btn-large { *padding-top: 7px; *padding-bottom: 7px; } button.btn.btn-small, input[type="submit"].btn.btn-small { *padding-top: 3px; *padding-bottom: 3px; } button.btn.btn-mini, input[type="submit"].btn.btn-mini { *padding-top: 1px; *padding-bottom: 1px; } .btn-group { position: relative; *zoom: 1; *margin-left: .3em; } .btn-group:before, .btn-group:after { display: table; content: ""; } .btn-group:after { clear: both; } .btn-group:first-child { *margin-left: 0; } .btn-group + .btn-group { margin-left: 5px; } .btn-toolbar { margin-top: 9px; margin-bottom: 9px; } .btn-toolbar .btn-group { display: inline-block; *display: inline; /* IE7 inline-block hack */ *zoom: 1; } .btn-group .btn { position: relative; float: left; margin-left: -1px; -webkit-border-radius: 0; -moz-border-radius: 0; border-radius: 0; } .btn-group .btn:first-child { margin-left: 0; -webkit-border-top-left-radius: 4px; -moz-border-radius-topleft: 4px; border-top-left-radius: 4px; -webkit-border-bottom-left-radius: 4px; -moz-border-radius-bottomleft: 4px; border-bottom-left-radius: 4px; } .btn-group .btn:last-child, .btn-group .dropdown-toggle { -webkit-border-top-right-radius: 4px; -moz-border-radius-topright: 4px; border-top-right-radius: 4px; -webkit-border-bottom-right-radius: 4px; -moz-border-radius-bottomright: 4px; border-bottom-right-radius: 4px; } .btn-group .btn.large:first-child { margin-left: 0; -webkit-border-top-left-radius: 6px; -moz-border-radius-topleft: 6px; border-top-left-radius: 6px; -webkit-border-bottom-left-radius: 6px; -moz-border-radius-bottomleft: 6px; border-bottom-left-radius: 6px; } .btn-group .btn.large:last-child, .btn-group .large.dropdown-toggle { -webkit-border-top-right-radius: 6px; -moz-border-radius-topright: 6px; border-top-right-radius: 6px; -webkit-border-bottom-right-radius: 6px; -moz-border-radius-bottomright: 6px; border-bottom-right-radius: 6px; } .btn-group .btn:hover, .btn-group .btn:focus, .btn-group .btn:active, .btn-group .btn.active { z-index: 2; } .btn-group .dropdown-toggle:active, .btn-group.open .dropdown-toggle { outline: 0; } .btn-group .dropdown-toggle { padding-left: 8px; padding-right: 8px; -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); *padding-top: 3px; *padding-bottom: 3px; } .btn-group .btn-mini.dropdown-toggle { padding-left: 5px; padding-right: 5px; *padding-top: 1px; *padding-bottom: 1px; } .btn-group .btn-small.dropdown-toggle { *padding-top: 4px; *padding-bottom: 4px; } .btn-group .btn-large.dropdown-toggle { padding-left: 12px; padding-right: 12px; } .btn-group.open { *z-index: 1000; } .btn-group.open .dropdown-menu { display: block; margin-top: 1px; -webkit-border-radius: 5px; -moz-border-radius: 5px; border-radius: 5px; } .btn-group.open .dropdown-toggle { background-image: none; -webkit-box-shadow: inset 0 1px 6px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); -moz-box-shadow: inset 0 1px 6px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); box-shadow: inset 0 1px 6px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); } .btn .caret { margin-top: 7px; margin-left: 0; } .btn:hover .caret, .open.btn-group .caret { opacity: 1; filter: alpha(opacity=100); } .btn-mini .caret { margin-top: 5px; } .btn-small .caret { margin-top: 6px; } .btn-large .caret { margin-top: 6px; border-left: 5px solid transparent; border-right: 5px solid transparent; border-top: 5px solid #000000; } .btn-primary .caret, .btn-warning .caret, .btn-danger .caret, .btn-info .caret, .btn-success .caret, .btn-inverse .caret { border-top-color: #ffffff; border-bottom-color: #ffffff; opacity: 0.75; filter: alpha(opacity=75); } .alert { padding: 8px 35px 8px 14px; margin-bottom: 18px; text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); background-color: #fcf8e3; border: 1px solid #fbeed5; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; color: #c09853; } .alert-heading { color: inherit; } .alert .close { position: relative; top: -2px; right: -21px; line-height: 18px; } .alert-success { background-color: #dff0d8; border-color: #d6e9c6; color: #468847; } .alert-danger, .alert-error { background-color: #f2dede; border-color: #eed3d7; color: #b94a48; } .alert-info { background-color: #d9edf7; border-color: #bce8f1; color: #3a87ad; } .alert-block { padding-top: 14px; padding-bottom: 14px; } .alert-block > p, .alert-block > ul { margin-bottom: 0; } .alert-block p + p { margin-top: 5px; } .nav { margin-left: 0; margin-bottom: 18px; list-style: none; } .nav > li > a { display: block; } .nav > li > a:hover { text-decoration: none; background-color: #eeeeee; } .nav .nav-header { display: block; padding: 3px 15px; font-size: 11px; font-weight: bold; line-height: 18px; color: #999999; text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); text-transform: uppercase; } .nav li + .nav-header { margin-top: 9px; } .nav-list { padding-left: 15px; padding-right: 15px; margin-bottom: 0; } .nav-list > li > a, .nav-list .nav-header { margin-left: -15px; margin-right: -15px; text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); } .nav-list > li > a { padding: 3px 15px; } .nav-list > .active > a, .nav-list > .active > a:hover { color: #ffffff; text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); background-color: #0088cc; } .nav-list [class^="icon-"] { margin-right: 2px; } .nav-list .divider { height: 1px; margin: 8px 1px; overflow: hidden; background-color: #e5e5e5; border-bottom: 1px solid #ffffff; *width: 100%; *margin: -5px 0 5px; } .nav-tabs, .nav-pills { *zoom: 1; } .nav-tabs:before, .nav-pills:before, .nav-tabs:after, .nav-pills:after { display: table; content: ""; } .nav-tabs:after, .nav-pills:after { clear: both; } .nav-tabs > li, .nav-pills > li { float: left; } .nav-tabs > li > a, .nav-pills > li > a { padding-right: 12px; padding-left: 12px; margin-right: 2px; line-height: 14px; } .nav-tabs { border-bottom: 1px solid #ddd; } .nav-tabs > li { margin-bottom: -1px; } .nav-tabs > li > a { padding-top: 8px; padding-bottom: 8px; line-height: 18px; border: 1px solid transparent; -webkit-border-radius: 4px 4px 0 0; -moz-border-radius: 4px 4px 0 0; border-radius: 4px 4px 0 0; } .nav-tabs > li > a:hover { border-color: #eeeeee #eeeeee #dddddd; } .nav-tabs > .active > a, .nav-tabs > .active > a:hover { color: #555555; background-color: #ffffff; border: 1px solid #ddd; border-bottom-color: transparent; cursor: default; } .nav-pills > li > a { padding-top: 8px; padding-bottom: 8px; margin-top: 2px; margin-bottom: 2px; -webkit-border-radius: 5px; -moz-border-radius: 5px; border-radius: 5px; } .nav-pills > .active > a, .nav-pills > .active > a:hover { color: #ffffff; background-color: #0088cc; } .nav-stacked > li { float: none; } .nav-stacked > li > a { margin-right: 0; } .nav-tabs.nav-stacked { border-bottom: 0; } .nav-tabs.nav-stacked > li > a { border: 1px solid #ddd; -webkit-border-radius: 0; -moz-border-radius: 0; border-radius: 0; } .nav-tabs.nav-stacked > li:first-child > a { -webkit-border-radius: 4px 4px 0 0; -moz-border-radius: 4px 4px 0 0; border-radius: 4px 4px 0 0; } .nav-tabs.nav-stacked > li:last-child > a { -webkit-border-radius: 0 0 4px 4px; -moz-border-radius: 0 0 4px 4px; border-radius: 0 0 4px 4px; } .nav-tabs.nav-stacked > li > a:hover { border-color: #ddd; z-index: 2; } .nav-pills.nav-stacked > li > a { margin-bottom: 3px; } .nav-pills.nav-stacked > li:last-child > a { margin-bottom: 1px; } .nav-tabs .dropdown-menu, .nav-pills .dropdown-menu { margin-top: 1px; border-width: 1px; } .nav-pills .dropdown-menu { -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; } .nav-tabs .dropdown-toggle .caret, .nav-pills .dropdown-toggle .caret { border-top-color: #0088cc; border-bottom-color: #0088cc; margin-top: 6px; } .nav-tabs .dropdown-toggle:hover .caret, .nav-pills .dropdown-toggle:hover .caret { border-top-color: #005580; border-bottom-color: #005580; } .nav-tabs .active .dropdown-toggle .caret, .nav-pills .active .dropdown-toggle .caret { border-top-color: #333333; border-bottom-color: #333333; } .nav > .dropdown.active > a:hover { color: #000000; cursor: pointer; } .nav-tabs .open .dropdown-toggle, .nav-pills .open .dropdown-toggle, .nav > .open.active > a:hover { color: #ffffff; background-color: #999999; border-color: #999999; } .nav .open .caret, .nav .open.active .caret, .nav .open a:hover .caret { border-top-color: #ffffff; border-bottom-color: #ffffff; opacity: 1; filter: alpha(opacity=100); } .tabs-stacked .open > a:hover { border-color: #999999; } .tabbable { *zoom: 1; } .tabbable:before, .tabbable:after { display: table; content: ""; } .tabbable:after { clear: both; } .tab-content { display: table; width: 100%; } .tabs-below .nav-tabs, .tabs-right .nav-tabs, .tabs-left .nav-tabs { border-bottom: 0; } .tab-content > .tab-pane, .pill-content > .pill-pane { display: none; } .tab-content > .active, .pill-content > .active { display: block; } .tabs-below .nav-tabs { border-top: 1px solid #ddd; } .tabs-below .nav-tabs > li { margin-top: -1px; margin-bottom: 0; } .tabs-below .nav-tabs > li > a { -webkit-border-radius: 0 0 4px 4px; -moz-border-radius: 0 0 4px 4px; border-radius: 0 0 4px 4px; } .tabs-below .nav-tabs > li > a:hover { border-bottom-color: transparent; border-top-color: #ddd; } .tabs-below .nav-tabs .active > a, .tabs-below .nav-tabs .active > a:hover { border-color: transparent #ddd #ddd #ddd; } .tabs-left .nav-tabs > li, .tabs-right .nav-tabs > li { float: none; } .tabs-left .nav-tabs > li > a, .tabs-right .nav-tabs > li > a { min-width: 74px; margin-right: 0; margin-bottom: 3px; } .tabs-left .nav-tabs { float: left; margin-right: 19px; border-right: 1px solid #ddd; } .tabs-left .nav-tabs > li > a { margin-right: -1px; -webkit-border-radius: 4px 0 0 4px; -moz-border-radius: 4px 0 0 4px; border-radius: 4px 0 0 4px; } .tabs-left .nav-tabs > li > a:hover { border-color: #eeeeee #dddddd #eeeeee #eeeeee; } .tabs-left .nav-tabs .active > a, .tabs-left .nav-tabs .active > a:hover { border-color: #ddd transparent #ddd #ddd; *border-right-color: #ffffff; } .tabs-right .nav-tabs { float: right; margin-left: 19px; border-left: 1px solid #ddd; } .tabs-right .nav-tabs > li > a { margin-left: -1px; -webkit-border-radius: 0 4px 4px 0; -moz-border-radius: 0 4px 4px 0; border-radius: 0 4px 4px 0; } .tabs-right .nav-tabs > li > a:hover { border-color: #eeeeee #eeeeee #eeeeee #dddddd; } .tabs-right .nav-tabs .active > a, .tabs-right .nav-tabs .active > a:hover { border-color: #ddd #ddd #ddd transparent; *border-left-color: #ffffff; } .navbar { *position: relative; *z-index: 2; overflow: visible; margin-bottom: 18px; } .navbar-inner { padding-left: 20px; padding-right: 20px; background-color: #2c2c2c; background-image: -moz-linear-gradient(top, #333333, #222222); background-image: -ms-linear-gradient(top, #333333, #222222); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222)); background-image: -webkit-linear-gradient(top, #333333, #222222); background-image: -o-linear-gradient(top, #333333, #222222); background-image: linear-gradient(top, #333333, #222222); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0); -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); } .navbar .container { width: auto; } .btn-navbar { display: none; float: right; padding: 7px 10px; margin-left: 5px; margin-right: 5px; background-color: #2c2c2c; background-image: -moz-linear-gradient(top, #333333, #222222); background-image: -ms-linear-gradient(top, #333333, #222222); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222)); background-image: -webkit-linear-gradient(top, #333333, #222222); background-image: -o-linear-gradient(top, #333333, #222222); background-image: linear-gradient(top, #333333, #222222); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0); border-color: #222222 #222222 #000000; border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); filter: progid:dximagetransform.microsoft.gradient(enabled=false); -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); } .btn-navbar:hover, .btn-navbar:active, .btn-navbar.active, .btn-navbar.disabled, .btn-navbar[disabled] { background-color: #222222; } .btn-navbar:active, .btn-navbar.active { background-color: #080808 \9; } .btn-navbar .icon-bar { display: block; width: 18px; height: 2px; background-color: #f5f5f5; -webkit-border-radius: 1px; -moz-border-radius: 1px; border-radius: 1px; -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); } .btn-navbar .icon-bar + .icon-bar { margin-top: 3px; } .nav-collapse.collapse { height: auto; } .navbar { color: #999999; } .navbar .brand:hover { text-decoration: none; } .navbar .brand { float: left; display: block; padding: 8px 20px 12px; margin-left: -20px; font-size: 20px; font-weight: 200; line-height: 1; color: #ffffff; } .navbar .navbar-text { margin-bottom: 0; line-height: 40px; } .navbar .btn, .navbar .btn-group { margin-top: 5px; } .navbar .btn-group .btn { margin-top: 0; } .navbar-form { margin-bottom: 0; *zoom: 1; } .navbar-form:before, .navbar-form:after { display: table; content: ""; } .navbar-form:after { clear: both; } .navbar-form input, .navbar-form select, .navbar-form .radio, .navbar-form .checkbox { margin-top: 5px; } .navbar-form input, .navbar-form select { display: inline-block; margin-bottom: 0; } .navbar-form input[type="image"], .navbar-form input[type="checkbox"], .navbar-form input[type="radio"] { margin-top: 3px; } .navbar-form .input-append, .navbar-form .input-prepend { margin-top: 6px; white-space: nowrap; } .navbar-form .input-append input, .navbar-form .input-prepend input { margin-top: 0; } .navbar-search { position: relative; float: left; margin-top: 6px; margin-bottom: 0; } .navbar-search .search-query { padding: 4px 9px; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 13px; font-weight: normal; line-height: 1; color: #ffffff; background-color: #626262; border: 1px solid #151515; -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.15); -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.15); box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.15); -webkit-transition: none; -moz-transition: none; -ms-transition: none; -o-transition: none; transition: none; } .navbar-search .search-query:-moz-placeholder { color: #cccccc; } .navbar-search .search-query::-webkit-input-placeholder { color: #cccccc; } .navbar-search .search-query:focus, .navbar-search .search-query.focused { padding: 5px 10px; color: #333333; text-shadow: 0 1px 0 #ffffff; background-color: #ffffff; border: 0; -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); outline: 0; } .navbar-fixed-top, .navbar-fixed-bottom { position: fixed; right: 0; left: 0; z-index: 1030; margin-bottom: 0; } .navbar-fixed-top .navbar-inner, .navbar-fixed-bottom .navbar-inner { padding-left: 0; padding-right: 0; -webkit-border-radius: 0; -moz-border-radius: 0; border-radius: 0; } .navbar-fixed-top .container, .navbar-fixed-bottom .container { width: 940px; } .navbar-fixed-top { top: 0; } .navbar-fixed-bottom { bottom: 0; } .navbar .nav { position: relative; left: 0; display: block; float: left; margin: 0 10px 0 0; } .navbar .nav.pull-right { float: right; } .navbar .nav > li { display: block; float: left; } .navbar .nav > li > a { float: none; padding: 10px 10px 11px; line-height: 19px; color: #999999; text-decoration: none; text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); } .navbar .nav > li > a:hover { background-color: transparent; color: #ffffff; text-decoration: none; } .navbar .nav .active > a, .navbar .nav .active > a:hover { color: #ffffff; text-decoration: none; background-color: #222222; } .navbar .divider-vertical { height: 40px; width: 1px; margin: 0 9px; overflow: hidden; background-color: #222222; border-right: 1px solid #333333; } .navbar .nav.pull-right { margin-left: 10px; margin-right: 0; } .navbar .dropdown-menu { margin-top: 1px; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; } .navbar .dropdown-menu:before { content: ''; display: inline-block; border-left: 7px solid transparent; border-right: 7px solid transparent; border-bottom: 7px solid #ccc; border-bottom-color: rgba(0, 0, 0, 0.2); position: absolute; top: -7px; left: 9px; } .navbar .dropdown-menu:after { content: ''; display: inline-block; border-left: 6px solid transparent; border-right: 6px solid transparent; border-bottom: 6px solid #ffffff; position: absolute; top: -6px; left: 10px; } .navbar-fixed-bottom .dropdown-menu:before { border-top: 7px solid #ccc; border-top-color: rgba(0, 0, 0, 0.2); border-bottom: 0; bottom: -7px; top: auto; } .navbar-fixed-bottom .dropdown-menu:after { border-top: 6px solid #ffffff; border-bottom: 0; bottom: -6px; top: auto; } .navbar .nav .dropdown-toggle .caret, .navbar .nav .open.dropdown .caret { border-top-color: #ffffff; border-bottom-color: #ffffff; } .navbar .nav .active .caret { opacity: 1; filter: alpha(opacity=100); } .navbar .nav .open > .dropdown-toggle, .navbar .nav .active > .dropdown-toggle, .navbar .nav .open.active > .dropdown-toggle { background-color: transparent; } .navbar .nav .active > .dropdown-toggle:hover { color: #ffffff; } .navbar .nav.pull-right .dropdown-menu, .navbar .nav .dropdown-menu.pull-right { left: auto; right: 0; } .navbar .nav.pull-right .dropdown-menu:before, .navbar .nav .dropdown-menu.pull-right:before { left: auto; right: 12px; } .navbar .nav.pull-right .dropdown-menu:after, .navbar .nav .dropdown-menu.pull-right:after { left: auto; right: 13px; } .breadcrumb { padding: 7px 14px; margin: 0 0 18px; list-style: none; background-color: #fbfbfb; background-image: -moz-linear-gradient(top, #ffffff, #f5f5f5); background-image: -ms-linear-gradient(top, #ffffff, #f5f5f5); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f5f5f5)); background-image: -webkit-linear-gradient(top, #ffffff, #f5f5f5); background-image: -o-linear-gradient(top, #ffffff, #f5f5f5); background-image: linear-gradient(top, #ffffff, #f5f5f5); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0); border: 1px solid #ddd; -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; -webkit-box-shadow: inset 0 1px 0 #ffffff; -moz-box-shadow: inset 0 1px 0 #ffffff; box-shadow: inset 0 1px 0 #ffffff; } .breadcrumb li { display: inline-block; *display: inline; /* IE7 inline-block hack */ *zoom: 1; text-shadow: 0 1px 0 #ffffff; } .breadcrumb .divider { padding: 0 5px; color: #999999; } .breadcrumb .active a { color: #333333; } .pagination { height: 36px; margin: 18px 0; } .pagination ul { display: inline-block; *display: inline; /* IE7 inline-block hack */ *zoom: 1; margin-left: 0; margin-bottom: 0; -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); } .pagination li { display: inline; } .pagination a { float: left; padding: 0 14px; line-height: 34px; text-decoration: none; border: 1px solid #ddd; border-left-width: 0; } .pagination a:hover, .pagination .active a { background-color: #f5f5f5; } .pagination .active a { color: #999999; cursor: default; } .pagination .disabled span, .pagination .disabled a, .pagination .disabled a:hover { color: #999999; background-color: transparent; cursor: default; } .pagination li:first-child a { border-left-width: 1px; -webkit-border-radius: 3px 0 0 3px; -moz-border-radius: 3px 0 0 3px; border-radius: 3px 0 0 3px; } .pagination li:last-child a { -webkit-border-radius: 0 3px 3px 0; -moz-border-radius: 0 3px 3px 0; border-radius: 0 3px 3px 0; } .pagination-centered { text-align: center; } .pagination-right { text-align: right; } .pager { margin-left: 0; margin-bottom: 18px; list-style: none; text-align: center; *zoom: 1; } .pager:before, .pager:after { display: table; content: ""; } .pager:after { clear: both; } .pager li { display: inline; } .pager a { display: inline-block; padding: 5px 14px; background-color: #fff; border: 1px solid #ddd; -webkit-border-radius: 15px; -moz-border-radius: 15px; border-radius: 15px; } .pager a:hover { text-decoration: none; background-color: #f5f5f5; } .pager .next a { float: right; } .pager .previous a { float: left; } .pager .disabled a, .pager .disabled a:hover { color: #999999; background-color: #fff; cursor: default; } .modal-open .dropdown-menu { z-index: 2050; } .modal-open .dropdown.open { *z-index: 2050; } .modal-open .popover { z-index: 2060; } .modal-open .tooltip { z-index: 2070; } .modal-backdrop { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1040; background-color: #000000; } .modal-backdrop.fade { opacity: 0; } .modal-backdrop, .modal-backdrop.fade.in { opacity: 0.8; filter: alpha(opacity=80); } .modal { position: fixed; top: 50%; left: 50%; z-index: 1050; overflow: auto; width: 560px; margin: -250px 0 0 -280px; background-color: #ffffff; border: 1px solid #999; border: 1px solid rgba(0, 0, 0, 0.3); *border: 1px solid #999; /* IE6-7 */ -webkit-border-radius: 6px; -moz-border-radius: 6px; border-radius: 6px; -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); -webkit-background-clip: padding-box; -moz-background-clip: padding-box; background-clip: padding-box; } .modal.fade { -webkit-transition: opacity .3s linear, top .3s ease-out; -moz-transition: opacity .3s linear, top .3s ease-out; -ms-transition: opacity .3s linear, top .3s ease-out; -o-transition: opacity .3s linear, top .3s ease-out; transition: opacity .3s linear, top .3s ease-out; top: -25%; } .modal.fade.in { top: 50%; } .modal-header { padding: 9px 15px; border-bottom: 1px solid #eee; } .modal-header .close { margin-top: 2px; } .modal-body { overflow-y: auto; max-height: 400px; padding: 15px; } .modal-form { margin-bottom: 0; } .modal-footer { padding: 14px 15px 15px; margin-bottom: 0; text-align: right; background-color: #f5f5f5; border-top: 1px solid #ddd; -webkit-border-radius: 0 0 6px 6px; -moz-border-radius: 0 0 6px 6px; border-radius: 0 0 6px 6px; -webkit-box-shadow: inset 0 1px 0 #ffffff; -moz-box-shadow: inset 0 1px 0 #ffffff; box-shadow: inset 0 1px 0 #ffffff; *zoom: 1; } .modal-footer:before, .modal-footer:after { display: table; content: ""; } .modal-footer:after { clear: both; } .modal-footer .btn + .btn { margin-left: 5px; margin-bottom: 0; } .modal-footer .btn-group .btn + .btn { margin-left: -1px; } .tooltip { position: absolute; z-index: 1020; display: block; visibility: visible; padding: 5px; font-size: 11px; opacity: 0; filter: alpha(opacity=0); } .tooltip.in { opacity: 0.8; filter: alpha(opacity=80); } .tooltip.top { margin-top: -2px; } .tooltip.right { margin-left: 2px; } .tooltip.bottom { margin-top: 2px; } .tooltip.left { margin-left: -2px; } .tooltip.top .tooltip-arrow { bottom: 0; left: 50%; margin-left: -5px; border-left: 5px solid transparent; border-right: 5px solid transparent; border-top: 5px solid #000000; } .tooltip.left .tooltip-arrow { top: 50%; right: 0; margin-top: -5px; border-top: 5px solid transparent; border-bottom: 5px solid transparent; border-left: 5px solid #000000; } .tooltip.bottom .tooltip-arrow { top: 0; left: 50%; margin-left: -5px; border-left: 5px solid transparent; border-right: 5px solid transparent; border-bottom: 5px solid #000000; } .tooltip.right .tooltip-arrow { top: 50%; left: 0; margin-top: -5px; border-top: 5px solid transparent; border-bottom: 5px solid transparent; border-right: 5px solid #000000; } .tooltip-inner { max-width: 200px; padding: 3px 8px; color: #ffffff; text-align: center; text-decoration: none; background-color: #000000; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; } .tooltip-arrow { position: absolute; width: 0; height: 0; } .popover { position: absolute; top: 0; left: 0; z-index: 1010; display: none; padding: 5px; } .popover.top { margin-top: -5px; } .popover.right { margin-left: 5px; } .popover.bottom { margin-top: 5px; } .popover.left { margin-left: -5px; } .popover.top .arrow { bottom: 0; left: 50%; margin-left: -5px; border-left: 5px solid transparent; border-right: 5px solid transparent; border-top: 5px solid #000000; } .popover.right .arrow { top: 50%; left: 0; margin-top: -5px; border-top: 5px solid transparent; border-bottom: 5px solid transparent; border-right: 5px solid #000000; } .popover.bottom .arrow { top: 0; left: 50%; margin-left: -5px; border-left: 5px solid transparent; border-right: 5px solid transparent; border-bottom: 5px solid #000000; } .popover.left .arrow { top: 50%; right: 0; margin-top: -5px; border-top: 5px solid transparent; border-bottom: 5px solid transparent; border-left: 5px solid #000000; } .popover .arrow { position: absolute; width: 0; height: 0; } .popover-inner { padding: 3px; width: 280px; overflow: hidden; background: #000000; background: rgba(0, 0, 0, 0.8); -webkit-border-radius: 6px; -moz-border-radius: 6px; border-radius: 6px; -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); } .popover-title { padding: 9px 15px; line-height: 1; background-color: #f5f5f5; border-bottom: 1px solid #eee; -webkit-border-radius: 3px 3px 0 0; -moz-border-radius: 3px 3px 0 0; border-radius: 3px 3px 0 0; } .popover-content { padding: 14px; background-color: #ffffff; -webkit-border-radius: 0 0 3px 3px; -moz-border-radius: 0 0 3px 3px; border-radius: 0 0 3px 3px; -webkit-background-clip: padding-box; -moz-background-clip: padding-box; background-clip: padding-box; } .popover-content p, .popover-content ul, .popover-content ol { margin-bottom: 0; } .thumbnails { margin-left: -20px; list-style: none; *zoom: 1; } .thumbnails:before, .thumbnails:after { display: table; content: ""; } .thumbnails:after { clear: both; } .thumbnails > li { float: left; margin: 0 0 18px 20px; } .thumbnail { display: block; padding: 4px; line-height: 1; border: 1px solid #ddd; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); -moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); } a.thumbnail:hover { border-color: #0088cc; -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); } .thumbnail > img { display: block; max-width: 100%; margin-left: auto; margin-right: auto; } .thumbnail .caption { padding: 9px; } .label { padding: 1px 4px 2px; font-size: 10.998px; font-weight: bold; line-height: 13px; color: #ffffff; vertical-align: middle; white-space: nowrap; text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); background-color: #999999; -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; } .label:hover { color: #ffffff; text-decoration: none; } .label-important { background-color: #b94a48; } .label-important:hover { background-color: #953b39; } .label-warning { background-color: #f89406; } .label-warning:hover { background-color: #c67605; } .label-success { background-color: #468847; } .label-success:hover { background-color: #356635; } .label-info { background-color: #3a87ad; } .label-info:hover { background-color: #2d6987; } .label-inverse { background-color: #333333; } .label-inverse:hover { background-color: #1a1a1a; } .badge { padding: 1px 9px 2px; font-size: 12.025px; font-weight: bold; white-space: nowrap; color: #ffffff; background-color: #999999; -webkit-border-radius: 9px; -moz-border-radius: 9px; border-radius: 9px; } .badge:hover { color: #ffffff; text-decoration: none; cursor: pointer; } .badge-error { background-color: #b94a48; } .badge-error:hover { background-color: #953b39; } .badge-warning { background-color: #f89406; } .badge-warning:hover { background-color: #c67605; } .badge-success { background-color: #468847; } .badge-success:hover { background-color: #356635; } .badge-info { background-color: #3a87ad; } .badge-info:hover { background-color: #2d6987; } .badge-inverse { background-color: #333333; } .badge-inverse:hover { background-color: #1a1a1a; } @-webkit-keyframes progress-bar-stripes { from { background-position: 0 0; } to { background-position: 40px 0; } } @-moz-keyframes progress-bar-stripes { from { background-position: 0 0; } to { background-position: 40px 0; } } @-ms-keyframes progress-bar-stripes { from { background-position: 0 0; } to { background-position: 40px 0; } } @keyframes progress-bar-stripes { from { background-position: 0 0; } to { background-position: 40px 0; } } .progress { overflow: hidden; height: 18px; margin-bottom: 18px; background-color: #f7f7f7; background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); background-image: -ms-linear-gradient(top, #f5f5f5, #f9f9f9); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); background-image: linear-gradient(top, #f5f5f5, #f9f9f9); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5', endColorstr='#f9f9f9', GradientType=0); -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; } .progress .bar { width: 0%; height: 18px; color: #ffffff; font-size: 12px; text-align: center; text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); background-color: #0e90d2; background-image: -moz-linear-gradient(top, #149bdf, #0480be); background-image: -ms-linear-gradient(top, #149bdf, #0480be); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); background-image: -webkit-linear-gradient(top, #149bdf, #0480be); background-image: -o-linear-gradient(top, #149bdf, #0480be); background-image: linear-gradient(top, #149bdf, #0480be); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#149bdf', endColorstr='#0480be', GradientType=0); -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); -webkit-box-sizing: border-box; -moz-box-sizing: border-box; -ms-box-sizing: border-box; box-sizing: border-box; -webkit-transition: width 0.6s ease; -moz-transition: width 0.6s ease; -ms-transition: width 0.6s ease; -o-transition: width 0.6s ease; transition: width 0.6s ease; } .progress-striped .bar { background-color: #149bdf; background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -webkit-background-size: 40px 40px; -moz-background-size: 40px 40px; -o-background-size: 40px 40px; background-size: 40px 40px; } .progress.active .bar { -webkit-animation: progress-bar-stripes 2s linear infinite; -moz-animation: progress-bar-stripes 2s linear infinite; animation: progress-bar-stripes 2s linear infinite; } .progress-danger .bar { background-color: #dd514c; background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35)); background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); background-image: linear-gradient(top, #ee5f5b, #c43c35); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0); } .progress-danger.progress-striped .bar { background-color: #ee5f5b; background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .progress-success .bar { background-color: #5eb95e; background-image: -moz-linear-gradient(top, #62c462, #57a957); background-image: -ms-linear-gradient(top, #62c462, #57a957); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957)); background-image: -webkit-linear-gradient(top, #62c462, #57a957); background-image: -o-linear-gradient(top, #62c462, #57a957); background-image: linear-gradient(top, #62c462, #57a957); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0); } .progress-success.progress-striped .bar { background-color: #62c462; background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .progress-info .bar { background-color: #4bb1cf; background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); background-image: -ms-linear-gradient(top, #5bc0de, #339bb9); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9)); background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); background-image: -o-linear-gradient(top, #5bc0de, #339bb9); background-image: linear-gradient(top, #5bc0de, #339bb9); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0); } .progress-info.progress-striped .bar { background-color: #5bc0de; background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .progress-warning .bar { background-color: #faa732; background-image: -moz-linear-gradient(top, #fbb450, #f89406); background-image: -ms-linear-gradient(top, #fbb450, #f89406); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); background-image: -webkit-linear-gradient(top, #fbb450, #f89406); background-image: -o-linear-gradient(top, #fbb450, #f89406); background-image: linear-gradient(top, #fbb450, #f89406); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0); } .progress-warning.progress-striped .bar { background-color: #fbb450; background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .accordion { margin-bottom: 18px; } .accordion-group { margin-bottom: 2px; border: 1px solid #e5e5e5; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; } .accordion-heading { border-bottom: 0; } .accordion-heading .accordion-toggle { display: block; padding: 8px 15px; } .accordion-inner { padding: 9px 15px; border-top: 1px solid #e5e5e5; } .carousel { position: relative; margin-bottom: 18px; line-height: 1; } .carousel-inner { overflow: hidden; width: 100%; position: relative; } .carousel .item { display: none; position: relative; -webkit-transition: 0.6s ease-in-out left; -moz-transition: 0.6s ease-in-out left; -ms-transition: 0.6s ease-in-out left; -o-transition: 0.6s ease-in-out left; transition: 0.6s ease-in-out left; } .carousel .item > img { display: block; line-height: 1; } .carousel .active, .carousel .next, .carousel .prev { display: block; } .carousel .active { left: 0; } .carousel .next, .carousel .prev { position: absolute; top: 0; width: 100%; } .carousel .next { left: 100%; } .carousel .prev { left: -100%; } .carousel .next.left, .carousel .prev.right { left: 0; } .carousel .active.left { left: -100%; } .carousel .active.right { left: 100%; } .carousel-control { position: absolute; top: 40%; left: 15px; width: 40px; height: 40px; margin-top: -20px; font-size: 60px; font-weight: 100; line-height: 30px; color: #ffffff; text-align: center; background: #222222; border: 3px solid #ffffff; -webkit-border-radius: 23px; -moz-border-radius: 23px; border-radius: 23px; opacity: 0.5; filter: alpha(opacity=50); } .carousel-control.right { left: auto; right: 15px; } .carousel-control:hover { color: #ffffff; text-decoration: none; opacity: 0.9; filter: alpha(opacity=90); } .carousel-caption { position: absolute; left: 0; right: 0; bottom: 0; padding: 10px 15px 5px; background: #333333; background: rgba(0, 0, 0, 0.75); } .carousel-caption h4, .carousel-caption p { color: #ffffff; } .hero-unit { padding: 60px; margin-bottom: 30px; background-color: #eeeeee; -webkit-border-radius: 6px; -moz-border-radius: 6px; border-radius: 6px; } .hero-unit h1 { margin-bottom: 0; font-size: 60px; line-height: 1; color: inherit; letter-spacing: -1px; } .hero-unit p { font-size: 18px; font-weight: 200; line-height: 27px; color: inherit; } .pull-right { float: right; } .pull-left { float: left; } .hide { display: none; } .show { display: block; } .invisible { visibility: hidden; } flask-peewee-3.0.6/flask_peewee/static/css/bootstrap.min.css000066400000000000000000002363761460575705200241460ustar00rootroot00000000000000article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block;} audio,canvas,video{display:inline-block;*display:inline;*zoom:1;} audio:not([controls]){display:none;} html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;} a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} a:hover,a:active{outline:0;} sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline;} sup{top:-0.5em;} sub{bottom:-0.25em;} img{height:auto;border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;} button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle;} button,input{*overflow:visible;line-height:normal;} button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0;} button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;} input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;} input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none;} textarea{overflow:auto;vertical-align:top;} .clearfix{*zoom:1;}.clearfix:before,.clearfix:after{display:table;content:"";} .clearfix:after{clear:both;} .hide-text{overflow:hidden;text-indent:100%;white-space:nowrap;} .input-block-level{display:block;width:100%;min-height:28px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;} body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;color:#333333;background-color:#ffffff;} a{color:#0088cc;text-decoration:none;} a:hover{color:#005580;text-decoration:underline;} .row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";} .row:after{clear:both;} [class*="span"]{float:left;margin-left:20px;} .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px;} .span12{width:940px;} .span11{width:860px;} .span10{width:780px;} .span9{width:700px;} .span8{width:620px;} .span7{width:540px;} .span6{width:460px;} .span5{width:380px;} .span4{width:300px;} .span3{width:220px;} .span2{width:140px;} .span1{width:60px;} .offset12{margin-left:980px;} .offset11{margin-left:900px;} .offset10{margin-left:820px;} .offset9{margin-left:740px;} .offset8{margin-left:660px;} .offset7{margin-left:580px;} .offset6{margin-left:500px;} .offset5{margin-left:420px;} .offset4{margin-left:340px;} .offset3{margin-left:260px;} .offset2{margin-left:180px;} .offset1{margin-left:100px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} .row-fluid:after{clear:both;} .row-fluid>[class*="span"]{float:left;margin-left:2.127659574%;} .row-fluid>[class*="span"]:first-child{margin-left:0;} .row-fluid > .span12{width:99.99999998999999%;} .row-fluid > .span11{width:91.489361693%;} .row-fluid > .span10{width:82.97872339599999%;} .row-fluid > .span9{width:74.468085099%;} .row-fluid > .span8{width:65.95744680199999%;} .row-fluid > .span7{width:57.446808505%;} .row-fluid > .span6{width:48.93617020799999%;} .row-fluid > .span5{width:40.425531911%;} .row-fluid > .span4{width:31.914893614%;} .row-fluid > .span3{width:23.404255317%;} .row-fluid > .span2{width:14.89361702%;} .row-fluid > .span1{width:6.382978723%;} .container{margin-left:auto;margin-right:auto;*zoom:1;}.container:before,.container:after{display:table;content:"";} .container:after{clear:both;} .container-fluid{padding-left:20px;padding-right:20px;*zoom:1;}.container-fluid:before,.container-fluid:after{display:table;content:"";} .container-fluid:after{clear:both;} p{margin:0 0 9px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;}p small{font-size:11px;color:#999999;} .lead{margin-bottom:18px;font-size:20px;font-weight:200;line-height:27px;} h1,h2,h3,h4,h5,h6{margin:0;font-family:inherit;font-weight:bold;color:inherit;text-rendering:optimizelegibility;}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;color:#999999;} h1{font-size:30px;line-height:36px;}h1 small{font-size:18px;} h2{font-size:24px;line-height:36px;}h2 small{font-size:18px;} h3{line-height:27px;font-size:18px;}h3 small{font-size:14px;} h4,h5,h6{line-height:18px;} h4{font-size:14px;}h4 small{font-size:12px;} h5{font-size:12px;} h6{font-size:11px;color:#999999;text-transform:uppercase;} .page-header{padding-bottom:17px;margin:18px 0;border-bottom:1px solid #eeeeee;} .page-header h1{line-height:1;} ul,ol{padding:0;margin:0 0 9px 25px;} ul ul,ul ol,ol ol,ol ul{margin-bottom:0;} ul{list-style:disc;} ol{list-style:decimal;} li{line-height:18px;} ul.unstyled,ol.unstyled{margin-left:0;list-style:none;} dl{margin-bottom:18px;} dt,dd{line-height:18px;} dt{font-weight:bold;line-height:17px;} dd{margin-left:9px;} .dl-horizontal dt{float:left;clear:left;width:120px;text-align:right;} .dl-horizontal dd{margin-left:130px;} hr{margin:18px 0;border:0;border-top:1px solid #eeeeee;border-bottom:1px solid #ffffff;} strong{font-weight:bold;} em{font-style:italic;} .muted{color:#999999;} abbr[title]{border-bottom:1px dotted #ddd;cursor:help;} abbr.initialism{font-size:90%;text-transform:uppercase;} blockquote{padding:0 0 0 15px;margin:0 0 18px;border-left:5px solid #eeeeee;}blockquote p{margin-bottom:0;font-size:16px;font-weight:300;line-height:22.5px;} blockquote small{display:block;line-height:18px;color:#999999;}blockquote small:before{content:'\2014 \00A0';} blockquote.pull-right{float:right;padding-left:0;padding-right:15px;border-left:0;border-right:5px solid #eeeeee;}blockquote.pull-right p,blockquote.pull-right small{text-align:right;} q:before,q:after,blockquote:before,blockquote:after{content:"";} address{display:block;margin-bottom:18px;line-height:18px;font-style:normal;} small{font-size:100%;} cite{font-style:normal;} code,pre{padding:0 3px 2px;font-family:Menlo,Monaco,"Courier New",monospace;font-size:12px;color:#333333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} code{padding:2px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8;} pre{display:block;padding:8.5px;margin:0 0 9px;font-size:12.025px;line-height:18px;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;white-space:pre;white-space:pre-wrap;word-break:break-all;word-wrap:break-word;}pre.prettyprint{margin-bottom:18px;} pre code{padding:0;color:inherit;background-color:transparent;border:0;} .pre-scrollable{max-height:340px;overflow-y:scroll;} form{margin:0 0 18px;} fieldset{padding:0;margin:0;border:0;} legend{display:block;width:100%;padding:0;margin-bottom:27px;font-size:19.5px;line-height:36px;color:#333333;border:0;border-bottom:1px solid #eee;}legend small{font-size:13.5px;color:#999999;} label,input,button,select,textarea{font-size:13px;font-weight:normal;line-height:18px;} input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;} label{display:block;margin-bottom:5px;color:#333333;} input,textarea,select,.uneditable-input{display:inline-block;width:210px;height:18px;padding:4px;margin-bottom:9px;font-size:13px;line-height:18px;color:#555555;border:1px solid #cccccc;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} .uneditable-textarea{width:auto;height:auto;} label input,label textarea,label select{display:block;} input[type="image"],input[type="checkbox"],input[type="radio"]{width:auto;height:auto;padding:0;margin:3px 0;*margin-top:0;line-height:normal;cursor:pointer;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;border:0 \9;} input[type="image"]{border:0;} input[type="file"]{width:auto;padding:initial;line-height:initial;border:initial;background-color:#ffffff;background-color:initial;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} input[type="button"],input[type="reset"],input[type="submit"]{width:auto;height:auto;} select,input[type="file"]{height:28px;*margin-top:4px;line-height:28px;} input[type="file"]{line-height:18px \9;} select{width:220px;background-color:#ffffff;} select[multiple],select[size]{height:auto;} input[type="image"]{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} textarea{height:auto;} input[type="hidden"]{display:none;} .radio,.checkbox{padding-left:18px;} .radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-18px;} .controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px;} .radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle;} .radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px;} input,textarea{-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-webkit-transition:border linear 0.2s,box-shadow linear 0.2s;-moz-transition:border linear 0.2s,box-shadow linear 0.2s;-ms-transition:border linear 0.2s,box-shadow linear 0.2s;-o-transition:border linear 0.2s,box-shadow linear 0.2s;transition:border linear 0.2s,box-shadow linear 0.2s;} input:focus,textarea:focus{border-color:rgba(82, 168, 236, 0.8);-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);outline:0;outline:thin dotted \9;} input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus,select:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} .input-mini{width:60px;} .input-small{width:90px;} .input-medium{width:150px;} .input-large{width:210px;} .input-xlarge{width:270px;} .input-xxlarge{width:530px;} input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{float:none;margin-left:0;} input,textarea,.uneditable-input{margin-left:0;} input.span12, textarea.span12, .uneditable-input.span12{width:930px;} input.span11, textarea.span11, .uneditable-input.span11{width:850px;} input.span10, textarea.span10, .uneditable-input.span10{width:770px;} input.span9, textarea.span9, .uneditable-input.span9{width:690px;} input.span8, textarea.span8, .uneditable-input.span8{width:610px;} input.span7, textarea.span7, .uneditable-input.span7{width:530px;} input.span6, textarea.span6, .uneditable-input.span6{width:450px;} input.span5, textarea.span5, .uneditable-input.span5{width:370px;} input.span4, textarea.span4, .uneditable-input.span4{width:290px;} input.span3, textarea.span3, .uneditable-input.span3{width:210px;} input.span2, textarea.span2, .uneditable-input.span2{width:130px;} input.span1, textarea.span1, .uneditable-input.span1{width:50px;} input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{background-color:#eeeeee;border-color:#ddd;cursor:not-allowed;} .control-group.warning>label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853;} .control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853;border-color:#c09853;}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:0 0 6px #dbc59e;-moz-box-shadow:0 0 6px #dbc59e;box-shadow:0 0 6px #dbc59e;} .control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853;} .control-group.error>label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48;} .control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48;border-color:#b94a48;}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:0 0 6px #d59392;-moz-box-shadow:0 0 6px #d59392;box-shadow:0 0 6px #d59392;} .control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48;} .control-group.success>label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847;} .control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847;border-color:#468847;}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:0 0 6px #7aba7b;-moz-box-shadow:0 0 6px #7aba7b;box-shadow:0 0 6px #7aba7b;} .control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847;} input:focus:required:invalid,textarea:focus:required:invalid,select:focus:required:invalid{color:#b94a48;border-color:#ee5f5b;}input:focus:required:invalid:focus,textarea:focus:required:invalid:focus,select:focus:required:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7;} .form-actions{padding:17px 20px 18px;margin-top:18px;margin-bottom:18px;background-color:#eeeeee;border-top:1px solid #ddd;*zoom:1;}.form-actions:before,.form-actions:after{display:table;content:"";} .form-actions:after{clear:both;} .uneditable-input{display:block;background-color:#ffffff;border-color:#eee;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);cursor:not-allowed;} :-moz-placeholder{color:#999999;} ::-webkit-input-placeholder{color:#999999;} .help-block,.help-inline{color:#555555;} .help-block{display:block;margin-bottom:9px;} .help-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding-left:5px;} .input-prepend,.input-append{margin-bottom:5px;}.input-prepend input,.input-append input,.input-prepend select,.input-append select,.input-prepend .uneditable-input,.input-append .uneditable-input{*margin-left:0;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}.input-prepend input:focus,.input-append input:focus,.input-prepend select:focus,.input-append select:focus,.input-prepend .uneditable-input:focus,.input-append .uneditable-input:focus{position:relative;z-index:2;} .input-prepend .uneditable-input,.input-append .uneditable-input{border-left-color:#ccc;} .input-prepend .add-on,.input-append .add-on{display:inline-block;width:auto;min-width:16px;height:18px;padding:4px 5px;font-weight:normal;line-height:18px;text-align:center;text-shadow:0 1px 0 #ffffff;vertical-align:middle;background-color:#eeeeee;border:1px solid #ccc;} .input-prepend .add-on,.input-append .add-on,.input-prepend .btn,.input-append .btn{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} .input-prepend .active,.input-append .active{background-color:#a9dba9;border-color:#46a546;} .input-prepend .add-on,.input-prepend .btn{margin-right:-1px;} .input-append input,.input-append select .uneditable-input{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} .input-append .uneditable-input{border-left-color:#eee;border-right-color:#ccc;} .input-append .add-on,.input-append .btn{margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;} .input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} .input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} .input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;} .search-query{padding-left:14px;padding-right:14px;margin-bottom:0;-webkit-border-radius:14px;-moz-border-radius:14px;border-radius:14px;} .form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;margin-bottom:0;} .form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none;} .form-search label,.form-inline label{display:inline-block;} .form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0;} .form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle;} .form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-left:0;margin-right:3px;} .control-group{margin-bottom:9px;} legend+.control-group{margin-top:18px;-webkit-margin-top-collapse:separate;} .form-horizontal .control-group{margin-bottom:18px;*zoom:1;}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;content:"";} .form-horizontal .control-group:after{clear:both;} .form-horizontal .control-label{float:left;width:140px;padding-top:5px;text-align:right;} .form-horizontal .controls{margin-left:160px;*display:inline-block;*margin-left:0;*padding-left:20px;} .form-horizontal .help-block{margin-top:9px;margin-bottom:0;} .form-horizontal .form-actions{padding-left:160px;} table{max-width:100%;border-collapse:collapse;border-spacing:0;background-color:transparent;} .table{width:100%;margin-bottom:18px;}.table th,.table td{padding:8px;line-height:18px;text-align:left;vertical-align:top;border-top:1px solid #dddddd;} .table th{font-weight:bold;} .table thead th{vertical-align:bottom;} .table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0;} .table tbody+tbody{border-top:2px solid #dddddd;} .table-condensed th,.table-condensed td{padding:4px 5px;} .table-bordered{border:1px solid #dddddd;border-left:0;border-collapse:separate;*border-collapse:collapsed;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.table-bordered th,.table-bordered td{border-left:1px solid #dddddd;} .table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0;} .table-bordered thead:first-child tr:first-child th:first-child,.table-bordered tbody:first-child tr:first-child td:first-child{-webkit-border-radius:4px 0 0 0;-moz-border-radius:4px 0 0 0;border-radius:4px 0 0 0;} .table-bordered thead:first-child tr:first-child th:last-child,.table-bordered tbody:first-child tr:first-child td:last-child{-webkit-border-radius:0 4px 0 0;-moz-border-radius:0 4px 0 0;border-radius:0 4px 0 0;} .table-bordered thead:last-child tr:last-child th:first-child,.table-bordered tbody:last-child tr:last-child td:first-child{-webkit-border-radius:0 0 0 4px;-moz-border-radius:0 0 0 4px;border-radius:0 0 0 4px;} .table-bordered thead:last-child tr:last-child th:last-child,.table-bordered tbody:last-child tr:last-child td:last-child{-webkit-border-radius:0 0 4px 0;-moz-border-radius:0 0 4px 0;border-radius:0 0 4px 0;} .table-striped tbody tr:nth-child(odd) td,.table-striped tbody tr:nth-child(odd) th{background-color:#f9f9f9;} .table tbody tr:hover td,.table tbody tr:hover th{background-color:#f5f5f5;} table .span1{float:none;width:44px;margin-left:0;} table .span2{float:none;width:124px;margin-left:0;} table .span3{float:none;width:204px;margin-left:0;} table .span4{float:none;width:284px;margin-left:0;} table .span5{float:none;width:364px;margin-left:0;} table .span6{float:none;width:444px;margin-left:0;} table .span7{float:none;width:524px;margin-left:0;} table .span8{float:none;width:604px;margin-left:0;} table .span9{float:none;width:684px;margin-left:0;} table .span10{float:none;width:764px;margin-left:0;} table .span11{float:none;width:844px;margin-left:0;} table .span12{float:none;width:924px;margin-left:0;} table .span13{float:none;width:1004px;margin-left:0;} table .span14{float:none;width:1084px;margin-left:0;} table .span15{float:none;width:1164px;margin-left:0;} table .span16{float:none;width:1244px;margin-left:0;} table .span17{float:none;width:1324px;margin-left:0;} table .span18{float:none;width:1404px;margin-left:0;} table .span19{float:none;width:1484px;margin-left:0;} table .span20{float:none;width:1564px;margin-left:0;} table .span21{float:none;width:1644px;margin-left:0;} table .span22{float:none;width:1724px;margin-left:0;} table .span23{float:none;width:1804px;margin-left:0;} table .span24{float:none;width:1884px;margin-left:0;} [class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat;*margin-right:.3em;}[class^="icon-"]:last-child,[class*=" icon-"]:last-child{*margin-left:0;} .icon-white{background-image:url("../img/glyphicons-halflings-white.png");} .icon-glass{background-position:0 0;} .icon-music{background-position:-24px 0;} .icon-search{background-position:-48px 0;} .icon-envelope{background-position:-72px 0;} .icon-heart{background-position:-96px 0;} .icon-star{background-position:-120px 0;} .icon-star-empty{background-position:-144px 0;} .icon-user{background-position:-168px 0;} .icon-film{background-position:-192px 0;} .icon-th-large{background-position:-216px 0;} .icon-th{background-position:-240px 0;} .icon-th-list{background-position:-264px 0;} .icon-ok{background-position:-288px 0;} .icon-remove{background-position:-312px 0;} .icon-zoom-in{background-position:-336px 0;} .icon-zoom-out{background-position:-360px 0;} .icon-off{background-position:-384px 0;} .icon-signal{background-position:-408px 0;} .icon-cog{background-position:-432px 0;} .icon-trash{background-position:-456px 0;} .icon-home{background-position:0 -24px;} .icon-file{background-position:-24px -24px;} .icon-time{background-position:-48px -24px;} .icon-road{background-position:-72px -24px;} .icon-download-alt{background-position:-96px -24px;} .icon-download{background-position:-120px -24px;} .icon-upload{background-position:-144px -24px;} .icon-inbox{background-position:-168px -24px;} .icon-play-circle{background-position:-192px -24px;} .icon-repeat{background-position:-216px -24px;} .icon-refresh{background-position:-240px -24px;} .icon-list-alt{background-position:-264px -24px;} .icon-lock{background-position:-287px -24px;} .icon-flag{background-position:-312px -24px;} .icon-headphones{background-position:-336px -24px;} .icon-volume-off{background-position:-360px -24px;} .icon-volume-down{background-position:-384px -24px;} .icon-volume-up{background-position:-408px -24px;} .icon-qrcode{background-position:-432px -24px;} .icon-barcode{background-position:-456px -24px;} .icon-tag{background-position:0 -48px;} .icon-tags{background-position:-25px -48px;} .icon-book{background-position:-48px -48px;} .icon-bookmark{background-position:-72px -48px;} .icon-print{background-position:-96px -48px;} .icon-camera{background-position:-120px -48px;} .icon-font{background-position:-144px -48px;} .icon-bold{background-position:-167px -48px;} .icon-italic{background-position:-192px -48px;} .icon-text-height{background-position:-216px -48px;} .icon-text-width{background-position:-240px -48px;} .icon-align-left{background-position:-264px -48px;} .icon-align-center{background-position:-288px -48px;} .icon-align-right{background-position:-312px -48px;} .icon-align-justify{background-position:-336px -48px;} .icon-list{background-position:-360px -48px;} .icon-indent-left{background-position:-384px -48px;} .icon-indent-right{background-position:-408px -48px;} .icon-facetime-video{background-position:-432px -48px;} .icon-picture{background-position:-456px -48px;} .icon-pencil{background-position:0 -72px;} .icon-map-marker{background-position:-24px -72px;} .icon-adjust{background-position:-48px -72px;} .icon-tint{background-position:-72px -72px;} .icon-edit{background-position:-96px -72px;} .icon-share{background-position:-120px -72px;} .icon-check{background-position:-144px -72px;} .icon-move{background-position:-168px -72px;} .icon-step-backward{background-position:-192px -72px;} .icon-fast-backward{background-position:-216px -72px;} .icon-backward{background-position:-240px -72px;} .icon-play{background-position:-264px -72px;} .icon-pause{background-position:-288px -72px;} .icon-stop{background-position:-312px -72px;} .icon-forward{background-position:-336px -72px;} .icon-fast-forward{background-position:-360px -72px;} .icon-step-forward{background-position:-384px -72px;} .icon-eject{background-position:-408px -72px;} .icon-chevron-left{background-position:-432px -72px;} .icon-chevron-right{background-position:-456px -72px;} .icon-plus-sign{background-position:0 -96px;} .icon-minus-sign{background-position:-24px -96px;} .icon-remove-sign{background-position:-48px -96px;} .icon-ok-sign{background-position:-72px -96px;} .icon-question-sign{background-position:-96px -96px;} .icon-info-sign{background-position:-120px -96px;} .icon-screenshot{background-position:-144px -96px;} .icon-remove-circle{background-position:-168px -96px;} .icon-ok-circle{background-position:-192px -96px;} .icon-ban-circle{background-position:-216px -96px;} .icon-arrow-left{background-position:-240px -96px;} .icon-arrow-right{background-position:-264px -96px;} .icon-arrow-up{background-position:-289px -96px;} .icon-arrow-down{background-position:-312px -96px;} .icon-share-alt{background-position:-336px -96px;} .icon-resize-full{background-position:-360px -96px;} .icon-resize-small{background-position:-384px -96px;} .icon-plus{background-position:-408px -96px;} .icon-minus{background-position:-433px -96px;} .icon-asterisk{background-position:-456px -96px;} .icon-exclamation-sign{background-position:0 -120px;} .icon-gift{background-position:-24px -120px;} .icon-leaf{background-position:-48px -120px;} .icon-fire{background-position:-72px -120px;} .icon-eye-open{background-position:-96px -120px;} .icon-eye-close{background-position:-120px -120px;} .icon-warning-sign{background-position:-144px -120px;} .icon-plane{background-position:-168px -120px;} .icon-calendar{background-position:-192px -120px;} .icon-random{background-position:-216px -120px;} .icon-comment{background-position:-240px -120px;} .icon-magnet{background-position:-264px -120px;} .icon-chevron-up{background-position:-288px -120px;} .icon-chevron-down{background-position:-313px -119px;} .icon-retweet{background-position:-336px -120px;} .icon-shopping-cart{background-position:-360px -120px;} .icon-folder-close{background-position:-384px -120px;} .icon-folder-open{background-position:-408px -120px;} .icon-resize-vertical{background-position:-432px -119px;} .icon-resize-horizontal{background-position:-456px -118px;} .dropdown{position:relative;} .dropdown-toggle{*margin-bottom:-3px;} .dropdown-toggle:active,.open .dropdown-toggle{outline:0;} .caret{display:inline-block;width:0;height:0;vertical-align:top;border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid #000000;opacity:0.3;filter:alpha(opacity=30);content:"";} .dropdown .caret{margin-top:8px;margin-left:2px;} .dropdown:hover .caret,.open.dropdown .caret{opacity:1;filter:alpha(opacity=100);} .dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;float:left;display:none;min-width:160px;padding:4px 0;margin:0;list-style:none;background-color:#ffffff;border-color:#ccc;border-color:rgba(0, 0, 0, 0.2);border-style:solid;border-width:1px;-webkit-border-radius:0 0 5px 5px;-moz-border-radius:0 0 5px 5px;border-radius:0 0 5px 5px;-webkit-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;*border-right-width:2px;*border-bottom-width:2px;}.dropdown-menu.pull-right{right:0;left:auto;} .dropdown-menu .divider{height:1px;margin:8px 1px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;*width:100%;*margin:-5px 0 5px;} .dropdown-menu a{display:block;padding:3px 15px;clear:both;font-weight:normal;line-height:18px;color:#333333;white-space:nowrap;} .dropdown-menu li>a:hover,.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#ffffff;text-decoration:none;background-color:#0088cc;} .dropdown.open{*z-index:1000;}.dropdown.open .dropdown-toggle{color:#ffffff;background:#ccc;background:rgba(0, 0, 0, 0.3);} .dropdown.open .dropdown-menu{display:block;} .pull-right .dropdown-menu{left:auto;right:0;} .dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000000;content:"\2191";} .dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px;} .typeahead{margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} .well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #eee;border:1px solid rgba(0, 0, 0, 0.05);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);}.well blockquote{border-color:#ddd;border-color:rgba(0, 0, 0, 0.15);} .well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;} .well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} .fade{-webkit-transition:opacity 0.15s linear;-moz-transition:opacity 0.15s linear;-ms-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear;opacity:0;}.fade.in{opacity:1;} .collapse{-webkit-transition:height 0.35s ease;-moz-transition:height 0.35s ease;-ms-transition:height 0.35s ease;-o-transition:height 0.35s ease;transition:height 0.35s ease;position:relative;overflow:hidden;height:0;}.collapse.in{height:auto;} .close{float:right;font-size:20px;font-weight:bold;line-height:18px;color:#000000;text-shadow:0 1px 0 #ffffff;opacity:0.2;filter:alpha(opacity=20);}.close:hover{color:#000000;text-decoration:none;opacity:0.4;filter:alpha(opacity=40);cursor:pointer;} .btn{display:inline-block;*display:inline;*zoom:1;padding:4px 10px 4px;margin-bottom:0;font-size:13px;line-height:18px;color:#333333;text-align:center;text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);vertical-align:middle;background-color:#f5f5f5;background-image:-moz-linear-gradient(top, #ffffff, #e6e6e6);background-image:-ms-linear-gradient(top, #ffffff, #e6e6e6);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));background-image:-webkit-linear-gradient(top, #ffffff, #e6e6e6);background-image:-o-linear-gradient(top, #ffffff, #e6e6e6);background-image:linear-gradient(top, #ffffff, #e6e6e6);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:dximagetransform.microsoft.gradient(enabled=false);border:1px solid #cccccc;border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);cursor:pointer;*margin-left:.3em;}.btn:hover,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{background-color:#e6e6e6;} .btn:active,.btn.active{background-color:#cccccc \9;} .btn:first-child{*margin-left:0;} .btn:hover{color:#333333;text-decoration:none;background-color:#e6e6e6;background-position:0 -15px;-webkit-transition:background-position 0.1s linear;-moz-transition:background-position 0.1s linear;-ms-transition:background-position 0.1s linear;-o-transition:background-position 0.1s linear;transition:background-position 0.1s linear;} .btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} .btn.active,.btn:active{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);background-color:#e6e6e6;background-color:#d9d9d9 \9;outline:0;} .btn.disabled,.btn[disabled]{cursor:default;background-image:none;background-color:#e6e6e6;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} .btn-large{padding:9px 14px;font-size:15px;line-height:normal;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} .btn-large [class^="icon-"]{margin-top:1px;} .btn-small{padding:5px 9px;font-size:11px;line-height:16px;} .btn-small [class^="icon-"]{margin-top:-1px;} .btn-mini{padding:2px 6px;font-size:11px;line-height:14px;} .btn-primary,.btn-primary:hover,.btn-warning,.btn-warning:hover,.btn-danger,.btn-danger:hover,.btn-success,.btn-success:hover,.btn-info,.btn-info:hover,.btn-inverse,.btn-inverse:hover{text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);color:#ffffff;} .btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255, 255, 255, 0.75);} .btn-primary{background-color:#0074cc;background-image:-moz-linear-gradient(top, #0088cc, #0055cc);background-image:-ms-linear-gradient(top, #0088cc, #0055cc);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0055cc));background-image:-webkit-linear-gradient(top, #0088cc, #0055cc);background-image:-o-linear-gradient(top, #0088cc, #0055cc);background-image:linear-gradient(top, #0088cc, #0055cc);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0055cc', GradientType=0);border-color:#0055cc #0055cc #003580;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:dximagetransform.microsoft.gradient(enabled=false);}.btn-primary:hover,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{background-color:#0055cc;} .btn-primary:active,.btn-primary.active{background-color:#004099 \9;} .btn-warning{background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-ms-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(top, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0);border-color:#f89406 #f89406 #ad6704;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:dximagetransform.microsoft.gradient(enabled=false);}.btn-warning:hover,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{background-color:#f89406;} .btn-warning:active,.btn-warning.active{background-color:#c67605 \9;} .btn-danger{background-color:#da4f49;background-image:-moz-linear-gradient(top, #ee5f5b, #bd362f);background-image:-ms-linear-gradient(top, #ee5f5b, #bd362f);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));background-image:-webkit-linear-gradient(top, #ee5f5b, #bd362f);background-image:-o-linear-gradient(top, #ee5f5b, #bd362f);background-image:linear-gradient(top, #ee5f5b, #bd362f);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#bd362f', GradientType=0);border-color:#bd362f #bd362f #802420;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:dximagetransform.microsoft.gradient(enabled=false);}.btn-danger:hover,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{background-color:#bd362f;} .btn-danger:active,.btn-danger.active{background-color:#942a25 \9;} .btn-success{background-color:#5bb75b;background-image:-moz-linear-gradient(top, #62c462, #51a351);background-image:-ms-linear-gradient(top, #62c462, #51a351);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));background-image:-webkit-linear-gradient(top, #62c462, #51a351);background-image:-o-linear-gradient(top, #62c462, #51a351);background-image:linear-gradient(top, #62c462, #51a351);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#51a351', GradientType=0);border-color:#51a351 #51a351 #387038;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:dximagetransform.microsoft.gradient(enabled=false);}.btn-success:hover,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{background-color:#51a351;} .btn-success:active,.btn-success.active{background-color:#408140 \9;} .btn-info{background-color:#49afcd;background-image:-moz-linear-gradient(top, #5bc0de, #2f96b4);background-image:-ms-linear-gradient(top, #5bc0de, #2f96b4);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));background-image:-webkit-linear-gradient(top, #5bc0de, #2f96b4);background-image:-o-linear-gradient(top, #5bc0de, #2f96b4);background-image:linear-gradient(top, #5bc0de, #2f96b4);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#2f96b4', GradientType=0);border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:dximagetransform.microsoft.gradient(enabled=false);}.btn-info:hover,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{background-color:#2f96b4;} .btn-info:active,.btn-info.active{background-color:#24748c \9;} .btn-inverse{background-color:#414141;background-image:-moz-linear-gradient(top, #555555, #222222);background-image:-ms-linear-gradient(top, #555555, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#555555), to(#222222));background-image:-webkit-linear-gradient(top, #555555, #222222);background-image:-o-linear-gradient(top, #555555, #222222);background-image:linear-gradient(top, #555555, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#555555', endColorstr='#222222', GradientType=0);border-color:#222222 #222222 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:dximagetransform.microsoft.gradient(enabled=false);}.btn-inverse:hover,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{background-color:#222222;} .btn-inverse:active,.btn-inverse.active{background-color:#080808 \9;} button.btn,input[type="submit"].btn{*padding-top:2px;*padding-bottom:2px;}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0;} button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px;} button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px;} button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px;} .btn-group{position:relative;*zoom:1;*margin-left:.3em;}.btn-group:before,.btn-group:after{display:table;content:"";} .btn-group:after{clear:both;} .btn-group:first-child{*margin-left:0;} .btn-group+.btn-group{margin-left:5px;} .btn-toolbar{margin-top:9px;margin-bottom:9px;}.btn-toolbar .btn-group{display:inline-block;*display:inline;*zoom:1;} .btn-group .btn{position:relative;float:left;margin-left:-1px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} .btn-group .btn:first-child{margin-left:0;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;} .btn-group .btn:last-child,.btn-group .dropdown-toggle{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;} .btn-group .btn.large:first-child{margin-left:0;-webkit-border-top-left-radius:6px;-moz-border-radius-topleft:6px;border-top-left-radius:6px;-webkit-border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px;border-bottom-left-radius:6px;} .btn-group .btn.large:last-child,.btn-group .large.dropdown-toggle{-webkit-border-top-right-radius:6px;-moz-border-radius-topright:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px;border-bottom-right-radius:6px;} .btn-group .btn:hover,.btn-group .btn:focus,.btn-group .btn:active,.btn-group .btn.active{z-index:2;} .btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0;} .btn-group .dropdown-toggle{padding-left:8px;padding-right:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);*padding-top:3px;*padding-bottom:3px;} .btn-group .btn-mini.dropdown-toggle{padding-left:5px;padding-right:5px;*padding-top:1px;*padding-bottom:1px;} .btn-group .btn-small.dropdown-toggle{*padding-top:4px;*padding-bottom:4px;} .btn-group .btn-large.dropdown-toggle{padding-left:12px;padding-right:12px;} .btn-group.open{*z-index:1000;}.btn-group.open .dropdown-menu{display:block;margin-top:1px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} .btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);} .btn .caret{margin-top:7px;margin-left:0;} .btn:hover .caret,.open.btn-group .caret{opacity:1;filter:alpha(opacity=100);} .btn-mini .caret{margin-top:5px;} .btn-small .caret{margin-top:6px;} .btn-large .caret{margin-top:6px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;} .btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;opacity:0.75;filter:alpha(opacity=75);} .alert{padding:8px 35px 8px 14px;margin-bottom:18px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;color:#c09853;} .alert-heading{color:inherit;} .alert .close{position:relative;top:-2px;right:-21px;line-height:18px;} .alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#468847;} .alert-danger,.alert-error{background-color:#f2dede;border-color:#eed3d7;color:#b94a48;} .alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#3a87ad;} .alert-block{padding-top:14px;padding-bottom:14px;} .alert-block>p,.alert-block>ul{margin-bottom:0;} .alert-block p+p{margin-top:5px;} .nav{margin-left:0;margin-bottom:18px;list-style:none;} .nav>li>a{display:block;} .nav>li>a:hover{text-decoration:none;background-color:#eeeeee;} .nav .nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:18px;color:#999999;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);text-transform:uppercase;} .nav li+.nav-header{margin-top:9px;} .nav-list{padding-left:15px;padding-right:15px;margin-bottom:0;} .nav-list>li>a,.nav-list .nav-header{margin-left:-15px;margin-right:-15px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);} .nav-list>li>a{padding:3px 15px;} .nav-list>.active>a,.nav-list>.active>a:hover{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.2);background-color:#0088cc;} .nav-list [class^="icon-"]{margin-right:2px;} .nav-list .divider{height:1px;margin:8px 1px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;*width:100%;*margin:-5px 0 5px;} .nav-tabs,.nav-pills{*zoom:1;}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;content:"";} .nav-tabs:after,.nav-pills:after{clear:both;} .nav-tabs>li,.nav-pills>li{float:left;} .nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px;} .nav-tabs{border-bottom:1px solid #ddd;} .nav-tabs>li{margin-bottom:-1px;} .nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:18px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #dddddd;} .nav-tabs>.active>a,.nav-tabs>.active>a:hover{color:#555555;background-color:#ffffff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default;} .nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} .nav-pills>.active>a,.nav-pills>.active>a:hover{color:#ffffff;background-color:#0088cc;} .nav-stacked>li{float:none;} .nav-stacked>li>a{margin-right:0;} .nav-tabs.nav-stacked{border-bottom:0;} .nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} .nav-tabs.nav-stacked>li:first-child>a{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;} .nav-tabs.nav-stacked>li:last-child>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;} .nav-tabs.nav-stacked>li>a:hover{border-color:#ddd;z-index:2;} .nav-pills.nav-stacked>li>a{margin-bottom:3px;} .nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px;} .nav-tabs .dropdown-menu,.nav-pills .dropdown-menu{margin-top:1px;border-width:1px;} .nav-pills .dropdown-menu{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} .nav-tabs .dropdown-toggle .caret,.nav-pills .dropdown-toggle .caret{border-top-color:#0088cc;border-bottom-color:#0088cc;margin-top:6px;} .nav-tabs .dropdown-toggle:hover .caret,.nav-pills .dropdown-toggle:hover .caret{border-top-color:#005580;border-bottom-color:#005580;} .nav-tabs .active .dropdown-toggle .caret,.nav-pills .active .dropdown-toggle .caret{border-top-color:#333333;border-bottom-color:#333333;} .nav>.dropdown.active>a:hover{color:#000000;cursor:pointer;} .nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>.open.active>a:hover{color:#ffffff;background-color:#999999;border-color:#999999;} .nav .open .caret,.nav .open.active .caret,.nav .open a:hover .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;opacity:1;filter:alpha(opacity=100);} .tabs-stacked .open>a:hover{border-color:#999999;} .tabbable{*zoom:1;}.tabbable:before,.tabbable:after{display:table;content:"";} .tabbable:after{clear:both;} .tab-content{display:table;width:100%;} .tabs-below .nav-tabs,.tabs-right .nav-tabs,.tabs-left .nav-tabs{border-bottom:0;} .tab-content>.tab-pane,.pill-content>.pill-pane{display:none;} .tab-content>.active,.pill-content>.active{display:block;} .tabs-below .nav-tabs{border-top:1px solid #ddd;} .tabs-below .nav-tabs>li{margin-top:-1px;margin-bottom:0;} .tabs-below .nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}.tabs-below .nav-tabs>li>a:hover{border-bottom-color:transparent;border-top-color:#ddd;} .tabs-below .nav-tabs .active>a,.tabs-below .nav-tabs .active>a:hover{border-color:transparent #ddd #ddd #ddd;} .tabs-left .nav-tabs>li,.tabs-right .nav-tabs>li{float:none;} .tabs-left .nav-tabs>li>a,.tabs-right .nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px;} .tabs-left .nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd;} .tabs-left .nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;} .tabs-left .nav-tabs>li>a:hover{border-color:#eeeeee #dddddd #eeeeee #eeeeee;} .tabs-left .nav-tabs .active>a,.tabs-left .nav-tabs .active>a:hover{border-color:#ddd transparent #ddd #ddd;*border-right-color:#ffffff;} .tabs-right .nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd;} .tabs-right .nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;} .tabs-right .nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #eeeeee #dddddd;} .tabs-right .nav-tabs .active>a,.tabs-right .nav-tabs .active>a:hover{border-color:#ddd #ddd #ddd transparent;*border-left-color:#ffffff;} .navbar{*position:relative;*z-index:2;overflow:visible;margin-bottom:18px;} .navbar-inner{padding-left:20px;padding-right:20px;background-color:#2c2c2c;background-image:-moz-linear-gradient(top, #333333, #222222);background-image:-ms-linear-gradient(top, #333333, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));background-image:-webkit-linear-gradient(top, #333333, #222222);background-image:-o-linear-gradient(top, #333333, #222222);background-image:linear-gradient(top, #333333, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);} .navbar .container{width:auto;} .btn-navbar{display:none;float:right;padding:7px 10px;margin-left:5px;margin-right:5px;background-color:#2c2c2c;background-image:-moz-linear-gradient(top, #333333, #222222);background-image:-ms-linear-gradient(top, #333333, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));background-image:-webkit-linear-gradient(top, #333333, #222222);background-image:-o-linear-gradient(top, #333333, #222222);background-image:linear-gradient(top, #333333, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);border-color:#222222 #222222 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:dximagetransform.microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);}.btn-navbar:hover,.btn-navbar:active,.btn-navbar.active,.btn-navbar.disabled,.btn-navbar[disabled]{background-color:#222222;} .btn-navbar:active,.btn-navbar.active{background-color:#080808 \9;} .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);-moz-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);} .btn-navbar .icon-bar+.icon-bar{margin-top:3px;} .nav-collapse.collapse{height:auto;} .navbar{color:#999999;}.navbar .brand:hover{text-decoration:none;} .navbar .brand{float:left;display:block;padding:8px 20px 12px;margin-left:-20px;font-size:20px;font-weight:200;line-height:1;color:#ffffff;} .navbar .navbar-text{margin-bottom:0;line-height:40px;} .navbar .btn,.navbar .btn-group{margin-top:5px;} .navbar .btn-group .btn{margin-top:0;} .navbar-form{margin-bottom:0;*zoom:1;}.navbar-form:before,.navbar-form:after{display:table;content:"";} .navbar-form:after{clear:both;} .navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px;} .navbar-form input,.navbar-form select{display:inline-block;margin-bottom:0;} .navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px;} .navbar-form .input-append,.navbar-form .input-prepend{margin-top:6px;white-space:nowrap;}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0;} .navbar-search{position:relative;float:left;margin-top:6px;margin-bottom:0;}.navbar-search .search-query{padding:4px 9px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;color:#ffffff;background-color:#626262;border:1px solid #151515;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none;}.navbar-search .search-query:-moz-placeholder{color:#cccccc;} .navbar-search .search-query::-webkit-input-placeholder{color:#cccccc;} .navbar-search .search-query:focus,.navbar-search .search-query.focused{padding:5px 10px;color:#333333;text-shadow:0 1px 0 #ffffff;background-color:#ffffff;border:0;-webkit-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);-moz-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);box-shadow:0 0 3px rgba(0, 0, 0, 0.15);outline:0;} .navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0;} .navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-left:0;padding-right:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} .navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px;} .navbar-fixed-top{top:0;} .navbar-fixed-bottom{bottom:0;} .navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0;} .navbar .nav.pull-right{float:right;} .navbar .nav>li{display:block;float:left;} .navbar .nav>li>a{float:none;padding:10px 10px 11px;line-height:19px;color:#999999;text-decoration:none;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);} .navbar .nav>li>a:hover{background-color:transparent;color:#ffffff;text-decoration:none;} .navbar .nav .active>a,.navbar .nav .active>a:hover{color:#ffffff;text-decoration:none;background-color:#222222;} .navbar .divider-vertical{height:40px;width:1px;margin:0 9px;overflow:hidden;background-color:#222222;border-right:1px solid #333333;} .navbar .nav.pull-right{margin-left:10px;margin-right:0;} .navbar .dropdown-menu{margin-top:1px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.navbar .dropdown-menu:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0, 0, 0, 0.2);position:absolute;top:-7px;left:9px;} .navbar .dropdown-menu:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #ffffff;position:absolute;top:-6px;left:10px;} .navbar-fixed-bottom .dropdown-menu:before{border-top:7px solid #ccc;border-top-color:rgba(0, 0, 0, 0.2);border-bottom:0;bottom:-7px;top:auto;} .navbar-fixed-bottom .dropdown-menu:after{border-top:6px solid #ffffff;border-bottom:0;bottom:-6px;top:auto;} .navbar .nav .dropdown-toggle .caret,.navbar .nav .open.dropdown .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;} .navbar .nav .active .caret{opacity:1;filter:alpha(opacity=100);} .navbar .nav .open>.dropdown-toggle,.navbar .nav .active>.dropdown-toggle,.navbar .nav .open.active>.dropdown-toggle{background-color:transparent;} .navbar .nav .active>.dropdown-toggle:hover{color:#ffffff;} .navbar .nav.pull-right .dropdown-menu,.navbar .nav .dropdown-menu.pull-right{left:auto;right:0;}.navbar .nav.pull-right .dropdown-menu:before,.navbar .nav .dropdown-menu.pull-right:before{left:auto;right:12px;} .navbar .nav.pull-right .dropdown-menu:after,.navbar .nav .dropdown-menu.pull-right:after{left:auto;right:13px;} .breadcrumb{padding:7px 14px;margin:0 0 18px;list-style:none;background-color:#fbfbfb;background-image:-moz-linear-gradient(top, #ffffff, #f5f5f5);background-image:-ms-linear-gradient(top, #ffffff, #f5f5f5);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f5f5f5));background-image:-webkit-linear-gradient(top, #ffffff, #f5f5f5);background-image:-o-linear-gradient(top, #ffffff, #f5f5f5);background-image:linear-gradient(top, #ffffff, #f5f5f5);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0);border:1px solid #ddd;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;}.breadcrumb li{display:inline-block;*display:inline;*zoom:1;text-shadow:0 1px 0 #ffffff;} .breadcrumb .divider{padding:0 5px;color:#999999;} .breadcrumb .active a{color:#333333;} .pagination{height:36px;margin:18px 0;} .pagination ul{display:inline-block;*display:inline;*zoom:1;margin-left:0;margin-bottom:0;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);} .pagination li{display:inline;} .pagination a{float:left;padding:0 14px;line-height:34px;text-decoration:none;border:1px solid #ddd;border-left-width:0;} .pagination a:hover,.pagination .active a{background-color:#f5f5f5;} .pagination .active a{color:#999999;cursor:default;} .pagination .disabled span,.pagination .disabled a,.pagination .disabled a:hover{color:#999999;background-color:transparent;cursor:default;} .pagination li:first-child a{border-left-width:1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} .pagination li:last-child a{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;} .pagination-centered{text-align:center;} .pagination-right{text-align:right;} .pager{margin-left:0;margin-bottom:18px;list-style:none;text-align:center;*zoom:1;}.pager:before,.pager:after{display:table;content:"";} .pager:after{clear:both;} .pager li{display:inline;} .pager a{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;} .pager a:hover{text-decoration:none;background-color:#f5f5f5;} .pager .next a{float:right;} .pager .previous a{float:left;} .pager .disabled a,.pager .disabled a:hover{color:#999999;background-color:#fff;cursor:default;} .modal-open .dropdown-menu{z-index:2050;} .modal-open .dropdown.open{*z-index:2050;} .modal-open .popover{z-index:2060;} .modal-open .tooltip{z-index:2070;} .modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000;}.modal-backdrop.fade{opacity:0;} .modal-backdrop,.modal-backdrop.fade.in{opacity:0.8;filter:alpha(opacity=80);} .modal{position:fixed;top:50%;left:50%;z-index:1050;overflow:auto;width:560px;margin:-250px 0 0 -280px;background-color:#ffffff;border:1px solid #999;border:1px solid rgba(0, 0, 0, 0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.modal.fade{-webkit-transition:opacity .3s linear, top .3s ease-out;-moz-transition:opacity .3s linear, top .3s ease-out;-ms-transition:opacity .3s linear, top .3s ease-out;-o-transition:opacity .3s linear, top .3s ease-out;transition:opacity .3s linear, top .3s ease-out;top:-25%;} .modal.fade.in{top:50%;} .modal-header{padding:9px 15px;border-bottom:1px solid #eee;}.modal-header .close{margin-top:2px;} .modal-body{overflow-y:auto;max-height:400px;padding:15px;} .modal-form{margin-bottom:0;} .modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;*zoom:1;}.modal-footer:before,.modal-footer:after{display:table;content:"";} .modal-footer:after{clear:both;} .modal-footer .btn+.btn{margin-left:5px;margin-bottom:0;} .modal-footer .btn-group .btn+.btn{margin-left:-1px;} .tooltip{position:absolute;z-index:1020;display:block;visibility:visible;padding:5px;font-size:11px;opacity:0;filter:alpha(opacity=0);}.tooltip.in{opacity:0.8;filter:alpha(opacity=80);} .tooltip.top{margin-top:-2px;} .tooltip.right{margin-left:2px;} .tooltip.bottom{margin-top:2px;} .tooltip.left{margin-left:-2px;} .tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;} .tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;} .tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;} .tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;} .tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;text-decoration:none;background-color:#000000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} .tooltip-arrow{position:absolute;width:0;height:0;} .popover{position:absolute;top:0;left:0;z-index:1010;display:none;padding:5px;}.popover.top{margin-top:-5px;} .popover.right{margin-left:5px;} .popover.bottom{margin-top:5px;} .popover.left{margin-left:-5px;} .popover.top .arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;} .popover.right .arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;} .popover.bottom .arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;} .popover.left .arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;} .popover .arrow{position:absolute;width:0;height:0;} .popover-inner{padding:3px;width:280px;overflow:hidden;background:#000000;background:rgba(0, 0, 0, 0.8);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);} .popover-title{padding:9px 15px;line-height:1;background-color:#f5f5f5;border-bottom:1px solid #eee;-webkit-border-radius:3px 3px 0 0;-moz-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;} .popover-content{padding:14px;background-color:#ffffff;-webkit-border-radius:0 0 3px 3px;-moz-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.popover-content p,.popover-content ul,.popover-content ol{margin-bottom:0;} .thumbnails{margin-left:-20px;list-style:none;*zoom:1;}.thumbnails:before,.thumbnails:after{display:table;content:"";} .thumbnails:after{clear:both;} .thumbnails>li{float:left;margin:0 0 18px 20px;} .thumbnail{display:block;padding:4px;line-height:1;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);} a.thumbnail:hover{border-color:#0088cc;-webkit-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);-moz-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);} .thumbnail>img{display:block;max-width:100%;margin-left:auto;margin-right:auto;} .thumbnail .caption{padding:9px;} .label{padding:1px 4px 2px;font-size:10.998px;font-weight:bold;line-height:13px;color:#ffffff;vertical-align:middle;white-space:nowrap;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#999999;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} .label:hover{color:#ffffff;text-decoration:none;} .label-important{background-color:#b94a48;} .label-important:hover{background-color:#953b39;} .label-warning{background-color:#f89406;} .label-warning:hover{background-color:#c67605;} .label-success{background-color:#468847;} .label-success:hover{background-color:#356635;} .label-info{background-color:#3a87ad;} .label-info:hover{background-color:#2d6987;} .label-inverse{background-color:#333333;} .label-inverse:hover{background-color:#1a1a1a;} .badge{padding:1px 9px 2px;font-size:12.025px;font-weight:bold;white-space:nowrap;color:#ffffff;background-color:#999999;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px;} .badge:hover{color:#ffffff;text-decoration:none;cursor:pointer;} .badge-error{background-color:#b94a48;} .badge-error:hover{background-color:#953b39;} .badge-warning{background-color:#f89406;} .badge-warning:hover{background-color:#c67605;} .badge-success{background-color:#468847;} .badge-success:hover{background-color:#356635;} .badge-info{background-color:#3a87ad;} .badge-info:hover{background-color:#2d6987;} .badge-inverse{background-color:#333333;} .badge-inverse:hover{background-color:#1a1a1a;} @-webkit-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@-moz-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@-ms-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}.progress{overflow:hidden;height:18px;margin-bottom:18px;background-color:#f7f7f7;background-image:-moz-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-ms-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));background-image:-webkit-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-o-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:linear-gradient(top, #f5f5f5, #f9f9f9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5', endColorstr='#f9f9f9', GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} .progress .bar{width:0%;height:18px;color:#ffffff;font-size:12px;text-align:center;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top, #149bdf, #0480be);background-image:-ms-linear-gradient(top, #149bdf, #0480be);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));background-image:-webkit-linear-gradient(top, #149bdf, #0480be);background-image:-o-linear-gradient(top, #149bdf, #0480be);background-image:linear-gradient(top, #149bdf, #0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#149bdf', endColorstr='#0480be', GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width 0.6s ease;-moz-transition:width 0.6s ease;-ms-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease;} .progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px;} .progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite;} .progress-danger .bar{background-color:#dd514c;background-image:-moz-linear-gradient(top, #ee5f5b, #c43c35);background-image:-ms-linear-gradient(top, #ee5f5b, #c43c35);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));background-image:-webkit-linear-gradient(top, #ee5f5b, #c43c35);background-image:-o-linear-gradient(top, #ee5f5b, #c43c35);background-image:linear-gradient(top, #ee5f5b, #c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);} .progress-danger.progress-striped .bar{background-color:#ee5f5b;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} .progress-success .bar{background-color:#5eb95e;background-image:-moz-linear-gradient(top, #62c462, #57a957);background-image:-ms-linear-gradient(top, #62c462, #57a957);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));background-image:-webkit-linear-gradient(top, #62c462, #57a957);background-image:-o-linear-gradient(top, #62c462, #57a957);background-image:linear-gradient(top, #62c462, #57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0);} .progress-success.progress-striped .bar{background-color:#62c462;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} .progress-info .bar{background-color:#4bb1cf;background-image:-moz-linear-gradient(top, #5bc0de, #339bb9);background-image:-ms-linear-gradient(top, #5bc0de, #339bb9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));background-image:-webkit-linear-gradient(top, #5bc0de, #339bb9);background-image:-o-linear-gradient(top, #5bc0de, #339bb9);background-image:linear-gradient(top, #5bc0de, #339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0);} .progress-info.progress-striped .bar{background-color:#5bc0de;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} .progress-warning .bar{background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-ms-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(top, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0);} .progress-warning.progress-striped .bar{background-color:#fbb450;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} .accordion{margin-bottom:18px;} .accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} .accordion-heading{border-bottom:0;} .accordion-heading .accordion-toggle{display:block;padding:8px 15px;} .accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5;} .carousel{position:relative;margin-bottom:18px;line-height:1;} .carousel-inner{overflow:hidden;width:100%;position:relative;} .carousel .item{display:none;position:relative;-webkit-transition:0.6s ease-in-out left;-moz-transition:0.6s ease-in-out left;-ms-transition:0.6s ease-in-out left;-o-transition:0.6s ease-in-out left;transition:0.6s ease-in-out left;} .carousel .item>img{display:block;line-height:1;} .carousel .active,.carousel .next,.carousel .prev{display:block;} .carousel .active{left:0;} .carousel .next,.carousel .prev{position:absolute;top:0;width:100%;} .carousel .next{left:100%;} .carousel .prev{left:-100%;} .carousel .next.left,.carousel .prev.right{left:0;} .carousel .active.left{left:-100%;} .carousel .active.right{left:100%;} .carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#ffffff;text-align:center;background:#222222;border:3px solid #ffffff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:0.5;filter:alpha(opacity=50);}.carousel-control.right{left:auto;right:15px;} .carousel-control:hover{color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90);} .carousel-caption{position:absolute;left:0;right:0;bottom:0;padding:10px 15px 5px;background:#333333;background:rgba(0, 0, 0, 0.75);} .carousel-caption h4,.carousel-caption p{color:#ffffff;} .hero-unit{padding:60px;margin-bottom:30px;background-color:#eeeeee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;color:inherit;letter-spacing:-1px;} .hero-unit p{font-size:18px;font-weight:200;line-height:27px;color:inherit;} .pull-right{float:right;} .pull-left{float:left;} .hide{display:none;} .show{display:block;} .invisible{visibility:hidden;} flask-peewee-3.0.6/flask_peewee/static/css/bootstrap.min.responsive.css000066400000000000000000000170001460575705200263170ustar00rootroot00000000000000 .hidden{display:none;visibility:hidden;} @media (max-width:480px){.nav-collapse{-webkit-transform:translate3d(0, 0, 0);} .page-header h1 small{display:block;line-height:18px;} input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;height:28px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;} .input-prepend input[class*="span"],.input-append input[class*="span"]{width:auto;} input[type="checkbox"],input[type="radio"]{border:1px solid #ccc;} .form-horizontal .control-group>label{float:none;width:auto;padding-top:0;text-align:left;} .form-horizontal .controls{margin-left:0;} .form-horizontal .control-list{padding-top:0;} .form-horizontal .form-actions{padding-left:10px;padding-right:10px;} .modal{position:absolute;top:10px;left:10px;right:10px;width:auto;margin:0;}.modal.fade.in{top:auto;} .modal-header .close{padding:10px;margin:-10px;} .carousel-caption{position:static;}}@media (max-width:768px){.container{width:auto;padding:0 20px;} .row-fluid{width:100%;} .row{margin-left:0;} .row>[class*="span"],.row-fluid>[class*="span"]{float:none;display:block;width:auto;margin:0;}}@media (min-width:768px) and (max-width:980px){.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";} .row:after{clear:both;} [class*="span"]{float:left;margin-left:20px;} .span1{width:42px;} .span2{width:104px;} .span3{width:166px;} .span4{width:228px;} .span5{width:290px;} .span6{width:352px;} .span7{width:414px;} .span8{width:476px;} .span9{width:538px;} .span10{width:600px;} .span11{width:662px;} .span12,.container{width:724px;} .offset1{margin-left:82px;} .offset2{margin-left:144px;} .offset3{margin-left:206px;} .offset4{margin-left:268px;} .offset5{margin-left:330px;} .offset6{margin-left:392px;} .offset7{margin-left:454px;} .offset8{margin-left:516px;} .offset9{margin-left:578px;} .offset10{margin-left:640px;} .offset11{margin-left:702px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} .row-fluid:after{clear:both;} .row-fluid>[class*="span"]{float:left;margin-left:2.762430939%;} .row-fluid>[class*="span"]:first-child{margin-left:0;} .row-fluid .span1{width:5.801104972%;} .row-fluid .span2{width:14.364640883%;} .row-fluid .span3{width:22.928176794%;} .row-fluid .span4{width:31.491712705%;} .row-fluid .span5{width:40.055248616%;} .row-fluid .span6{width:48.618784527%;} .row-fluid .span7{width:57.182320438000005%;} .row-fluid .span8{width:65.74585634900001%;} .row-fluid .span9{width:74.30939226%;} .row-fluid .span10{width:82.87292817100001%;} .row-fluid .span11{width:91.436464082%;} .row-fluid .span12{width:99.999999993%;} input.span1,textarea.span1,.uneditable-input.span1{width:32px;} input.span2,textarea.span2,.uneditable-input.span2{width:94px;} input.span3,textarea.span3,.uneditable-input.span3{width:156px;} input.span4,textarea.span4,.uneditable-input.span4{width:218px;} input.span5,textarea.span5,.uneditable-input.span5{width:280px;} input.span6,textarea.span6,.uneditable-input.span6{width:342px;} input.span7,textarea.span7,.uneditable-input.span7{width:404px;} input.span8,textarea.span8,.uneditable-input.span8{width:466px;} input.span9,textarea.span9,.uneditable-input.span9{width:528px;} input.span10,textarea.span10,.uneditable-input.span10{width:590px;} input.span11,textarea.span11,.uneditable-input.span11{width:652px;} input.span12,textarea.span12,.uneditable-input.span12{width:714px;}}@media (max-width:980px){body{padding-top:0;} .navbar-fixed-top{position:static;margin-bottom:18px;} .navbar-fixed-top .navbar-inner{padding:5px;} .navbar .container{width:auto;padding:0;} .navbar .brand{padding-left:10px;padding-right:10px;margin:0 0 0 -5px;} .navbar .nav-collapse{clear:left;} .navbar .nav{float:none;margin:0 0 9px;} .navbar .nav>li{float:none;} .navbar .nav>li>a{margin-bottom:2px;} .navbar .nav>.divider-vertical{display:none;} .navbar .nav>li>a,.navbar .dropdown-menu a{padding:6px 15px;font-weight:bold;color:#999999;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} .navbar .dropdown-menu li+li a{margin-bottom:2px;} .navbar .nav>li>a:hover,.navbar .dropdown-menu a:hover{background-color:#222222;} .navbar .dropdown-menu{position:static;top:auto;left:auto;float:none;display:block;max-width:none;margin:0 15px;padding:0;background-color:transparent;border:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} .navbar .dropdown-menu:before,.navbar .dropdown-menu:after{display:none;} .navbar .dropdown-menu .divider{display:none;} .navbar-form,.navbar-search{float:none;padding:9px 15px;margin:9px 0;border-top:1px solid #222222;border-bottom:1px solid #222222;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);} .navbar .nav.pull-right{float:none;margin-left:0;} .navbar-static .navbar-inner{padding-left:10px;padding-right:10px;} .btn-navbar{display:block;} .nav-collapse{overflow:hidden;height:0;}}@media (min-width:980px){.nav-collapse.collapse{height:auto !important;}}@media (min-width:1200px){.row{margin-left:-30px;*zoom:1;}.row:before,.row:after{display:table;content:"";} .row:after{clear:both;} [class*="span"]{float:left;margin-left:30px;} .span1{width:70px;} .span2{width:170px;} .span3{width:270px;} .span4{width:370px;} .span5{width:470px;} .span6{width:570px;} .span7{width:670px;} .span8{width:770px;} .span9{width:870px;} .span10{width:970px;} .span11{width:1070px;} .span12,.container{width:1170px;} .offset1{margin-left:130px;} .offset2{margin-left:230px;} .offset3{margin-left:330px;} .offset4{margin-left:430px;} .offset5{margin-left:530px;} .offset6{margin-left:630px;} .offset7{margin-left:730px;} .offset8{margin-left:830px;} .offset9{margin-left:930px;} .offset10{margin-left:1030px;} .offset11{margin-left:1130px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} .row-fluid:after{clear:both;} .row-fluid>[class*="span"]{float:left;margin-left:2.564102564%;} .row-fluid>[class*="span"]:first-child{margin-left:0;} .row-fluid .span1{width:5.982905983%;} .row-fluid .span2{width:14.529914530000001%;} .row-fluid .span3{width:23.076923077%;} .row-fluid .span4{width:31.623931624%;} .row-fluid .span5{width:40.170940171000005%;} .row-fluid .span6{width:48.717948718%;} .row-fluid .span7{width:57.264957265%;} .row-fluid .span8{width:65.81196581200001%;} .row-fluid .span9{width:74.358974359%;} .row-fluid .span10{width:82.905982906%;} .row-fluid .span11{width:91.45299145300001%;} .row-fluid .span12{width:100%;} input.span1,textarea.span1,.uneditable-input.span1{width:60px;} input.span2,textarea.span2,.uneditable-input.span2{width:160px;} input.span3,textarea.span3,.uneditable-input.span3{width:260px;} input.span4,textarea.span4,.uneditable-input.span4{width:360px;} input.span5,textarea.span5,.uneditable-input.span5{width:460px;} input.span6,textarea.span6,.uneditable-input.span6{width:560px;} input.span7,textarea.span7,.uneditable-input.span7{width:660px;} input.span8,textarea.span8,.uneditable-input.span8{width:760px;} input.span9,textarea.span9,.uneditable-input.span9{width:860px;} input.span10,textarea.span10,.uneditable-input.span10{width:960px;} input.span11,textarea.span11,.uneditable-input.span11{width:1060px;} input.span12,textarea.span12,.uneditable-input.span12{width:1160px;} .thumbnails{margin-left:-30px;} .thumbnails>li{margin-left:30px;}} flask-peewee-3.0.6/flask_peewee/static/css/chosen-sprite.png000066400000000000000000000010571460575705200241100ustar00rootroot00000000000000PNG  IHDR<(IDAThMKQEZD6eh"MQwm q" " Ȭ6E-E(}8d#jq.<`dϹ@\x.o6 Ȃ+ai=澴[B\?9l QHquC0Ba*;5szl&<.<\1=`OP}DIԐ?ae)6ߙD|D))3(,8^pdd=}1P*J$}G;sUԕiFȖ8G EJzJZpez4dsALֈ/ P YQ6("91Niё Ӝ 9Qz{\x8b{y;Zs+qLsuO@JqU jMi?AXJGEʠo w(QgIENDB`flask-peewee-3.0.6/flask_peewee/static/css/chosen.css000066400000000000000000000333241460575705200226120ustar00rootroot00000000000000/* @group Base */ .chzn-container { font-size: 13px; position: relative; display: inline-block; zoom: 1; *display: inline; } .chzn-container .chzn-drop { background: #fff; border: 1px solid #aaa; border-top: 0; position: absolute; top: 29px; left: 0; -webkit-box-shadow: 0 4px 5px rgba(0,0,0,.15); -moz-box-shadow : 0 4px 5px rgba(0,0,0,.15); -o-box-shadow : 0 4px 5px rgba(0,0,0,.15); box-shadow : 0 4px 5px rgba(0,0,0,.15); z-index: 1010; } /* @end */ /* @group Single Chosen */ .chzn-container-single .chzn-single { background-color: #ffffff; filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0 ); background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #ffffff), color-stop(50%, #f6f6f6), color-stop(52%, #eeeeee), color-stop(100%, #f4f4f4)); background-image: -webkit-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%); background-image: -moz-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%); background-image: -o-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%); background-image: -ms-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%); background-image: linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%); -webkit-border-radius: 5px; -moz-border-radius : 5px; border-radius : 5px; -moz-background-clip : padding; -webkit-background-clip: padding-box; background-clip : padding-box; border: 1px solid #aaaaaa; -webkit-box-shadow: 0 0 3px #ffffff inset, 0 1px 1px rgba(0,0,0,0.1); -moz-box-shadow : 0 0 3px #ffffff inset, 0 1px 1px rgba(0,0,0,0.1); box-shadow : 0 0 3px #ffffff inset, 0 1px 1px rgba(0,0,0,0.1); display: block; overflow: hidden; white-space: nowrap; position: relative; height: 23px; line-height: 24px; padding: 0 0 0 8px; color: #444444; text-decoration: none; } .chzn-container-single .chzn-default { color: #999; } .chzn-container-single .chzn-single span { margin-right: 26px; display: block; overflow: hidden; white-space: nowrap; -o-text-overflow: ellipsis; -ms-text-overflow: ellipsis; text-overflow: ellipsis; } .chzn-container-single .chzn-single abbr { display: block; position: absolute; right: 26px; top: 6px; width: 12px; height: 13px; font-size: 1px; background: url('chosen-sprite.png') right top no-repeat; } .chzn-container-single .chzn-single abbr:hover { background-position: right -11px; } .chzn-container-single.chzn-disabled .chzn-single abbr:hover { background-position: right top; } .chzn-container-single .chzn-single div { position: absolute; right: 0; top: 0; display: block; height: 100%; width: 18px; } .chzn-container-single .chzn-single div b { background: url('chosen-sprite.png') no-repeat 0 0; display: block; width: 100%; height: 100%; } .chzn-container-single .chzn-search { padding: 3px 4px; position: relative; margin: 0; white-space: nowrap; z-index: 1010; } .chzn-container-single .chzn-search input { background: #fff url('chosen-sprite.png') no-repeat 100% -22px; background: url('chosen-sprite.png') no-repeat 100% -22px, -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff)); background: url('chosen-sprite.png') no-repeat 100% -22px, -webkit-linear-gradient(top, #eeeeee 1%, #ffffff 15%); background: url('chosen-sprite.png') no-repeat 100% -22px, -moz-linear-gradient(top, #eeeeee 1%, #ffffff 15%); background: url('chosen-sprite.png') no-repeat 100% -22px, -o-linear-gradient(top, #eeeeee 1%, #ffffff 15%); background: url('chosen-sprite.png') no-repeat 100% -22px, -ms-linear-gradient(top, #eeeeee 1%, #ffffff 15%); background: url('chosen-sprite.png') no-repeat 100% -22px, linear-gradient(top, #eeeeee 1%, #ffffff 15%); margin: 1px 0; padding: 4px 20px 4px 5px; outline: 0; border: 1px solid #aaa; font-family: sans-serif; font-size: 1em; } .chzn-container-single .chzn-drop { -webkit-border-radius: 0 0 4px 4px; -moz-border-radius : 0 0 4px 4px; border-radius : 0 0 4px 4px; -moz-background-clip : padding; -webkit-background-clip: padding-box; background-clip : padding-box; } /* @end */ .chzn-container-single-nosearch .chzn-search input { position: absolute; left: -9000px; } /* @group Multi Chosen */ .chzn-container-multi .chzn-choices { background-color: #fff; background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff)); background-image: -webkit-linear-gradient(top, #eeeeee 1%, #ffffff 15%); background-image: -moz-linear-gradient(top, #eeeeee 1%, #ffffff 15%); background-image: -o-linear-gradient(top, #eeeeee 1%, #ffffff 15%); background-image: -ms-linear-gradient(top, #eeeeee 1%, #ffffff 15%); background-image: linear-gradient(top, #eeeeee 1%, #ffffff 15%); border: 1px solid #aaa; margin: 0; padding: 0; cursor: text; overflow: hidden; height: auto !important; height: 1%; position: relative; } .chzn-container-multi .chzn-choices li { float: left; list-style: none; } .chzn-container-multi .chzn-choices .search-field { white-space: nowrap; margin: 0; padding: 0; } .chzn-container-multi .chzn-choices .search-field input { color: #666; background: transparent !important; border: 0 !important; font-family: sans-serif; font-size: 100%; height: 15px; padding: 5px; margin: 1px 0; outline: 0; -webkit-box-shadow: none; -moz-box-shadow : none; -o-box-shadow : none; box-shadow : none; } .chzn-container-multi .chzn-choices .search-field .default { color: #999; } .chzn-container-multi .chzn-choices .search-choice { -webkit-border-radius: 3px; -moz-border-radius : 3px; border-radius : 3px; -moz-background-clip : padding; -webkit-background-clip: padding-box; background-clip : padding-box; background-color: #e4e4e4; filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f4f4f4', endColorstr='#eeeeee', GradientType=0 ); background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee)); background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); background-image: -o-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); background-image: -ms-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); background-image: linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); -webkit-box-shadow: 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05); -moz-box-shadow : 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05); box-shadow : 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05); color: #333; border: 1px solid #aaaaaa; line-height: 13px; padding: 3px 20px 3px 5px; margin: 3px 0 3px 5px; position: relative; cursor: default; } .chzn-container-multi .chzn-choices .search-choice-focus { background: #d4d4d4; } .chzn-container-multi .chzn-choices .search-choice .search-choice-close { display: block; position: absolute; right: 3px; top: 4px; width: 12px; height: 13px; font-size: 1px; background: url('chosen-sprite.png') right top no-repeat; } .chzn-container-multi .chzn-choices .search-choice .search-choice-close:hover { background-position: right -11px; } .chzn-container-multi .chzn-choices .search-choice-focus .search-choice-close { background-position: right -11px; } /* @end */ /* @group Results */ .chzn-container .chzn-results { margin: 0 4px 4px 0; max-height: 240px; padding: 0 0 0 4px; position: relative; overflow-x: hidden; overflow-y: auto; -webkit-overflow-scrolling: touch; } .chzn-container-multi .chzn-results { margin: -1px 0 0; padding: 0; } .chzn-container .chzn-results li { display: none; line-height: 15px; padding: 5px 6px; margin: 0; list-style: none; } .chzn-container .chzn-results .active-result { cursor: pointer; display: list-item; } .chzn-container .chzn-results .highlighted { background-color: #3875d7; filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#3875d7', endColorstr='#2a62bc', GradientType=0 ); background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #3875d7), color-stop(90%, #2a62bc)); background-image: -webkit-linear-gradient(top, #3875d7 20%, #2a62bc 90%); background-image: -moz-linear-gradient(top, #3875d7 20%, #2a62bc 90%); background-image: -o-linear-gradient(top, #3875d7 20%, #2a62bc 90%); background-image: -ms-linear-gradient(top, #3875d7 20%, #2a62bc 90%); background-image: linear-gradient(top, #3875d7 20%, #2a62bc 90%); color: #fff; } .chzn-container .chzn-results li em { background: #feffde; font-style: normal; } .chzn-container .chzn-results .highlighted em { background: transparent; } .chzn-container .chzn-results .no-results { background: #f4f4f4; display: list-item; } .chzn-container .chzn-results .group-result { cursor: default; color: #999; font-weight: bold; } .chzn-container .chzn-results .group-option { padding-left: 15px; } .chzn-container-multi .chzn-drop .result-selected { display: none; } .chzn-container .chzn-results-scroll { background: white; margin: 0 4px; position: absolute; text-align: center; width: 321px; /* This should by dynamic with js */ z-index: 1; } .chzn-container .chzn-results-scroll span { display: inline-block; height: 17px; text-indent: -5000px; width: 9px; } .chzn-container .chzn-results-scroll-down { bottom: 0; } .chzn-container .chzn-results-scroll-down span { background: url('chosen-sprite.png') no-repeat -4px -3px; } .chzn-container .chzn-results-scroll-up span { background: url('chosen-sprite.png') no-repeat -22px -3px; } /* @end */ /* @group Active */ .chzn-container-active .chzn-single { -webkit-box-shadow: 0 0 5px rgba(0,0,0,.3); -moz-box-shadow : 0 0 5px rgba(0,0,0,.3); -o-box-shadow : 0 0 5px rgba(0,0,0,.3); box-shadow : 0 0 5px rgba(0,0,0,.3); border: 1px solid #5897fb; } .chzn-container-active .chzn-single-with-drop { border: 1px solid #aaa; -webkit-box-shadow: 0 1px 0 #fff inset; -moz-box-shadow : 0 1px 0 #fff inset; -o-box-shadow : 0 1px 0 #fff inset; box-shadow : 0 1px 0 #fff inset; background-color: #eee; filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0 ); background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #eeeeee), color-stop(80%, #ffffff)); background-image: -webkit-linear-gradient(top, #eeeeee 20%, #ffffff 80%); background-image: -moz-linear-gradient(top, #eeeeee 20%, #ffffff 80%); background-image: -o-linear-gradient(top, #eeeeee 20%, #ffffff 80%); background-image: -ms-linear-gradient(top, #eeeeee 20%, #ffffff 80%); background-image: linear-gradient(top, #eeeeee 20%, #ffffff 80%); -webkit-border-bottom-left-radius : 0; -webkit-border-bottom-right-radius: 0; -moz-border-radius-bottomleft : 0; -moz-border-radius-bottomright: 0; border-bottom-left-radius : 0; border-bottom-right-radius: 0; } .chzn-container-active .chzn-single-with-drop div { background: transparent; border-left: none; } .chzn-container-active .chzn-single-with-drop div b { background-position: -18px 1px; } .chzn-container-active .chzn-choices { -webkit-box-shadow: 0 0 5px rgba(0,0,0,.3); -moz-box-shadow : 0 0 5px rgba(0,0,0,.3); -o-box-shadow : 0 0 5px rgba(0,0,0,.3); box-shadow : 0 0 5px rgba(0,0,0,.3); border: 1px solid #5897fb; } .chzn-container-active .chzn-choices .search-field input { color: #111 !important; } /* @end */ /* @group Disabled Support */ .chzn-disabled { cursor: default; opacity:0.5 !important; } .chzn-disabled .chzn-single { cursor: default; } .chzn-disabled .chzn-choices .search-choice .search-choice-close { cursor: default; } /* @group Right to Left */ .chzn-rtl { text-align: right; } .chzn-rtl .chzn-single { padding: 0 8px 0 0; overflow: visible; } .chzn-rtl .chzn-single span { margin-left: 26px; margin-right: 0; direction: rtl; } .chzn-rtl .chzn-single div { left: 3px; right: auto; } .chzn-rtl .chzn-single abbr { left: 26px; right: auto; } .chzn-rtl .chzn-choices .search-field input { direction: rtl; } .chzn-rtl .chzn-choices li { float: right; } .chzn-rtl .chzn-choices .search-choice { padding: 3px 5px 3px 19px; margin: 3px 5px 3px 0; } .chzn-rtl .chzn-choices .search-choice .search-choice-close { left: 4px; right: auto; background-position: right top;} .chzn-rtl.chzn-container-single .chzn-results { margin: 0 0 4px 4px; padding: 0 4px 0 0; } .chzn-rtl .chzn-results .group-option { padding-left: 0; padding-right: 15px; } .chzn-rtl.chzn-container-active .chzn-single-with-drop div { border-right: none; } .chzn-rtl .chzn-search input { background: #fff url('chosen-sprite.png') no-repeat -38px -22px; background: url('chosen-sprite.png') no-repeat -38px -22px, -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff)); background: url('chosen-sprite.png') no-repeat -38px -22px, -webkit-linear-gradient(top, #eeeeee 1%, #ffffff 15%); background: url('chosen-sprite.png') no-repeat -38px -22px, -moz-linear-gradient(top, #eeeeee 1%, #ffffff 15%); background: url('chosen-sprite.png') no-repeat -38px -22px, -o-linear-gradient(top, #eeeeee 1%, #ffffff 15%); background: url('chosen-sprite.png') no-repeat -38px -22px, -ms-linear-gradient(top, #eeeeee 1%, #ffffff 15%); background: url('chosen-sprite.png') no-repeat -38px -22px, linear-gradient(top, #eeeeee 1%, #ffffff 15%); padding: 4px 5px 4px 20px; direction: rtl; } /* @end */ flask-peewee-3.0.6/flask_peewee/static/css/datepicker.css000066400000000000000000000102731460575705200234440ustar00rootroot00000000000000/*! * Datepicker for Bootstrap * * Copyright 2012 Stefan Petre * Licensed under the Apache License v2.0 * http://www.apache.org/licenses/LICENSE-2.0 * */ .datepicker { top: 0; left: 0; padding: 4px; margin-top: 1px; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; /*.dow { border-top: 1px solid #ddd !important; }*/ } .datepicker:before { content: ''; display: inline-block; border-left: 7px solid transparent; border-right: 7px solid transparent; border-bottom: 7px solid #ccc; border-bottom-color: rgba(0, 0, 0, 0.2); position: absolute; top: -7px; left: 6px; } .datepicker:after { content: ''; display: inline-block; border-left: 6px solid transparent; border-right: 6px solid transparent; border-bottom: 6px solid #ffffff; position: absolute; top: -6px; left: 7px; } .datepicker > div { display: none; } .datepicker table { width: 100%; margin: 0; } .datepicker td, .datepicker th { text-align: center; width: 20px; height: 20px; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; } .datepicker td.day:hover { background: #eeeeee; cursor: pointer; } .datepicker td.old, .datepicker td.new { color: #999999; } .datepicker td.active, .datepicker td.active:hover { background-color: #006dcc; background-image: -moz-linear-gradient(top, #0088cc, #0044cc); background-image: -ms-linear-gradient(top, #0088cc, #0044cc); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); background-image: -o-linear-gradient(top, #0088cc, #0044cc); background-image: linear-gradient(top, #0088cc, #0044cc); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0); border-color: #0044cc #0044cc #002a80; border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); color: #fff; text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); } .datepicker td.active:hover, .datepicker td.active:hover:hover, .datepicker td.active:active, .datepicker td.active:hover:active, .datepicker td.active.active, .datepicker td.active:hover.active, .datepicker td.active.disabled, .datepicker td.active:hover.disabled, .datepicker td.active[disabled], .datepicker td.active:hover[disabled] { background-color: #0044cc; } .datepicker td.active:active, .datepicker td.active:hover:active, .datepicker td.active.active, .datepicker td.active:hover.active { background-color: #003399 \9; } .datepicker td span { display: block; width: 47px; height: 54px; line-height: 54px; float: left; margin: 2px; cursor: pointer; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; } .datepicker td span:hover { background: #eeeeee; } .datepicker td span.active { background-color: #006dcc; background-image: -moz-linear-gradient(top, #0088cc, #0044cc); background-image: -ms-linear-gradient(top, #0088cc, #0044cc); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); background-image: -o-linear-gradient(top, #0088cc, #0044cc); background-image: linear-gradient(top, #0088cc, #0044cc); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0); border-color: #0044cc #0044cc #002a80; border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); color: #fff; text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); } .datepicker td span.active:hover, .datepicker td span.active:active, .datepicker td span.active.active, .datepicker td span.active.disabled, .datepicker td span.active[disabled] { background-color: #0044cc; } .datepicker td span.active:active, .datepicker td span.active.active { background-color: #003399 \9; } .datepicker td span.old { color: #999999; } .datepicker th.switch { width: 145px; } .datepicker thead tr:first-child th { cursor: pointer; } .datepicker thead tr:first-child th:hover { background: #eeeeee; } .input-append.date .add-on i, .input-prepend.date .add-on i { display: block; cursor: pointer; width: 16px; height: 16px; }flask-peewee-3.0.6/flask_peewee/static/img/000077500000000000000000000000001460575705200206005ustar00rootroot00000000000000flask-peewee-3.0.6/flask_peewee/static/img/glyphicons-halflings-white.png000066400000000000000000000211111460575705200265440ustar00rootroot00000000000000PNG  IHDRӳ{PLTEmmmⰰᒒttt󻻻bbbeeeggg𶶶xxx󛛛Ƽ몪֢UUU鿿rOtRNS#_ /oS?C kDOS_6>4!~a @1_'onҋM3BQjp&%!l"Xqr; A[<`am}43/0IPCM!6(*gK&YQGDP,`{VP-x)h7e1]W$1bzSܕcO]U;Zi'y"؆K 64Y*.v@c.};tN%DI !ZЏ5LH26 ɯ" -bE,,)ʏ B>mn6pmRO wm@V#?'CȑZ#qb|$:)/E%nRqChn%i̓}lm ?idd",`H"r.z~(bQU&)5X#EMR<*p[[%.Ọk7lIoJF lV!̡ăuH`&,zRk$|$lXbjߪdU?Σ$HW$U'HE3*խU\}( zhVk}guRk$%|T|ck獳"D_W+.Q)@ƽHbslTDR2Xm#a 3lYzj㒚#! 4J8(cvt]aT D ΅Q?^-_^$:\V $N|=(vZ'q6Z׆B5V!y3K㱿bv4xR]al!IoP@tVyL٪mlڿIUb|[*lke'*WddDӝ}\W_WߝrN?vޫ۲X%0uoui*JVƦb%}i5IYlNE-wςf_W3mI-mQ)S kTC7m<"܌bT|'$ҘR&>O p6tSN\ׯLm\r@3uT b7t.5.q3r0=8TiJ\6uF R32^'ŪxI F8O{%8kJMSȴdBEdWCYO:/ON/I_=xFE! =i:o~ y?''[͓[͓[͓[͓[ͭ.U>$PƦc%]\c:| ,eSZ,oXrX!R@Zv 0>?* <|N60;{ad2v+D^t[q!۞V}fۨϏYeॗ)Vyl|" fUq@Ǽ4Y-Y-!6aB:o%JIUQ|UKO`=\ :0x Pau@!KPdxhw1>$j΍vZdxSUA&[URd7øzk/rU^w:I.VǮc>q.!zSr&2)Wg R -iQ 8Pa\ОU%iݡU_=p Lu(N?0?Æ:]άtB%U|NsorNf ,P !v" Y6hL_@@bscqgv4||0lϟ$S9bʱj#~?o}}7sAPm:IV=n !{{hEࢪ8suoLT$;VscqD3 ༂3.DBB4&V' T `D6Ϸqyj8V*X%@s\jrN$|=5Ά 'mUiKi%CI:ssaƅ`*`=l)>u՘MeuSI_OL_}o&jzp{lu:O)s%Q@$<]f xO%PCbhr2PKpf5Në3^o]eJiB464^tuٲU֌:G4'22YpuG'/Py4?.SBP_>I 1t3ΓBɭɭɭɭVVVVVs]!67(g y@ 4>Q VF}^Xׇڼje26 L%YGh lC})< !EEPZWZV+@†R 5{@ouɐ4&H6ey V݀VťcqZޒrJyByFzFN$Hb*+jՏqэ ګkݿUXle1d0d^-B%} {Y%r*j5Ak5u",:~ҸY~ hSA~6 fulՇf{ȵQtATHZkƭ/_Sn u']b]|m`BāJ,O$du]Zs FL:aǙT4o~by?wpj滥A(x]†f~an֧/^dڲcՇ,!1i&xi_VK@ip̓9Vi%a; L?0J*Ū5U'x^6V[^ {eU|:0=0d۫o*Jq%[YN.sQLud[29I:WnmXlڃ6!lNlVէKUjV\J%UߊBLcKfb>a=b~R]aG%[js@/9MطݘU>yɲX@} Ftg^vO\Ӹwvpz3K5i!$P>ā'VƛL2r@UMKZ6tw맟¦bm1h||]}~0MjA(JJP68C&yr׉e}j_cJ?I0k>šW |Bޝ."TEXd 8!cw*E(J)![W"j_ТeX_XB;oO0~?:PC (.[!Wq%*leY)E<^KZT60.#A\5;Rmtkd/8)5~^0 #Ckgey)ͶԺ6ĥ<(?&uAVm0^h.txR*a':,H|ō l5z;8+e#b'#|}2w(|KcJ l6 w^Տoi3H R ̔9,YgPְ:N [5SR![)]i}`mN4Хv`|;f(FltL8÷Z#AO%Y)NU5YedJE3dZذݣHT1 ;8MjnʏӤqp 1h^<<>yt{?|'j)}YUU{@V/J1F+7䀉[OWO[ yUY!?BD%DWj>-Ai6xz)U R7 d@g\so)a4zf[W+> P> |qLG8vȣlj2Zt+VA6gT *ʆUz(m)CD `He/.:zN9pgo &NC׃އ>Wհ_Hj)Xe6F7pm-`'c.AZ=^e8F;{Rtn(z!S7o Iew3]bܗ85|iϠRJkʱZRO+8U&:]ZieR(JMޗ7Z@5a^\GzsρU*rMezT^:ɬͦX=>$ bi>U&XQoybbGk8 Ҙn).Սo ^MmdZi$soo*{4eLbLٳ""mx:`:mk[geTެ)'0*TB{!I ''''[͓[͓[͓[͓[]Zj Q.e '/yvQ71(Z&X?(_Z){tڀmZWϏ)-C jqn,̋"IvUL!h꛿skAcrN佚фVE40yX~4zʸV㳰%,)fqtpu~  *^0:ܲ33JO(ZB?K^ v]unlWi0p6[착C_5X#[wX3b廫R{NKAe Se|wxso>P\儔ԕ6;nVmfI$V͓J-J%֌0UwYЎSnum藮xz˗VƫIvnW_qLZ"_Xz 8]Ap?C543zw({7e*Ȳ`۰!AQ:KUnz]1yVGaCm0PY ٚUx6TT&hV9V ӬzÑ 1[XzZ9erqJND/gX*9oN6D` {I%Mz9—TQ7f\"j_3~xB'ܷY]*KЌ%"5"qxq~ƕ=jS>jV&~]2xzF1X_yD<#NRB}K/iy !V^˿eJ}/FkA7 S+.(ecJ:zWZ몖wQ~ä́p6,e5,+,tv%O^OO}ן -O7>ekC6wa_C |9*WA)UJg8=:mjUvqysܒLglC6+[FSWg9wV31A ND<$5e(s[ ۨbaF.]KIENDB`flask-peewee-3.0.6/flask_peewee/static/img/glyphicons-halflings.png000066400000000000000000000330021460575705200254300ustar00rootroot00000000000000PNG  IHDRtEXtSoftwareAdobe ImageReadyqe<iTXtXML:com.adobe.xmp glyphicons_small_dark 5k1IDATx}ol\EW^zD$|_w'CwG;4<1uij6C" Eʼ0 "=, f3o 0`snuݾT;1Kmw֭{~Uuʘ1cKά:kb10Q!8dM` \5e]OYKA*9c8 ?'M7k1c]?bѽc}x$/$Y3sOqY+*bQ8C A,VuXx XMYRژ5@4 E얌ԏ jt(JM>(=BJC71Q7% WY}dlP"oHTV-/NPάVo cqhOg6pwêkǺ _)M+I :Hz̬/ɞ{9OdnV|_xH0kt|Nn3#3u+/Ua9%XqNzg;y9y9O%~uɗ*=Ipcy}Y(o(u±$^j e\iX;X-rѲ&>>eìas??1aۤ^=765^8R6Ҩ*4|QN$*>skUqSE -?DGƯ M#۠ ֙ʟU[3HVUwd#)~@@V -s'A]Λdn 37UuSCz{v(8l-;ޙṹ[;V~ )t>7QeS)jǹOhc YCb7: X 'Y 9 Y1y=G 6`=GVB[\yQ=uo㺷c?U|gdD&tÓCv߈z&AIg)ʨuGU8G*=Wb6yhDM$?.&rvQCXԙvdrQ]olwc*-73pyNV+xU^4 YiYqD,48c~T}֙{~2dnsզS ;]ɨDuF_1glGz`cKZ>߷h{>IoURΕN'0i2qˆN԰cA$+-y6f?%xYUiJU?m}gsVYUt&qyYT u,U. Uc,w'alj"MW$)҈ʳ#i5v:}D6w}O 8sDJ,#`F^gw?ӑtxC~TWyf-̶B?WԪ-_5Tlfc%Z}h ã-oM۴t<-|sޫBD?<0ځ_9/uspƔM&xӤ=_h9`e8ki_^ gaYݫ-(x j謮1;;_W$t]=⣿.^"_^j}PV saF-+Xў/meUµq;>E4d,sdɜX| bNg(G ԉjS,}ؖ1{奪n}t ݽ.t\}p5v*ʵ^4БoR7F+V?Ooz:tzaxFp6&[R)dndKߕ@jTQg$*茲\ЃDAJRO*OX| n @;3g*NN}1υxǹ|ic˨TMF3X ֐GX#;UF;v_Ɉ[m֯wK!lT]"eߨzx-r;tݱ|Tuׇx7 *<־PJڞT>9TIx{Urp'ZU,ۜ[ iNU>=_5~p:|M>7!9ѕލGUw(sOZw/< 늝>TGQQRΪJg5t@ꁜDg蚢2S#E>;|iϛd?'?%`}Oƒ$x9SMoTMxOq==NP@ٙM0Qz5D1 uٓ YgKUe7|I9uVyZtV<`VIrB!.ySX0'>Q].\,:#?,۹>_SC#4XCU5&*SMM4SUucǨԻo#C7}.dÛtкxGgU+5tD}p>Nŝ+֝+Z9w"ͪ.x@ꍪPժz\FvivV+#*pa[Vkm:g0ܗyPUdMU]U̟ÕzaTZ>wXF+!I\h>NŝmWS>H-SݞWKfrH-Wˌ9710Y=_C!B|뱟ZKyY#ڶ8!S~ZC"s!6<E wA oo;T})C[˕_x3sI{QuDO<"6uSdFP\B__UU>X#|\nSyul^WӅڐoѹ%NyS>u%CBepʘ1cƌ3f̘1cƌ3f̘1cƌ3f̘1cƌ3f̘1cƌ3f\[im ue4hs+k)Ti&ȥȨԻdʲ%gRap:Yh۪.Pz*VrYgtH= _SQpm3"KXI|5鯳vGSշJ,g cK Od?CW.īejIFԧ*JDv5 kulMXAtI>WLA %7`)[(h6lqӻ{ݳXM _\6ea'uy]1*t*k]SS5"*xYTm{ҍ r1LtK)鞙l b*Ur*p14/#F}7~l ^RZgE"9"TrVH4t]3uG~pUunZƓ |JUlU[q,&JkXJh+'5*FBUޔZ.cKWN 7^FR֝ XP;/}(uKm#̅XȰU!ԂBRUWB7@ NomZI>>\{[|cï"QqUgYH~xV3Nx=3:V@PV6c#E*(jR&ٽSUWB_B?\$S{ުV:${UA$j@o{oے׽}V婪Kw]؊_7v]&ٽqP`-MԤ( @"$pSWeg pÓ,iJ_z{ub0`4wkWbpt/^YQgVʈWU'>(;=q1J!Bg]j(к\3tQw{-㏷b W[!yM>QD-N~BlՏ..5 ] 't{RZ)`\OOvVM+^*pq.uI~psS_W#G!j1^FToNnNlh!6 b$1(01{ zc칹䯖=< &9C;I HnAJ 838^U|T֨~!?޽ ')B[ S"i|]PZ 6N??P[~NUe7C7댔">BLZԥT->v)S,ǃl!UQ(PGmAlq*UR鶠.]rhJcxpH)g>Z}JQ5.%D`L=?1f̘1cƌ3f̘1cƌ3f̘1cƌ3f̘1cƌ3f ,zLga̘ KqLQdl 9CrnF*Z-)+3Vm꺜n*Cפ8D&\}MP$L>i(Hk:^cgJۅ?JʟN ש&*+epK#Bx$vj4Miuz eB|CskDXnؖSO濶)f[b,`)gv9E1NGR,^x nOJ*!Q֟a@zCvvd=QV6NX`Fqʈ!k'Oo09ޙ;jkZR})/ y,$TD}VI=|1J!Sc o<]-$:"D55VgWUUvpE֜{=JEÜ 7pqFjhI~6zrZPw`,*S3⽡{;'uo۞NUK9Z=|1?S}17NU 6/>:gz/t~EÓN3Cҥ;,7?geus$v;U>{OjY&QFBU{)T)N`)g GU}}@-S}3INTҰ8f:/kx݄x JgcK&UlmAf*aRUϪQC 5>EB$Кs^^jZo5EK;K/WuVEƭTINXSD'Qafx=#?ƪlq{|JjFp9On̆ŝY? Ɵ D߶,jߓ_%rA6Ax1vL ᮴ O[CV5kpoUg<.aPtx#=$q:簚S Jo{`?[~nR3~ [z셥%Pk~%V/nMkJ]UGIM?li[]eM΃6" aF0f)STzacPNZ;vu+.x?Yժ^XV2GԋoLR47BV5E4@M1cnFS]91cƌ3f̘1cƌ3f̘1cƌ3f̘1cƌ3f̘1cƌtuzoxҬ}(5鴦nBҺWbRiN7h:78ˈ3ԧReK ayZꂹ;zWbyɜ] "'phVJ4<_ԆWd^Ԭsq6vŜZ=f;3;NUyFe4aMDG7J( j훀ģ_ F`'Koa  = Nw; 3F\F\`K/_ADNןvh'I v*0o p#:B kN? 7GN k(M亮nZ{Prx'vNSa@@< :m/X>?:U:x!wfq5{8>N$`[{k) P.Uf_b6y庬1(ʙc#t. TpDl!5 \P߱԰睧r2:(cAZ=/N[%G_~;(+GUV{]P5 Fiuz8+,j< [$X?R[quoꢌRqj]biI⌐shR1=k`?|FBI">GTx2<!W礒rc\Jm.qDQxÓ4zj(e^KMCt~(u]M&- (p~r- ;زƓ*a  Pej5 {wGVV[{ZJ IQkƫQ-./\nv(f.7>=3ǶӲBT% >!5uD`O:ݿYGZ%ULbJ<Rg>g}=Lԃ[1Qqd i}?nǶ;RUM qrr-ۙ`bxcK T[,n)YSP,$NbuCOb8wVP-+J;UE%fՃӘLBڟ/~I\B]}VUvAP r<ŒA\xxjCUYSO;rɠ6ԙюiT{!eqK QPK ,Yd:Qx́ssQb[JB>zwr]bN7R&`>V! >t' <a*;^?F)O\HBTG383/_,qJoO})lݷ~(tzKËVʯ;;IF⢣{l5>x;Esߡ ]lQff%2sKz2I7K|2a=jמR.:T^)H{ܥUJ@Xihoi{d[|uHT:9m嚢Ō]w-tV tm)YbUn3f̘1cƌ3f̘1cƌ3f̘1cƌ3f̘1cƌ3fX 1`X!-4teA%v<?|ㇶ&i_qz ] eR_ |& c*kր4f,J U_h\1AeL-L\^~Phr*tqa0fT:MUp>yduUYCA>k).,+ɦ@bjE)W F+As$e6\Q9oI}4xjH}2o^՟|ϧp+P;昭?^$^)tn9VOdDTʘY #jǍvR!*]|6!~.MPxG5Ø9G6QIWGjRT|^|Y߅&g|JuKw-wS=3,7< {o-xL(Ex? OY`# ߑ ̗kTŐHgEp#Fiq3O2_NƟtOrR? ./1IE;WN˜5嘫b+Ontutu6RNѾ|:Qb[A򖘫T @܀e-8hx?tQCSC>Ho=5} n #}oU(x U< $kG/Ut^""9䮉Fv+OF8kTm:ꍇm*v0&գjep[DYq3Cӹm!HXm-Q(6]^#'vvͪ\Qؤ[CT>I1 Oʧ+"!uwϴѼJ5׽W7HTѓuevʷJzNUW}L%up&:Լ m6f̘1cƌ3f̘1cƌ3f̘1cƌ3f̘1cƌ3f̘ WYɜ$P,;AUӺJ]v낀sէ Ţ{%kwned--Yj7bɦɮ@ -/7p]b@ ];`1kٵր?*<':KU? ~;eAI:ɥ-k} !^ȯ-5١o\_]0/n xIU&XefʬdkԵ БeW$mjOl%ep~&RgĞzQNU^ OoC鰚:ϥ{f4mP#_SaD[џ nK<.d= @}N| Qs~^etkj]ܽS' vckeeM<"E:ס侹̱囫s-]^ }(#J,kܫȸw!=3B5Kԍ^j3FҬﳁrS7Q3R<'J9"]|_З%/#TcGqn"[cGQ љgƎ*iV!jT2%Тtuhc(;Mе|' RƸHge-S1 c,+j 25{zu͵cx'-i6γosw-4ΰg؞^'1 K\d@f#i0=@%5zݷut!]M|![@QDL;7U Ѿ3ՊM'+o.repr+''); } if (data.prev_page) { prev_btn.removeClass('disabled'); prev_btn.data('page', data.prev_page); } else { prev_btn.addClass('disabled'); } if (data.next_page) { next_btn.removeClass('disabled'); next_btn.data('page', data.next_page); } else { next_btn.addClass('disabled'); } target.find('a').click(function(e) { var data = $(this).data('object-id') , repr = $(this).text() , html = $(this).html() , sender = modal.data('sender'); click_cb(sender, repr, data, html); target.parents('.modal').modal('hide'); }); }); } var ModelAdminRawIDField = function(field_name) { this.field_name = field_name; this.selector = 'input#'+this.field_name; } ModelAdminRawIDField.prototype.init = function(repr) { var self = this , repr = repr || 'Select...' , hidden_elem = $(this.selector) , new_elem = $(''+repr+''); /* bind the ajax list */ this.ajax_list = new ModelAdminAjaxList(); this.ajax_list.init(function(modal) {return self.on_click}); new_elem.click(function(e) { e.preventDefault(); var modal = $('#modal-' + self.field_name) , modal_input = modal.find('.fk-lookup-input') , target = modal.find('ul.result-list'); self.ajax_list.show(modal_input.data('ajax-url'), '', target, self.on_click); modal.data('sender', $(this)); modal.modal('show'); }); hidden_elem.after(new_elem); } ModelAdminRawIDField.prototype.on_click = function(sender, repr, data, html) { if (repr) { sender.text(repr); } else { sender.html(html); } sender.parent().find('input[type="hidden"]').val(data); } /* filter class */ var ModelAdminFilter = function() { this.wrapper = '#filter-wrapper'; /* wrapper around the form that submits filters */ this.add_selector = 'a.field-filter'; /* links to add filters (in the navbar) */ this.lookups_wrapper = '#filter-fields'; /* wrapper around the filter fields */ } ModelAdminFilter.prototype.init = function() { var self = this; this.filter_list = $(this.wrapper + ' form div.filter-list'); this.lookups_elem = $(this.lookups_wrapper); /* bind the "add filter" click behavior */ $(this.add_selector).click(function(e) { e.preventDefault(); self.add_filter($(this)); }); } ModelAdminFilter.prototype.chosen_handler = function(data) { var results = {} , object_list = data.object_list; for (var i = 0, l = object_list.length; i < l; i++) { var item = object_list[i]; results[item['id']] = item['repr'] } return results; } ModelAdminFilter.prototype.add_row = function(qf_v, qf_s, ival, sval) { var select_elem = this.lookups_elem.find('#'+qf_s), input_elem = this.lookups_elem.find('#'+qf_v), field_label = $('#filter-'+qf_s).text(); var self = this, select_clone = select_elem.clone(), input_clone = input_elem.clone(), row = [ , '' ].join('\n'), row_elem = $(row).append(select_clone).append(input_clone); if (ival && sval) { select_clone.val(sval); input_clone.val(ival); } row_elem.find('a.btn-close').click(function(e) { row_elem.remove(); }); this.filter_list.prepend(row_elem); /* reload our jquery plugin stuff */ if (input_clone.hasClass('datetime-widget')) { $(input_clone[0]).datepicker({format: 'yyyy-mm-dd'}); } else if (input_clone.hasClass('date-widget')) { input_clone.datepicker({format: 'yyyy-mm-dd'}); } else if (input_clone.data('role') === 'chosen') { input_clone.chosen(); } else if (input_clone.data('role') === 'ajax-chosen') { input_clone.ajaxChosen({ type: 'GET', url: input_clone.data('source'), jsonTermKey: 'query', dataType: 'json', data: {'field': input_clone.data('param')}, minTermLength: 2 }, this.chosen_handler); } $(this.wrapper).show(); /* twitter bootfap doesn't wanna close the dropdown */ $('.dropdown.open .dropdown-toggle').dropdown('toggle'); return row_elem; } /* add a filter of a given type */ ModelAdminFilter.prototype.add_filter = function(elem) { return this.add_row(elem.data('field'), elem.data('select')); } /* pull request data and simulate adding a filter */ ModelAdminFilter.prototype.add_filter_request = function(qf_s, filter_idx, qf_v, filter_val) { return this.add_row(qf_v, qf_s, filter_val, filter_idx); } /* export */ A.ModelAdminRawIDField = ModelAdminRawIDField; A.ModelAdminFilter = ModelAdminFilter; /* bind a simple listener */ A.index_submit = function(action) { $('form#model-list input[name=action]').val(action); $('form#model-list').submit(); } })(Admin, jQuery); jQuery(function() { jQuery(".alert").alert() }); flask-peewee-3.0.6/flask_peewee/static/js/ajax-chosen.min.js000066400000000000000000000043361460575705200237660ustar00rootroot00000000000000 (function($){return $.fn.ajaxChosen=function(settings,callback,chosenOptions){var chosenXhr,defaultOptions,options,select;if(settings==null){settings={};} if(callback==null){callback={};} if(chosenOptions==null){chosenOptions=function(){};} defaultOptions={minTermLength:3,afterTypeDelay:500,jsonTermKey:"term"};select=this;chosenXhr=null;options=$.extend({},defaultOptions,$(select).data(),settings);this.chosen(chosenOptions?chosenOptions:{});return this.each(function(){return $(this).next('.chzn-container').find(".search-field > input, .chzn-search > input").bind('keyup',function(){var field,msg,success,untrimmed_val,val;untrimmed_val=$(this).attr('value');val=$.trim($(this).attr('value'));msg=val.length").attr('label',element.text).appendTo(select);return $.each(element.items,function(value,text){if($.inArray(value+"-"+text,selected_values)===-1){return $("