├── .gitignore
├── .travis.yml
├── LICENSE
├── Makefile
├── README
├── _mailinglist
└── .ignore
├── flask_website
├── __init__.py
├── database.py
├── docs.py
├── flaskystyle.py
├── listings
│ ├── __init__.py
│ ├── extensions.py
│ ├── projects.py
│ └── releases.py
├── openid_auth.py
├── search.py
├── static
│ ├── approved.png
│ ├── badges
│ │ ├── flask-powered.png
│ │ ├── flask-project-s.png
│ │ ├── i-wish.png
│ │ ├── made-with-flask-s.png
│ │ ├── powered-by-flask-s.png
│ │ └── unfortunately-not.png
│ ├── community.png
│ ├── edit-snippet.png
│ ├── extensions.png
│ ├── favicon.ico
│ ├── login.png
│ ├── logo.png
│ ├── logo
│ │ ├── flask.eps
│ │ ├── flask.pdf
│ │ ├── flask.png
│ │ └── flask.svg
│ ├── mailinglist.js
│ ├── mailinglist.png
│ ├── mask.png
│ ├── new-snippet.png
│ ├── openid.png
│ ├── profile.png
│ ├── search.png
│ ├── ship.png
│ ├── snippets.png
│ ├── style.css
│ └── twitter.png
├── templates
│ ├── 404.html
│ ├── _twitter.html
│ ├── community
│ │ ├── badges.html
│ │ ├── index.html
│ │ ├── irc.html
│ │ ├── layout.html
│ │ ├── logos.html
│ │ └── poweredby.html
│ ├── extensions
│ │ ├── index.html
│ │ └── layout.html
│ ├── general
│ │ ├── change_openid.html
│ │ ├── first_login.html
│ │ ├── index.html
│ │ ├── login.html
│ │ ├── profile.html
│ │ └── search.html
│ ├── layout.html
│ ├── mailinglist
│ │ ├── archive.html
│ │ ├── index.html
│ │ ├── layout.html
│ │ └── show_thread.html
│ └── snippets
│ │ ├── category.html
│ │ ├── edit.html
│ │ ├── edit_comment.html
│ │ ├── index.html
│ │ ├── layout.html
│ │ └── show.html
├── utils.py
└── views
│ ├── __init__.py
│ ├── community.py
│ ├── extensions.py
│ ├── general.py
│ ├── mailinglist.py
│ └── snippets.py
├── requirements.txt
├── run.py
├── update-doc-searchindex.py
└── websiteconfig.py
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | *.pyc
3 | *.pyo
4 | *.whoosh
5 | *.db
6 | env
7 | dist
8 | _mailinglist/*
9 | *.egg-info
10 | .idea/
11 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: python
2 |
3 | python:
4 | - 2.7
5 | - pypy
6 |
7 | before_install: pip install simplejson
8 |
9 | script: python setup.py test
10 |
11 | branches:
12 | except:
13 | - website
14 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Copyright (c) 2010 by Armin Ronacher.
2 |
3 | Some rights reserved.
4 |
5 | Redistribution and use in source and binary forms of the software as well
6 | as documentation, with or without modification, are permitted provided
7 | that the following conditions are met:
8 |
9 | * Redistributions of source code must retain the above copyright
10 | notice, this list of conditions and the following disclaimer.
11 |
12 | * Redistributions in binary form must reproduce the above
13 | copyright notice, this list of conditions and the following
14 | disclaimer in the documentation and/or other materials provided
15 | with the distribution.
16 |
17 | * The names of the contributors may not be used to endorse or
18 | promote products derived from this software without specific
19 | prior written permission.
20 |
21 | THIS SOFTWARE AND DOCUMENTATION IS PROVIDED BY THE COPYRIGHT HOLDERS AND
22 | CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
23 | NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24 | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
25 | OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
26 | EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
27 | PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
28 | PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
29 | LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
30 | NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
31 | SOFTWARE AND DOCUMENTATION, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
32 | DAMAGE.
33 |
--------------------------------------------------------------------------------
/Makefile:
--------------------------------------------------------------------------------
1 | .PHONY: deploy
2 |
3 | deploy:
4 | ssh pocoo.org "cd /var/www/flask.pocoo.org/website; sudo -u team git pull origin && sudo /etc/init.d/apache2 reload"
5 |
--------------------------------------------------------------------------------
/README:
--------------------------------------------------------------------------------
1 | This is the old Flask website, which was available at http://flask.pocoo.org/.
2 |
3 | The source for the new site, https://palletsprojects.com/p/flask/, is at https://github.com/pallets/website.
4 |
--------------------------------------------------------------------------------
/_mailinglist/.ignore:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pallets/flask-website/8b083412f98842ee5e2b674cad40b8bf18501216/_mailinglist/.ignore
--------------------------------------------------------------------------------
/flask_website/__init__.py:
--------------------------------------------------------------------------------
1 | from datetime import datetime
2 | from flask import Flask, session, g, render_template
3 | from flask_openid import OpenID
4 |
5 | app = Flask(__name__)
6 | app.config.from_object('websiteconfig')
7 |
8 | from flask_website.openid_auth import DatabaseOpenIDStore
9 | oid = OpenID(app, store_factory=DatabaseOpenIDStore)
10 |
11 |
12 | @app.errorhandler(404)
13 | def not_found(error):
14 | return render_template('404.html'), 404
15 |
16 |
17 | @app.before_request
18 | def load_current_user():
19 | g.user = User.query.filter_by(openid=session['openid']).first() \
20 | if 'openid' in session else None
21 |
22 |
23 | @app.teardown_request
24 | def remove_db_session(exception):
25 | db_session.remove()
26 |
27 |
28 | @app.context_processor
29 | def current_year():
30 | return {'current_year': datetime.utcnow().year}
31 |
32 |
33 | app.add_url_rule('/docs/', endpoint='docs.index', build_only=True)
34 | app.add_url_rule('/docs/ Adds i18n/l10n support to Flask, based on
54 | babel and
55 | pytz.
56 | ''',
57 | github='mitsuhiko/flask-babel',
58 | docs='http://pythonhosted.org/Flask-Babel/',
59 | approved=True,
60 | notes='''
61 | How to improve: add a better long description to the next release.
62 | '''
63 | ),
64 | Extension('Flask-SQLAlchemy', 'Armin Ronacher',
65 | description='''
66 | Add SQLAlchemy support to Flask
67 | with automatic configuration and helpers to simplify common web use cases.
68 | Major features include: SQLAlchemy database
82 | migrations for Flask applications using
83 | Alembic. The
84 | database operations are provided as command line arguments for
85 | Flask-Script.
86 | ''',
87 | github='miguelgrinberg/flask-migrate',
88 | docs='http://pythonhosted.org/Flask-Migrate/',
89 | ),
90 | Extension('Flask-XML-RPC', 'Matthew Frazier',
91 | description='''
92 | Adds XML-RPC support to Flask.
93 | ''',
94 | bitbucket='leafstorm/flask-xml-rpc',
95 | docs='http://pythonhosted.org/Flask-XML-RPC/',
96 | approved=True
97 | ),
98 | Extension('Flask-CouchDB', 'Matthew Frazier',
99 | description='''
100 | Adds CouchDB support to Flask.
101 | ''',
102 | bitbucket='leafstorm/flask-couchdb',
103 | docs='http://pythonhosted.org/Flask-CouchDB/',
104 | approved=True,
105 | notes='''
106 | There is also Flask-CouchDBKit. Both are fine because they are
107 | doing different things, but the latter is not yet approved.
108 | '''
109 | ),
110 | Extension('Flask-Uploads', 'Max Countryman',
111 | description='''
112 | Flask-Uploads allows your application to flexibly and
113 | efficiently handle file uploading and serving the uploaded files.
114 | You can create different sets of uploads - one for document
115 | attachments, one for photos, etc.
116 | ''',
117 | github='maxcountryman/flask-uploads',
118 | docs='https://flask-uploads.readthedocs.org/en/latest/',
119 | approved=True
120 | ),
121 | Extension('Flask-Themes', 'Matthew Frazier',
122 | description='''
123 | Flask-Themes makes it easy for your application to support
124 | a wide range of appearances.
125 | ''',
126 | bitbucket='leafstorm/flask-themes',
127 | docs='http://pythonhosted.org/Flask-Themes/',
128 | approved=True
129 | ),
130 | Extension('Flask-CouchDBKit', 'Kridsada Thanabulpong',
131 | description='''
132 | Adds CouchDBKit support to Flask.
133 | ''',
134 | github='sirn/flask-couchdbkit',
135 | docs='http://pythonhosted.org/Flask-CouchDBKit/'
136 | ),
137 | Extension('Flask-Genshi', 'Dag Odenhall',
138 | description='''
139 | Adds support for the Genshi
140 | templating language to Flask applications.
141 | ''',
142 | github='dag/flask-genshi',
143 | docs='http://pythonhosted.org/Flask-Genshi/',
144 | approved=True,
145 | notes='''
146 | This is the first template engine extension. When others come
147 | around it would be a good idea to decide on a common interface.
148 | '''
149 | ),
150 | Extension('Flask-Mail', 'Matt Wright (created by Dan Jacob)',
151 | description='''
152 | Makes sending mails from Flask applications very easy and
153 | has also support for unittesting.
154 | ''',
155 | github='mattupstate/flask-mail',
156 | docs='http://pythonhosted.org/Flask-Mail/',
157 | approved=True
158 | ),
159 | Extension('Flask-WTF', 'Anthony Ford (created by Dan Jacob)',
160 | description='''
161 | Flask-WTF offers simple integration with WTForms. This
162 | integration includes optional CSRF handling for greater security.
163 | ''',
164 | github='ajford/flask-wtf',
165 | docs='http://pythonhosted.org/Flask-WTF/',
166 | approved=True
167 | ),
168 | Extension('Flask-Testing', u'Christoph Heer (created by Dan Jacob)',
169 | description='''
170 | The Flask-Testing extension provides unit testing utilities for Flask.
171 | ''',
172 | github='jarus/flask-testing',
173 | docs='http://pythonhosted.org/Flask-Testing/',
174 | approved=True
175 | ),
176 | Extension('Flask-Script', 'Sean Lynch (created by Dan Jacob)',
177 | description='''
178 | The Flask-Script extension provides support for writing external
179 | scripts in Flask. It uses argparse to parse command line arguments.
180 | ''',
181 | github='techniq/flask-script',
182 | docs='http://pythonhosted.org/Flask-Script/',
183 | approved=True,
184 | notes='''
185 | Flask-Actions has some overlap. Consider that when approving
186 | Flask-Actions or similar packages.
187 | '''
188 | ),
189 | Extension('flask-lesscss', 'Steve Losh',
190 | description='''
191 |
192 | A small Flask extension that makes it easy to use
193 | LessCSS with your
194 | Flask application.
195 | ''',
196 | docs='http://sjl.bitbucket.org/flask-lesscss/',
197 | bitbucket='sjl/flask-lesscss',
198 | notes='''
199 | Broken package description, nonconforming package name, does not
200 | follow standard API rules (init_lesscss instead of lesscss).
201 |
202 | Considered for unlisting, improved version should release as
203 | "Flask-LessCSS" with a conforming API and fixed packages indices,
204 | as well as a testsuite.
205 | '''
206 | ),
207 | Extension('Flask-Creole', 'Ali Afshar',
208 | description='''
209 | Creole parser filters for Flask.
210 | ''',
211 | docs='http://pythonhosted.org/Flask-Creole',
212 | bitbucket='aafshar/flask-creole-main',
213 | approved=True,
214 | notes='''
215 | Flask-Markdown and this should share API, consider that when
216 | approving Flask-Markdown
217 | '''
218 | ),
219 | Extension('Flask-Cache', 'Thadeus Burgess',
220 | description='''
221 | Adds cache support to your Flask application.
222 | ''',
223 | docs='http://pythonhosted.org/Flask-Cache',
224 | github='thadeusb/flask-cache',
225 | ),
226 | Extension('Flask-Principal', 'Ali Afshar',
227 | description='''
228 | Identity management for Flask.
229 | ''',
230 | docs='http://pythonhosted.org/Flask-Principal',
231 | github='mattupstate/flask-principal',
232 | approved=False
233 | ),
234 | Extension('Flask-Zen', 'Noah Kantrowitz',
235 | description='''
236 | Flask-Zen allows you to use PyZen via Flask-Script commands.
237 | ''',
238 | docs='http://pythonhosted.org/Flask-Zen/',
239 | github='coderanger/flask-zen',
240 | approved=False
241 | ),
242 | Extension('Flask-Static-Compress', 'Alan Hamlett',
243 | description='''
244 | Automatically minifies, combines, and versions your static CSS
245 | and JavaScript assets. Like Django-Compressor for Flask.
246 | ''',
247 | github='alanhamlett/flask-static-compress',
248 | docs='https://github.com/alanhamlett/flask-static-compress',
249 | approved=False
250 | ),
251 | Extension('Flask-Assets', u'Michael Elsdörfer',
252 | description='''
253 |
254 | Integrates the webassets library with Flask, adding support for
255 | merging, minifying and compiling CSS and Javascript files.
256 | ''',
257 | docs='http://elsdoerfer.name/docs/flask-assets/',
258 | github='miracle2k/flask-assets',
259 | approved=False
260 | ),
261 | Extension('Flask-AutoIndex', 'Heungsub Lee',
262 | description='''
263 |
264 | An extension that generates an index page for your Flask
265 | application automatically
266 | ''',
267 | docs='http://pythonhosted.org/Flask-AutoIndex/',
268 | github='sublee/flask-autoindex',
269 | approved=False
270 | ),
271 | Extension('Flask-Celery', 'Ask Solem',
272 | description='''
273 |
274 | Celery integration for Flask
275 | ''',
276 | docs='http://ask.github.com/celery/',
277 | github='ask/flask-celery',
278 | approved=False
279 | ),
280 | Extension('Flask-Cors', 'Cory Dolphin',
281 | description='''
282 |
283 | Cross Origin Resource Sharing (CORS) for flask
284 | ''',
285 | docs='http://flask-cors.readthedocs.org/en/latest/',
286 | github='wcdolphin/flask-cors',
287 | approved=False
288 | ),
289 | Extension('Frozen-Flask', 'Simon Sapin',
290 | description='''
291 |
292 | Freezes a Flask application into a set of static files.
293 | The result can be hosted without any server-side software
294 | other than a traditional web server.
295 | ''',
296 | docs='http://pythonhosted.org/Frozen-Flask/',
297 | github='SimonSapin/Frozen-Flask',
298 | approved=True
299 | ),
300 | Extension('Flask-FlatPages', 'Simon Sapin',
301 | description='''
302 |
303 | Provides flat static pages to a Flask application, based on text
304 | files as opposed to a relational database.
305 | ''',
306 | docs='http://pythonhosted.org/Flask-FlatPages/',
307 | github='SimonSapin/Flask-FlatPages',
308 | approved=True
309 | ),
310 | Extension('Flask-FluidDB', 'Ali Afshar',
311 | description='''
312 |
313 | FluidDB access for Flask.
314 | ''',
315 | docs='http://pythonhosted.org/Flask-FluidDB/',
316 | bitbucket='aafshar/flask-fluiddb-main',
317 | approved=False
318 | ),
319 | Extension('Flask-fillin', 'Christoph Heer',
320 | description='''
321 | The Flask-fillin extension provides simple utilities for testing your forms in Flask application..
322 | ''',
323 | github='jarus/flask-fillin',
324 | docs='http://pythonhosted.org/Flask-fillin/',
325 | ),
326 | Extension('Flask-Gravatar', 'Zelenyak Aleksandr',
327 | description='''
328 |
329 | Small extension for Flask to make using Gravatar easy.
330 | ''',
331 | docs='http://pythonhosted.org/Flask-Gravatar/',
332 | github='zzzsochi/Flask-Gravatar',
333 | approved=False
334 | ),
335 | Extension('Flask-HTMLBuilder', 'Zahari Petkov',
336 | description='''
337 |
338 | Flask-HTMLBuilder is an extension that allows flexible and easy
339 | Python-only generation of HTML snippets and full HTML documents
340 | using a robust syntax.
341 | ''',
342 | docs='http://majorz.github.com/flask-htmlbuilder/',
343 | github='majorz/flask-htmlbuilder',
344 | approved=False
345 | ),
346 | Extension('Flask-MongoAlchemy', 'Francisco Souza',
347 | description='''
348 |
349 | Add Flask support for MongoDB using MongoAlchemy.
350 | ''',
351 | docs='http://pythonhosted.org/Flask-MongoAlchemy/',
352 | github='cobrateam/flask-mongoalchemy',
353 | approved=False
354 | ),
355 | Extension('Flask-DebugToolbar', 'Matt Good',
356 | description='''
357 |
358 | A port of the Django debug toolbar to Flask
359 | ''',
360 | docs='https://github.com/mgood/flask-debugtoolbar',
361 | github='mgood/flask-debugtoolbar',
362 | approved=False
363 | ),
364 | Extension('Flask-Login', 'Matthew Frazier',
365 | description='''
366 |
367 | Flask-Login provides user session management for Flask. It
368 | handles the common tasks of logging in, logging out, and
369 | remembering your users' sessions over extended periods of time.
370 | ''',
371 | github='maxcountryman/flask-login',
372 | docs='http://pythonhosted.org/Flask-Login/',
373 | approved=True
374 | ),
375 | Extension('Flask-Security', 'Matt Wright',
376 | description='''
377 |
378 | Flask-Security is an opinionated Flask extension which adds
379 | basic security and authentication features to your Flask apps
380 | quickly and easily.
381 | ''',
382 | docs='https://pythonhosted.org/Flask-Security/',
383 | github='mattupstate/flask-security'
384 | ),
385 | Extension('Flask-Exceptional', 'Jonathan Zempel',
386 | description='''
387 |
388 | Adds Exceptional support to Flask applications
389 | ''',
390 | docs='http://pythonhosted.org/Flask-Exceptional/',
391 | github='jzempel/flask-exceptional',
392 | approved=True,
393 | ),
394 | Extension('Flask-Bcrypt', 'Max Countryman',
395 | description='''
396 |
397 | Bcrypt support for hashing passwords
398 | ''',
399 | docs='http://pythonhosted.org/Flask-Bcrypt/',
400 | github='maxcountryman/flask-bcrypt',
401 | approved=True,
402 | ),
403 | Extension('Flask-MongoKit', 'Christoph Heer',
404 | description='''
405 |
406 | Flask extension to better integrate MongoKit into Flask
407 | ''',
408 | docs='http://pythonhosted.org/Flask-MongoKit/',
409 | github='jarus/flask-mongokit'
410 | ),
411 | Extension('Flask-GAE-Mini-Profiler', 'Pascal Hartig',
412 | description='''
413 |
414 | Flask integration of gae_mini_profiler for Google App Engine.
415 | ''',
416 | docs='http://pythonhosted.org/Flask-GAE-Mini-Profiler',
417 | github='passy/flask-gae-mini-profiler'
418 | ),
419 | Extension('Flask-Admin', 'Flask-Admin team',
420 | description='''
421 | Simple and extensible administrative interface framework for Flask
422 | ''',
423 | docs='http://flask-admin.readthedocs.org/en/latest/index.html',
424 | github='flask-admin/flask-admin'
425 | ),
426 | Extension('Flask-ZODB', 'Dag Odenhall',
427 | description='''
428 |
429 | Use the ZODB with Flask
430 | ''',
431 | docs='http://pythonhosted.org/Flask-ZODB/',
432 | github='dag/flask-zodb',
433 | approved=True
434 | ),
435 | Extension('Flask-Peewee', 'Charles Leifer',
436 | description='''
437 |
438 | Integrates Flask and the peewee orm
439 | ''',
440 | docs='http://charlesleifer.com/docs/flask-peewee/index.html',
441 | github='coleifer/flask-peewee',
442 | approved=False
443 | ),
444 | Extension('Flask-Lettuce', 'Daniel, Dao Quang Minh',
445 | description='''
446 |
447 | Add Lettuce support for Flask
448 | ''',
449 | # docs='http://pythonhosted.org/Flask-Lettuce/',
450 | github='dqminh/flask-lettuce',
451 | approved=False
452 | ),
453 | Extension('Flask-Sijax', 'Slavi Pantaleev',
454 | description='''
455 |
456 | Flask integration for Sijax,
457 | a Python/jQuery library that makes AJAX easy to use
458 | ''',
459 | docs='http://pythonhosted.org/Flask-Sijax/',
460 | github='spantaleev/flask-sijax',
461 | approved=False
462 | ),
463 | Extension('Flask-Dashed', 'Jean-Philippe Serafin',
464 | description='''
465 |
466 | Flask-Dashed provides tools for building
467 | simple and extensible admin interfaces.
468 | ''',
469 | docs='http://jeanphix.github.com/Flask-Dashed/',
470 | github='jeanphix/Flask-Dashed',
471 | approved=False
472 | ),
473 | Extension('Flask-SeaSurf', 'Max Countryman',
474 | description='''
475 |
476 | SeaSurf is a Flask extension for preventing
477 | cross-site request forgery (CSRF).
478 | ''',
479 | docs='http://pythonhosted.org/Flask-SeaSurf/',
480 | github='maxcountryman/flask-seasurf',
481 | approved=True,
482 | ),
483 | Extension('Flask-PonyWhoosh', 'Jonathan Prieto-Cubides & Felipe Rodriguez',
484 | description='''
485 |
486 | A full-text search engine using Pony ORM and Whoosh.
487 | ''',
488 | docs='https://pythonhosted.org/Flask-PonyWhoosh/',
489 | github='compiteing/flask-ponywhoosh',
490 | ),
491 | Extension('Flask-PyMongo', 'Dan Crosta',
492 | description='''
493 |
494 | Flask-PyMongo bridges Flask and PyMongo.
495 | ''',
496 | docs='http://readthedocs.org/docs/flask-pymongo/',
497 | github='dcrosta/flask-pymongo',
498 | ),
499 | Extension('Flask-Raptor', 'Dan Lepage',
500 | description='''
501 |
502 | Flask-Raptor provides support for adding raptors
503 | to Flask instances.
504 | ''',
505 | docs='http://pythonhosted.org/Flask-Raptor/',
506 | github='dplepage/flask-raptor',
507 | ),
508 | Extension('Flask-Shelve', 'James Saryerwinnie',
509 | description='''
510 |
511 | Flask-Shelve bridges Flask and the Python standard library
512 | `shelve` module, for very simple (slow) no-dependency key-value
513 | storage.
514 | ''',
515 | docs='http://pythonhosted.org/Flask-Shelve/',
516 | github='jamesls/flask-shelve',
517 | ),
518 | Extension('Flask-RESTful', 'Twilio API Team',
519 | description='''
520 | Flask-RESTful provides the building blocks for creating a great REST API.
521 | ''',
522 | docs='https://flask-restful.readthedocs.org/',
523 | github='flask-restful/flask-restful',
524 | approved=True
525 | ),
526 | Extension('Flask-Restless', 'Jeffrey Finkelstein',
527 | description='''
528 | Flask-Restless provides simple generation of ReSTful APIs for
529 | database models defined using Flask-SQLAlchemy. The generated
530 | APIs send and receive messages in JSON format.
531 | ''',
532 | docs='http://readthedocs.org/docs/flask-restless/en/latest/',
533 | github='jfinkels/flask-restless',
534 | approved=True
535 | ),
536 | Extension('Flask-Heroku', 'Kenneth Reitz',
537 | description='''
538 | Sets Flask configuration defaults for Heroku-esque environment variables
539 | ''',
540 | github='kennethreitz/flask-heroku',
541 | approved=False
542 | ),
543 | Extension('Flask-Mako', 'Beranger Enselme, Frank Murphy',
544 | description='''
545 | Allows for Mako templates
546 | to be used instead of Jinja2
547 | ''',
548 | github='benselme/flask-mako',
549 | docs='http://pythonhosted.org/Flask-Mako/',
550 | approved=False
551 | ),
552 | Extension('Flask-WeasyPrint', 'Simon Sapin',
553 | description='''
554 | Make PDF with WeasyPrint
555 | in your Flask app.
556 | ''',
557 | docs='http://pythonhosted.org/Flask-WeasyPrint/',
558 | github='SimonSapin/Flask-WeasyPrint',
559 | ),
560 | Extension('Flask-Classy', 'Freedom Dumlao',
561 | description='''
562 | Class based views for Flask.
563 | ''',
564 | github='apiguy/flask-classy',
565 | docs='http://pythonhosted.org/Flask-Classy/',
566 | approved=False
567 | ),
568 | Extension('Flask-WebTest', 'Anton Romanovich',
569 | description='''
570 | Utilities for testing Flask applications with
571 | WebTest.
572 | ''',
573 | github='aromanovich/flask-webtest',
574 | docs='http://flask-webtest.readthedocs.org/',
575 | approved=False
576 | ),
577 | Extension('Flask-Misaka', 'David Baumgold',
578 | description='''
579 | A simple extension to integrate the
580 | Misaka module for efficiently
581 | parsing Markdown.
582 | ''',
583 | docs='https://flask-misaka.readthedocs.org/en/latest/',
584 | github='singingwolfboy/flask-misaka',
585 | approved=True,
586 | ),
587 | Extension('Flask-Dance', 'David Baumgold',
588 | description='''
589 | Doing the OAuth dance with style using Flask, requests, and oauthlib.
590 | ''',
591 | docs='https://flask-dance.readthedocs.org/en/latest/',
592 | github='singingwolfboy/flask-dance',
593 | approved=True,
594 | ),
595 | Extension('Flask-SSE', 'David Baumgold',
596 | description='''
597 |
598 | Server Sent Events for Flask.
599 | ''',
600 | docs='https://flask-sse.readthedocs.org/en/latest/',
601 | github='singingwolfboy/flask-sse',
602 | approved=True,
603 | ),
604 | Extension('Flask-Limiter', 'Ali-Akber Saifee',
605 | description='''
606 | Adds Ratelimiting support to Flask.
607 | Supports a configurable storage backend with implementations for
608 | in-memory, redis and memcache.
609 | ''',
610 | github='alisaifee/flask-limiter',
611 | docs='http://flask-limiter.readthedocs.org/en/latest/',
612 | approved=False,
613 | ),
614 | Extension('Flask-User', 'Ling Thio',
615 | description='''
616 | Customizable User Account Management for Flask:
617 | Register, Confirm email, Login, Change username, Change password, Forgot password,
618 | Role-based Authorization and Internationalization.
619 | ''',
620 | github='lingthio/flask-user',
621 | docs='http://flask-user.readthedocs.io/',
622 | approved=True,
623 | ),
624 | Extension('Flask-Via', 'SOON_, Chris Reeves',
625 | description='''
626 |
627 | Provides a clean, simple URL routing framework for growing Flask
628 | Applications.
629 | ''',
630 | docs='http://flask-via.soon.build',
631 | github='thisissoon/Flask-Via',
632 | ),
633 | Extension('Flask-QueryInspect', 'Bret Barker',
634 | description='''
635 | Provides metrics on SQL queries (using SQLAlchemy) executed
636 | for each request. Add Stormpath user management, authentication,
644 | and authorization to Flask.
645 | ''',
646 | docs='http://flask-stormpath.readthedocs.org/en/latest/',
647 | github='stormpath/stormpath-flask'
648 | ),
649 | Extension('Flask-Ask', 'John Wheeler',
650 | description='''
651 |
652 | Flask-Ask makes it easy to write Amazon Echo apps with Flask and
653 | the Alexa Skills Kit.
654 | ''',
655 | docs='http://flask-ask.readthedocs.io/en/latest/',
656 | github='johnwheeler/flask-ask'
657 | ),
658 | Extension('Flask-Rest-JSONAPI', 'Pierre Chaisy',
659 | description='''
660 |
661 | Build REST APIs following the
662 | JSONAPI
663 | specification with a powerful data layer system.
664 | ''',
665 | docs='http://flask-rest-jsonapi.readthedocs.io/en/latest/',
666 | github='miLibris/flask-rest-jsonapi'
667 | ),
668 | Extension('Flask-SAML', 'Florian Ruechel',
669 | description='''
670 |
671 | Enable SAML authentication for your webapp.
672 | ''',
673 | docs='https://flask-saml.readthedocs.io/en/latest/',
674 | bitbucket='asecurityteam/flask_saml'
675 | ),
676 | Extension('Flask-Snow', 'Robert Wikman',
677 | description='''
678 |
679 | Flask-snow enables easy access to the REST API in the ServiceNow ITSM platform
680 | with the help of the pysnow library.
681 | Additionally, it supports OAuth for a seamless authentication / authorization experience.
682 | ''',
683 | docs='http://flask-snow.readthedocs.io/en/latest/',
684 | github='rbw0/flask-snow'
685 | ),
686 | Extension('flask-keycloak', 'Akhil Lawrence',
687 | description='''
688 | Flask extension for
689 | Keycloak integration.
690 | ''',
691 | docs='https://github.com/akhilputhiry/flask-keycloak/blob/master/README.md',
692 | github='akhilputhiry/flask-keycloak',
693 | ),
694 | Extension('Flask-MailboxValidator', 'MailboxValidator,
695 | description='''
696 |
697 | Flask-MailboxValidator provides an easy way to call the MailboxValidator API which validates if an email address is a valid one.
698 | ''',
699 | docs='https://flask-mailboxvalidator.readthedocs.io/en/latest/',
700 | github='MailboxValidator/Flask_MailboxValidator'
701 | ),
702 | Extension('Flask-Dropzone', 'Grey Li',
703 | description='''
704 |
705 | Upload file in Flask application with Dropzone.js.
706 | ''',
707 | docs='https://flask-dropzone.readthedocs.io/en/latest/',
708 | github='greyli/flask-dropzone',
709 | ),
710 | Extension('Flask-CKEditor', 'Grey Li',
711 | description='''
712 |
713 | CKEditor integration for Flask, including image
714 | upload, code syntax highlight and more.
715 | ''',
716 | docs='https://flask-ckeditor.readthedocs.io/en/latest/',
717 | github='greyli/flask-ckeditor',
718 | ),
719 | Extension('Bootstrap-Flask', 'Grey Li',
720 | description='''
721 |
722 | Bootstrap 4 helper for Flask/Jinja2.
723 | Based on Flask-Bootstrap, but lighter and better.
724 | ''',
725 | docs='https://bootstrap-flask.readthedocs.io/en/latest/',
726 | github='greyli/bootstrap-flask',
727 | ),
728 | Extension('Flask-Avatars', 'Grey Li',
729 | description='''
730 |
731 | All avatar generators in one place. Including:
732 |
747 | Create social share component in Jinja2 template based on
748 | share.js.
749 | ''',
750 | docs='https://flask-share.readthedocs.io/en/latest/',
751 | github='greyli/flask-share',
752 | ),
753 | Extension('Flask-Praetorian', 'Tucker Beck',
754 | description='''
755 |
756 | API security should be strong, simple, and precise like a Roman
757 | Legionary. This package aims to provide that. Using JWT tokens as
758 | implemented by PyJWT, flask-praetorian uses a very simple
759 | interface to make sure that the users accessing your API’s
760 | endpoints are provisioned with the correct roles for access.
761 | ''',
762 | docs='http://flask-praetorian.readthedocs.io/en/latest/',
763 | github='dusktreader/flask-praetorian',
764 | ),
765 | Extension('Flask-MonitoringDashboard', 'Patrick Vogel',
766 | description='''
767 |
768 | Flask-MonitoringDashboard is an extension that offers 3 main functionalities with little effort from the
769 | Flask developer:
770 |
70 |
74 | ''',
75 | github='mitsuhiko/flask-sqlalchemy',
76 | docs='http://flask-sqlalchemy.pocoo.org/',
77 | approved=True
78 | ),
79 | Extension('Flask-Migrate', 'Miguel Grinberg',
80 | description='''
81 |
733 |
740 | ''',
741 | docs='https://flask-avatars.readthedocs.io/en/latest/',
742 | github='greyli/flask-avatars',
743 | ),
744 | Extension('Flask-Share', 'Grey Li',
745 | description='''
746 |
771 |
775 |
Plugs Dramatiq task queue in your 783 | Flask web app. 784 | ''', 785 | docs='https://flask-dramatiq.readthedocs.io/', 786 | gitlab='https://gitlab.com/bersace/flask-dramatiq', 787 | ), 788 | Extension('Flask-Assistant', 'Cam Sweeney', 789 | description=''' 790 |
791 | Framework for building conversational apps using 792 | Flask and API.AI with integration for Google Assistant. 793 | ''', 794 | docs='http://flask-assistant.readthedocs.io/en/latest/', 795 | github='treethought/flask-assistant' 796 | ), 797 | ] 798 | 799 | 800 | # This is a list of extensions that is currently rejected from listing and with 801 | # that also not approved. If an extension ends up here it should improved to 802 | # be listed. 803 | unlisted = [ 804 | Extension('Flask-Actions', 'Young King', 805 | description=''' 806 |
807 | Flask-actions provide some management comands for flask based 808 | project. 809 | ''', 810 | docs='http://pythonhosted.org/Flask-Actions/', 811 | bitbucket='youngking/flask-actions', 812 | approved=False, 813 | notes=''' 814 | Rejected because of missing description in PyPI, formatting issues 815 | with the documentation (missing headlines, scrollbars etc.) and a 816 | general clash of functionality with the Flask-Script package. 817 | Latter should not be a problem, but the documentation should 818 | improve. For listing, the extension developer should probably 819 | discuss the extension on the mailinglist with others. 820 | 821 | Futhermore it also has an egg registered with an invalid filename. 822 | ''' 823 | ), 824 | Extension('Flask-Jinja2Extender', 'Dan Colish', 825 | description=''' 826 |
827 | ''', 828 | docs=None, 829 | github='dcolish/flask-jinja2extender', 830 | approved=False, 831 | notes=''' 832 | Appears to be discontinued. 833 | 834 | Usecase not obvious, hacky implementation, does not solve a problem 835 | that could not be solved with Flask itself. I suppose it is to aid 836 | other extensions, but that should be discussed on the mailinglist. 837 | ''' 838 | ), 839 | Extension('Flask-Markdown', 'Dan Colish', 840 | description=''' 841 |
842 | This is a small module to a markdown processing filter into your 843 | flask. 844 | ''', 845 | docs='http://pythonhosted.org/Flask-Markdown/', 846 | github='dcolish/flask-markdown', 847 | approved=False, 848 | notes=''' 849 | Would be great for enlisting but it should follow the API of 850 | Flask-Creole. Besides that, the docstrings are not valid rst (run 851 | through rst2html to see the issue) and it is missing tests. 852 | Otherwise fine :) 853 | ''' 854 | ), 855 | Extension('flask-urls', 'Steve Losh', 856 | description=''' 857 |
858 | A collection of URL-related functions for Flask applications. 859 | ''', 860 | docs='http://sjl.bitbucket.org/flask-urls/', 861 | bitbucket='sjl/flask-urls', 862 | approved=False, 863 | notes=''' 864 | Broken PyPI index and non-conforming extension name. Due to the 865 | small featureset this was also delisted from the list. It was 866 | there previously before the approval process was introduced. 867 | ''' 868 | ), 869 | Extension('Flask-Coffee', 'Col Wilson', 870 | description=''' 871 |
872 | Automatically compile CoffeeScript files while developing with 873 | the Flask framework. 874 | ''', 875 | docs=None, 876 | approved=False, 877 | notes=''' 878 | On the mailing list, author claims it's flask-lesscss with a 879 | different label. No sphinx-based docs, just a blog post. No 880 | publicly accessible repository -- requires login on 881 | bettercodes.org. 882 | ''' 883 | ), 884 | Extension('Flask-Solr', 'Ron DuPlain', 885 | description=''' 886 |
887 | Add Solr support to Flask using pysolr. 888 | ''', 889 | docs=None, 890 | github='willowtreeapps/flask-solr', 891 | notes=''' 892 | Fully exposes pysolr API in Flask extension pattern, and code is 893 | production-ready. It lacks documentation and tests. 894 | ''' 895 | ), 896 | Extension('flask-csrf', 'Steve Losh', 897 | description=''' 898 |
A small Flask extension for adding 899 | CSRF protection. 900 | ''', 901 | docs='http://sjl.bitbucket.org/flask-csrf/', 902 | bitbucket='sjl/flask-csrf', 903 | notes=''' 904 | Unlisted because duplicates the Flask-SeaSurf extension. 905 | ''' 906 | ), 907 | ] 908 | 909 | 910 | extensions.sort(key=lambda x: x.name.lower()) 911 | unlisted.sort(key=lambda x: x.name.lower()) 912 | -------------------------------------------------------------------------------- /flask_website/listings/projects.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from urlparse import urlparse 3 | from flask import Markup 4 | 5 | 6 | class Project(object): 7 | def __init__(self, name, url, description, source=None): 8 | self.name = name 9 | self.url = url 10 | self.description = Markup(description) 11 | self.source = source 12 | 13 | @property 14 | def host(self): 15 | if self.url is not None: 16 | return urlparse(self.url)[1] 17 | 18 | @property 19 | def sourcehost(self): 20 | if self.source is not None: 21 | return urlparse(self.source)[1] 22 | 23 | def to_json(self): 24 | rv = vars(self).copy() 25 | rv['description'] = unicode(rv['description']) 26 | return rv 27 | 28 | 29 | projects = { 30 | 'websites': [ 31 | Project('Flask Website', 'http://flask.pocoo.org/', ''' 32 |
33 | The website of the Flask microframework itself including the 34 | mailinglist interface, snippet archive and extension registry. 35 | '''), 36 | Project('Brightonpy', 'http://brightonpy.org/', ''' 37 |
38 | The website of the Brighton Python User Group 39 | ''', source='http://github.com/j4mie/brightonpy.org/'), 40 | Project(u's h o r e … software development', 'http://shore.be/', ''' 41 |
Corporate website of Shore Software Development. 42 | '''), 43 | Project(u'ROCKYOU.fm', 'https://www.rockyou.fm/', ''' 44 |
45 | ROCKYOU.fm is a german internet radio station and webzine 46 | featuring mostly metal and hard rock. Since 2012 the DJs and 47 | reporters provide their listeners with news, reviews, feature 48 | shows and interviews. 49 | '''), 50 | Project(u'MetalSpy', 'https://www.metalspy.de/', ''' 51 |
52 | MetalSpy.de is the portfolio website of a german hobby 53 | photographer featuring mainly photos of metal bands, 54 | festivals, fantasy conventions and cosplay. 55 | '''), 56 | Project('ThadeusB\'s Website', 'http://thadeusb.com/', u''' 57 |
58 | Personal website of ThadeusB. 59 | '''), 60 | Project('Blueslug', 'http://blueslug.com/', u''' 61 |
62 | A flask-powered anti-social delicious clone 63 | '''), 64 | Project('DotShare', 'http://dotshare.it/', u''' 65 |
66 | Socially driven website for sharing Linux/Unix dot files. 67 | '''), 68 | Project( 69 | 'sopython', 'http://sopython.com/', 70 | '
Site of the Python chat room on Stack Overflow. ' 71 | 'Includes OAuth authentication, a wiki, and a growing, ' 72 | 'searchable list of "canonical" answers to Python ' 73 | 'questions on SO.
', 74 | source='https://github.com/sopython/sopython-site' 75 | ) 76 | ], 77 | 'apps': [ 78 | Project('hg-review', None, ''' 79 |80 | hg-review is a code review system for Mercurial. It is available 81 | GPL2 license. 82 | ''', source='http://bitbucket.org/sjl/hg-review/'), 83 | Project('Ryshcate', None, ''' 84 |
85 | Ryshcate is a Flask powered pastebin with sourcecode 86 | available. 87 | ''', source='http://bitbucket.org/leafstorm/ryshcate/'), 88 | Project(u'Übersuggest Keyword Suggestion Tool', None, u''' 89 |
90 | Übersuggest is a free tool that exploit the Google 91 | suggest JSON API to get keyword ideas for your search marketing 92 | campaign (PPC or SEO). 93 | ''', source='http://bitbucket.org/esaurito/ubersuggest'), 94 | Project('Have they emailed me?', None, ''' 95 |
96 | A mini-site for checking Google's GMail feed with Oauth. 97 | ''', source='http://github.com/lincolnloop/emailed-me'), 98 | Project('Remar.kZ', None, ''' 99 |
100 | Sometimes you use someone else's computer and find something 101 | neat and interesting. Store it on Remar.kZ without having 102 | to enter your credentials. 103 | ''', source='http://bitbucket.org/little_arhat/remarkz'), 104 | Project('Domination', None, u''' 105 |
106 | Domination is a clone of a well-known card game. 107 | ''', source='https://bitbucket.org/xoraxax/domination/'), 108 | Project('jitviewer', None, ''' 109 |
110 | web-based tool to inspect the output of PyPy JIT log 111 | ''', source='https://bitbucket.org/pypy/jitviewer'), 112 | Project('blohg', 'http://blohg.org/', ''' 113 |
114 | A mercurial based blog engine. 115 | ''', source='https://github.com/rafaelmartins/blohg'), 116 | Project('pidsim-web', None, ''' 117 |
118 | PID Controller simulator. 119 | ''', source='https://github.com/rafaelmartins/pidsim-web'), 120 | Project('HTTPBin', 'http://httpbin.org/', u''' 121 |
122 | An HTTP request & response service. 123 | ''', source='https://github.com/kennethreitz/httpbin'), 124 | Project('Flask-Pastebin', None, u''' 125 |
126 | Pastebin app with Flask and a few extensions that does Facebook 127 | connect as well as realtime push notifications with socket.io 128 | and juggernaut. 129 | ''', source='https://github.com/mitsuhiko/flask-pastebin'), 130 | Project('newsmeme', None, u''' 131 |
132 | A hackernews/reddit clone written with Flask and 133 | various Flask extensions. 134 | ''', source='https://bitbucket.org/danjac/newsmeme'), 135 | Project('Indico', 'https://getindico.io/', u''' 136 |
137 | Indico is a full-fledged meeting and conference management 138 | system developed at CERN. It includes advanced features such 139 | as integration with collaborative systems, a plugin system 140 | and support for SSO-based authentication. 141 | ''', source='https://github.com/indico/indico/'), 142 | Project('SayHello', 'http://sayhello.helloflask.com', u''' 143 |
144 | A simple message board. 145 | ''', source='https://github.com/greyli/sayhello'), 146 | Project('Bluelog', 'http://bluelog.helloflask.com', u''' 147 |
148 | A blog engine that supports category and resource management. 149 | ''', source='https://github.com/greyli/bluelog'), 150 | Project('Albumy', 'http://albumy.helloflask.com', u''' 151 |
152 | A full-featured photo-sharing social networking. 153 | ''', source='https://github.com/greyli/albumy'), 154 | Project('Todoism', 'http://todoism.helloflask.com', u''' 155 |
156 | A to-do application implements as SPA, it supports 157 | i18n (Flask-Babel) and provides web APIs. 158 | ''', source='https://github.com/greyli/todoism'), 159 | Project('CatChat', 'http://catchat.helloflask.com', u''' 160 |
161 | A chat room based on WebSocket (Flask-Socket-IO), fetured 162 | with Markdown support and code syntax highlighting. 163 | ''', source='https://github.com/greyli/catchat'), 164 | ] 165 | 166 | } 167 | 168 | # order projects by name 169 | for _category in projects.itervalues(): 170 | _category.sort(key=lambda x: x.name.lower()) 171 | del _category 172 | -------------------------------------------------------------------------------- /flask_website/listings/releases.py: -------------------------------------------------------------------------------- 1 | from urlparse import urljoin 2 | 3 | 4 | server = 'https://pypi.org/' 5 | detail_path = '/project/Flask/%s/' 6 | 7 | 8 | class Release(object): 9 | 10 | def __init__(self, version): 11 | self.version = version 12 | 13 | def to_json(self): 14 | return dict(version=self.version, 15 | detail_url=self.detail_url) 16 | 17 | @property 18 | def detail_url(self): 19 | return urljoin(server, detail_path % self.version) 20 | 21 | 22 | releases = map(Release, [ 23 | '0.1', 24 | '0.2', 25 | '0.3', 26 | '0.3.1', 27 | '0.4', 28 | '0.5', 29 | '0.5.1', 30 | '0.5.2', 31 | '0.6', 32 | '0.6.1', 33 | '0.7', 34 | '0.7.1', 35 | '0.7.2', 36 | '0.8', 37 | '0.8.1', 38 | '0.9', 39 | '0.10', 40 | '0.10.1', 41 | '0.11', 42 | '0.11.1', 43 | '0.12', 44 | '0.12.1', 45 | '0.12.2', 46 | '0.12.3', 47 | '0.12.4', 48 | '1.0', 49 | '1.0.1', 50 | '1.0.2', 51 | ]) 52 | -------------------------------------------------------------------------------- /flask_website/openid_auth.py: -------------------------------------------------------------------------------- 1 | from time import time 2 | 3 | from openid.association import Association 4 | from openid.store.interface import OpenIDStore 5 | from openid.store import nonce 6 | 7 | from flask_website.database import db_session, OpenIDAssociation, \ 8 | OpenIDUserNonce 9 | 10 | 11 | class DatabaseOpenIDStore(OpenIDStore): 12 | """Implements the open store for the website using the database.""" 13 | 14 | def storeAssociation(self, server_url, association): 15 | assoc = OpenIDAssociation( 16 | server_url=server_url, 17 | handle=association.handle, 18 | secret=association.secret.encode('base64'), 19 | issued=association.issued, 20 | lifetime=association.lifetime, 21 | assoc_type=association.assoc_type 22 | ) 23 | db_session.add(assoc) 24 | db_session.commit() 25 | 26 | def getAssociation(self, server_url, handle=None): 27 | q = OpenIDAssociation.query.filter_by(server_url=server_url) 28 | if handle is not None: 29 | q = q.filter_by(handle=handle) 30 | result_assoc = None 31 | for item in q.all(): 32 | assoc = Association(item.handle, item.secret.decode('base64'), 33 | item.issued, item.lifetime, item.assoc_type) 34 | if assoc.getExpiresIn() <= 0: 35 | self.removeAssociation(server_url, assoc.handle) 36 | else: 37 | result_assoc = assoc 38 | return result_assoc 39 | 40 | def removeAssociation(self, server_url, handle): 41 | try: 42 | return OpenIDAssociation.query.filter( 43 | (OpenIDAssociation.server_url == server_url) & 44 | (OpenIDAssociation.handle == handle) 45 | ).delete() 46 | finally: 47 | db_session.commit() 48 | 49 | def useNonce(self, server_url, timestamp, salt): 50 | if abs(timestamp - time()) > nonce.SKEW: 51 | return False 52 | rv = OpenIDUserNonce.query.filter( 53 | (OpenIDUserNonce.server_url == server_url) & 54 | (OpenIDUserNonce.timestamp == timestamp) & 55 | (OpenIDUserNonce.salt == salt) 56 | ).first() 57 | if rv is not None: 58 | return False 59 | rv = OpenIDUserNonce(server_url=server_url, timestamp=timestamp, 60 | salt=salt) 61 | db_session.add(rv) 62 | db_session.commit() 63 | return True 64 | 65 | def cleanupNonces(self): 66 | try: 67 | return OpenIDUserNonce.query.filter( 68 | OpenIDUserNonce.timestamp <= int(time() - nonce.SKEW) 69 | ).delete() 70 | finally: 71 | db_session.commit() 72 | 73 | def cleanupAssociations(self): 74 | try: 75 | return OpenIDAssociation.query.filter( 76 | OpenIDAssociation.lifetime < int(time()) 77 | ).delete() 78 | finally: 79 | db_session.commit() 80 | -------------------------------------------------------------------------------- /flask_website/search.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | import os 3 | from whoosh import highlight, analysis, qparser 4 | from whoosh.support.charset import accent_map 5 | from flask import Markup 6 | from flask_website import app 7 | from werkzeug import import_string 8 | 9 | 10 | def open_index(): 11 | from whoosh import index, fields as f 12 | if os.path.isdir(app.config['WHOOSH_INDEX']): 13 | return index.open_dir(app.config['WHOOSH_INDEX']) 14 | os.mkdir(app.config['WHOOSH_INDEX']) 15 | analyzer = analysis.StemmingAnalyzer() | analysis.CharsetFilter(accent_map) 16 | schema = f.Schema( 17 | url=f.ID(stored=True, unique=True), 18 | id=f.ID(stored=True), 19 | title=f.TEXT(stored=True, field_boost=2.0, analyzer=analyzer), 20 | type=f.ID(stored=True), 21 | keywords=f.KEYWORD(commas=True), 22 | content=f.TEXT(analyzer=analyzer) 23 | ) 24 | return index.create_in(app.config['WHOOSH_INDEX'], schema) 25 | 26 | 27 | index = open_index() 28 | 29 | 30 | class Indexable(object): 31 | search_document_kind = None 32 | 33 | def add_to_search_index(self, writer): 34 | writer.add_document(url=unicode(self.url), 35 | type=self.search_document_type, 36 | **self.get_search_document()) 37 | 38 | @classmethod 39 | def describe_search_result(cls, result): 40 | return None 41 | 42 | @property 43 | def search_document_type(self): 44 | cls = type(self) 45 | return cls.__module__ + u'.' + cls.__name__ 46 | 47 | def get_search_document(self): 48 | raise NotImplementedError() 49 | 50 | def remove_from_search_index(self, writer): 51 | writer.delete_by_term('url', unicode(self.url)) 52 | 53 | 54 | def highlight_all(result, field): 55 | text = result[field] 56 | return Markup(highlight.Highlighter( 57 | fragmenter=highlight.WholeFragmenter(), 58 | formatter=result.results.highlighter.formatter) 59 | .highlight_hit(result, field, text=text)) or text 60 | 61 | 62 | class SearchResult(object): 63 | 64 | def __init__(self, result): 65 | self.url = result['url'] 66 | self.title_text = result['title'] 67 | self.title = highlight_all(result, 'title') 68 | cls = import_string(result['type']) 69 | self.kind = cls.search_document_kind 70 | self.description = cls.describe_search_result(result) 71 | 72 | 73 | class SearchResultPage(object): 74 | 75 | def __init__(self, results, page): 76 | self.page = page 77 | if results is None: 78 | self.results = [] 79 | self.pages = 1 80 | self.total = 0 81 | else: 82 | self.results = [SearchResult(r) for r in results] 83 | self.pages = results.pagecount 84 | self.total = results.total 85 | 86 | def __iter__(self): 87 | return iter(self.results) 88 | 89 | 90 | def search(query, page=1, per_page=20): 91 | with index.searcher() as s: 92 | qp = qparser.MultifieldParser(['title', 'content'], index.schema) 93 | q = qp.parse(unicode(query)) 94 | try: 95 | result_page = s.search_page(q, page, pagelen=per_page) 96 | except ValueError: 97 | if page == 1: 98 | return SearchResultPage(None, page) 99 | return None 100 | results = result_page.results 101 | results.highlighter.fragmenter.maxchars = 512 102 | results.highlighter.fragmenter.surround = 40 103 | results.highlighter.formatter = highlight.HtmlFormatter('em', 104 | classname='search-match', termclass='search-term', 105 | between=u' … ') 106 | return SearchResultPage(result_page, page) 107 | 108 | 109 | def update_model_based_indexes(session, flush_context): 110 | """Called by a session event, updates the model based documents.""" 111 | to_delete = [] 112 | to_add = [] 113 | for model in session.new: 114 | if isinstance(model, Indexable): 115 | to_add.append(model) 116 | 117 | for model in session.dirty: 118 | if isinstance(model, Indexable): 119 | to_delete.append(model) 120 | to_add.append(model) 121 | 122 | for model in session.dirty: 123 | if isinstance(model, Indexable): 124 | to_delete.append(model) 125 | 126 | if not (to_delete or to_add): 127 | return 128 | 129 | writer = index.writer() 130 | for model in to_delete: 131 | model.remove_from_search_index(writer) 132 | for model in to_add: 133 | model.add_to_search_index(writer) 134 | writer.commit() 135 | 136 | 137 | def update_documentation_index(): 138 | from flask_website.docs import DocumentationPage 139 | writer = index.writer() 140 | for page in DocumentationPage.iter_pages(): 141 | page.remove_from_search_index(writer) 142 | page.add_to_search_index(writer) 143 | writer.commit() 144 | 145 | 146 | def reindex_snippets(): 147 | from flask_website.database import Snippet 148 | writer = index.writer() 149 | for snippet in Snippet.query.all(): 150 | snippet.remove_from_search_index(writer) 151 | snippet.add_to_search_index(writer) 152 | writer.commit() 153 | -------------------------------------------------------------------------------- /flask_website/static/approved.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pallets/flask-website/8b083412f98842ee5e2b674cad40b8bf18501216/flask_website/static/approved.png -------------------------------------------------------------------------------- /flask_website/static/badges/flask-powered.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pallets/flask-website/8b083412f98842ee5e2b674cad40b8bf18501216/flask_website/static/badges/flask-powered.png -------------------------------------------------------------------------------- /flask_website/static/badges/flask-project-s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pallets/flask-website/8b083412f98842ee5e2b674cad40b8bf18501216/flask_website/static/badges/flask-project-s.png -------------------------------------------------------------------------------- /flask_website/static/badges/i-wish.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pallets/flask-website/8b083412f98842ee5e2b674cad40b8bf18501216/flask_website/static/badges/i-wish.png -------------------------------------------------------------------------------- /flask_website/static/badges/made-with-flask-s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pallets/flask-website/8b083412f98842ee5e2b674cad40b8bf18501216/flask_website/static/badges/made-with-flask-s.png -------------------------------------------------------------------------------- /flask_website/static/badges/powered-by-flask-s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pallets/flask-website/8b083412f98842ee5e2b674cad40b8bf18501216/flask_website/static/badges/powered-by-flask-s.png -------------------------------------------------------------------------------- /flask_website/static/badges/unfortunately-not.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pallets/flask-website/8b083412f98842ee5e2b674cad40b8bf18501216/flask_website/static/badges/unfortunately-not.png -------------------------------------------------------------------------------- /flask_website/static/community.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pallets/flask-website/8b083412f98842ee5e2b674cad40b8bf18501216/flask_website/static/community.png -------------------------------------------------------------------------------- /flask_website/static/edit-snippet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pallets/flask-website/8b083412f98842ee5e2b674cad40b8bf18501216/flask_website/static/edit-snippet.png -------------------------------------------------------------------------------- /flask_website/static/extensions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pallets/flask-website/8b083412f98842ee5e2b674cad40b8bf18501216/flask_website/static/extensions.png -------------------------------------------------------------------------------- /flask_website/static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pallets/flask-website/8b083412f98842ee5e2b674cad40b8bf18501216/flask_website/static/favicon.ico -------------------------------------------------------------------------------- /flask_website/static/login.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pallets/flask-website/8b083412f98842ee5e2b674cad40b8bf18501216/flask_website/static/login.png -------------------------------------------------------------------------------- /flask_website/static/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pallets/flask-website/8b083412f98842ee5e2b674cad40b8bf18501216/flask_website/static/logo.png -------------------------------------------------------------------------------- /flask_website/static/logo/flask.eps: -------------------------------------------------------------------------------- 1 | %!PS-Adobe-3.0 EPSF-3.0 2 | %%Creator: cairo 1.8.6 (http://cairographics.org) 3 | %%CreationDate: Tue May 18 17:03:27 2010 4 | %%Pages: 1 5 | %%BoundingBox: 0 0 349 137 6 | %%DocumentData: Clean7Bit 7 | %%LanguageLevel: 2 8 | %%EndComments 9 | %%BeginProlog 10 | /cairo_eps_state save def 11 | /dict_count countdictstack def 12 | /op_count count 1 sub def 13 | userdict begin 14 | /q { gsave } bind def 15 | /Q { grestore } bind def 16 | /cm { 6 array astore concat } bind def 17 | /w { setlinewidth } bind def 18 | /J { setlinecap } bind def 19 | /j { setlinejoin } bind def 20 | /M { setmiterlimit } bind def 21 | /d { setdash } bind def 22 | /m { moveto } bind def 23 | /l { lineto } bind def 24 | /c { curveto } bind def 25 | /h { closepath } bind def 26 | /re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto 27 | 0 exch rlineto 0 rlineto closepath } bind def 28 | /S { stroke } bind def 29 | /f { fill } bind def 30 | /f* { eofill } bind def 31 | /B { fill stroke } bind def 32 | /B* { eofill stroke } bind def 33 | /n { newpath } bind def 34 | /W { clip } bind def 35 | /W* { eoclip } bind def 36 | /BT { } bind def 37 | /ET { } bind def 38 | /pdfmark where { pop globaldict /?pdfmark /exec load put } 39 | { globaldict begin /?pdfmark /pop load def /pdfmark 40 | /cleartomark load def end } ifelse 41 | /BDC { mark 3 1 roll /BDC pdfmark } bind def 42 | /EMC { mark /EMC pdfmark } bind def 43 | /cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def 44 | /Tj { show currentpoint cairo_store_point } bind def 45 | /TJ { 46 | { 47 | dup 48 | type /stringtype eq 49 | { show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse 50 | } forall 51 | currentpoint cairo_store_point 52 | } bind def 53 | /cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore 54 | cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def 55 | /Tf { pop /cairo_font exch def /cairo_font_matrix where 56 | { pop cairo_selectfont } if } bind def 57 | /Td { matrix translate cairo_font_matrix matrix concatmatrix dup 58 | /cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point 59 | /cairo_font where { pop cairo_selectfont } if } bind def 60 | /Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def 61 | cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def 62 | /g { setgray } bind def 63 | /rg { setrgbcolor } bind def 64 | /d1 { setcachedevice } bind def 65 | %%EndProlog 66 | %%Page: 1 1 67 | %%BeginPageSetup 68 | %%PageBoundingBox: 0 0 349 137 69 | %%EndPageSetup 70 | q 71 | 0 g 72 | 45.699 14.946 m 39.875 19.528 33.66 23.919 29.414 30.106 c 20.477 73 | 41.016 13.598 53.645 8.895 66.919 c 6.051 75.551 5.078 84.805 1.41 74 | 93.102 c -2.422 99.13 2.07 105.715 8.672 107.63 c 11.609 108.196 16.777 75 | 110.969 10.539 108.985 c 4.945 104.883 4.406 112.712 10.141 113.208 c 76 | 14.055 113.727 15.496 116.93 14.156 119.813 c 9.953 122.555 24.344 77 | 125.563 17.102 129.653 c 9.563 137.79 27.652 139.356 23.188 130.114 c 78 | 22.121 123.008 35.832 131.419 32.648 123.212 c 35.883 119.27 44.758 79 | 122.313 44.535 116.786 c 49.246 116.462 50.863 112.501 55.281 112.196 c 80 | 59.867 110.126 68.172 108.497 69.73 103.333 c 65.184 99.735 54.66 81 | 110.766 54.152 100.805 c 55.527 86.087 55.176 70.926 60.559 56.911 c 82 | 63.105 48.426 69.281 41.747 74.855 35.137 c 80.191 28.665 87.418 24.106 83 | 94.785 20.27 c 101.246 17.223 108.211 15.204 115.254 13.934 c 118.109 84 | 16.118 123.152 24.239 127.605 20.817 c 127.82 16.965 118.766 12.77 85 | 127.18 13.196 c 132.125 14.688 135.551 9.376 139.621 14.169 c 143.371 86 | 9.727 155.207 17.005 152.539 7.926 c 148.93 5.598 143.668 7.005 140.055 87 | 3.801 c 134.098 6.778 129.355 1.141 122.758 1.852 c 115.434 0.54 107.98 88 | 0.012 100.555 0.001 c 88.371 0.962 75.93 1.368 64.34 5.61 c 57.809 89 | 7.508 51.438 11.227 45.699 14.946 c h 90 | 55.988 10.485 m 62.363 7.731 68.598 4.825 75.586 3.946 c 86.672 2.407 91 | 98.121 0.032 109.246 2.196 c 104.211 4.469 99.004 1.313 93.988 3.821 c 92 | 87.973 2.528 81.516 4.153 75.398 4.954 c 68.445 8.051 60.938 10.18 93 | 54.426 14.204 c 46.285 17.176 58.633 10.391 60.832 9.84 c 65.918 6.954 94 | 55.238 11.321 53.73 12.52 c 49.469 14.911 48.926 14.411 53.309 11.985 c 95 | 54.191 11.469 55.063 10.926 55.988 10.485 c h 96 | 43.855 19.059 m 50.035 16.77 43.828 23.403 41 23.02 c 39.746 25.196 97 | 36.207 26.571 38.703 27.739 c 34.215 26.18 34 33.665 31.891 32.594 c 98 | 27.141 34.094 30.043 39.407 24.383 42.672 c 23.867 46.11 18.762 49.09 99 | 17.137 54.274 c 16.418 56.93 11.367 64.551 14.469 57.458 c 17.109 50.63 100 | 21.754 44.778 25.621 38.938 c 28.621 33.376 32.168 27.559 37.633 24.09 101 | c 39.477 22.321 41.254 19.614 43.855 19.059 c h 102 | 26.059 38.602 m 26.273 39.536 27.188 36.583 26.059 38.602 c h 103 | 51.258 16.317 m 52.625 16.93 49.289 17.09 51.258 16.317 c h 104 | 54.609 15.094 m 54.262 16.782 53.078 14.149 54.609 15.094 c h 105 | 58.809 13.344 m 60.805 15.247 55.727 14.544 58.809 13.344 c h 106 | 66.004 9.333 m 67.219 11.126 62.117 10.008 66.004 9.333 c h 107 | 52.188 18.965 m 55.289 20.973 48.176 18.993 52.188 18.965 c h 108 | 55.336 17.395 m 55.246 18.454 54.215 16.919 55.336 17.395 c h 109 | 71.074 7.571 m 73.605 5.973 85.852 4.071 78.184 6.915 c 76.898 6.645 110 | 63.965 10.575 71.074 7.571 c h 111 | 46.09 27.032 m 45.844 28.094 42.16 28.208 46.09 27.032 c h 112 | 53.414 22.758 m 55.324 24.09 49.457 23.786 53.414 22.758 c h 113 | 59.578 18.981 m 62.316 20.012 55.141 20.016 59.578 18.981 c h 114 | 43.105 30.278 m 46.074 28.001 55.082 29.985 47.652 31.637 c 44.273 115 | 33.438 36.656 34.672 41.848 30.551 c 43.105 30.278 l 43.105 30.278 l h 116 | 63.754 17.676 m 64.992 19.782 58.566 18.88 63.754 17.676 c h 117 | 57.48 22.661 m 64.738 20.61 51.375 27.255 55.688 23.419 c 56.645 22.985 118 | l 57.48 22.661 l 57.48 22.661 l h 119 | 70.059 15.391 m 76.934 15.325 63.848 16.34 70.059 15.391 c 70.059 120 | 15.391 l h 121 | 40.461 34.255 m 40.191 35.536 38.766 34.149 40.461 34.255 c h 122 | 81.688 8.868 m 81.871 11.18 79.445 7.145 81.688 8.868 c h 123 | 52.195 27.071 m 51.777 28.29 50.047 27.122 52.195 27.071 c h 124 | 41.113 35.059 m 45.059 35.297 35.707 36.797 41.113 35.059 c h 125 | 27.984 43.544 m 27.492 45.438 23.691 46.946 27.984 43.544 c h 126 | 62.449 21.672 m 61.727 22.497 62.109 21.493 62.449 21.672 c h 127 | 83.898 8.508 m 83.832 9.77 82.73 8.032 83.898 8.508 c h 128 | 60.551 23.633 m 60.938 25.258 57.184 24.126 60.551 23.633 c h 129 | 44.57 33.762 m 47.508 34.075 39.863 35.747 44.57 33.762 c h 130 | 71.602 16.965 m 76.18 18.778 67.141 17.848 71.602 16.965 c h 131 | 57.543 26.508 m 62.816 25.829 51.266 30.098 56.383 26.891 c 57.543 132 | 26.508 l 57.543 26.508 l h 133 | 75.871 15.239 m 80.797 18.18 79.172 8.344 84.227 14.407 c 89.211 18.047 134 | 79.922 9.907 86.063 13.758 c 90.508 16.731 97.07 12.348 101.215 10.922 135 | c 104.195 11.067 107.094 8.344 110.152 10.001 c 116.035 11.587 98.645 136 | 12.352 103.203 15.161 c 97.82 13.594 93.844 17.028 91.195 20.477 c 137 | 85.156 21.872 78.176 24.958 75.16 30.305 c 73.93 32.309 76.934 30.02 138 | 74.098 33.301 c 70.461 36.536 68.645 40.212 66.203 44.145 c 63.285 45.7 139 | 62.941 50.282 62.648 44.297 c 62.672 48.075 59.125 50.618 58.258 49.563 140 | c 58.242 53.2 62.055 51.376 59.387 54.067 c 58.813 57.837 56.922 61.766 141 | 56.355 66.024 c 55.473 68.075 56.23 72.469 53.34 67.825 c 52.289 62.915 142 | 52.992 73.856 54.629 70.251 c 56.777 73.93 53.855 73.497 53.738 72.989 143 | c 55.137 76.094 54.625 80.501 53.371 78.821 c 54.117 82.114 54.551 144 | 90.938 52.258 89.372 c 53.648 92.817 54.895 105.13 48.855 100.434 c 145 | 46.41 100.399 42.172 99.547 40.172 98.551 c 46.449 95.09 39.539 97.301 146 | 36.98 97.852 c 36.648 94.649 34.117 96.032 30.953 96.001 c 36.008 147 | 95.376 28.492 90.833 25.598 92.598 c 21.832 90.801 28.844 86.309 25.672 148 | 84.919 c 26.063 82.829 19.906 85.676 20.387 80.84 c 16.734 82.38 19.887 149 | 75.106 21.715 77.567 c 27.93 75.883 26.09 72.051 26.246 68.407 c 25.234 150 | 66.286 21.246 73.395 25.359 73.067 c 22.113 78.337 21.77 74.973 19.074 151 | 72.524 c 18.449 72.348 25.949 69.04 21.242 67.407 c 25.383 66.766 152 | 25.504 63.141 26.348 60.848 c 28.836 58.255 28.324 63.712 31.305 60.594 153 | c 29.418 63.372 21.32 68.419 27.84 66.801 c 27.805 69.594 26.66 71.848 154 | 28.66 71.794 c 30.641 75.376 26.586 62.958 31.047 67.512 c 32.281 155 | 68.051 32.59 71.098 34.809 67.223 c 38.031 64.051 35.973 61.755 31.426 156 | 64.661 c 32.238 61.899 37.508 60.915 36.516 56.598 c 37.566 52.801 157 | 39.035 54.2 40.316 54.419 c 41.32 50.731 41.891 53.442 41.938 55.2 c 158 | 46.535 54.215 45.457 51.497 46.898 49.598 c 50.066 48.169 42.363 59.29 159 | 47.801 52.942 c 53.523 47.774 49.949 45.618 44.813 46.446 c 48.063 160 | 46.708 49.109 42.051 53.176 42.215 c 56.883 40.45 59.395 33.676 53.004 161 | 36.497 c 50.789 38.497 42.941 40.962 49.352 37.161 c 55.266 34.419 162 | 59.969 32.782 65.676 29.34 c 69.758 26.426 71.523 23.087 73.07 22.426 c 163 | 69.637 20.786 62.727 23.735 67.859 24.637 c 64.656 25.219 61.055 26.84 164 | 64.121 22.852 c 66.73 20.672 73.359 20.903 74.551 20.657 c 73.543 165 | 18.438 71.813 18.262 74.59 18.09 c 71.492 16.438 75.586 16.18 75.871 166 | 15.239 c h 167 | 69.535 33.133 m 67.648 35.106 67.16 38.797 69.199 35.587 c 70.246 168 | 35.165 72.547 29.551 69.535 33.133 c 69.535 33.133 l h 169 | 90.172 20.024 m 91.348 20.102 90.207 19.13 90.172 20.024 c h 170 | 66.559 37.969 m 66.484 40.95 67.238 35.669 66.559 37.969 c h 171 | 64.508 40.727 m 62.133 45.309 67.496 39.43 64.508 40.727 c h 172 | 39.648 57.883 m 41.043 58.255 40.336 55.501 39.648 57.883 c h 173 | 59.434 47.161 m 60.289 50.376 60.438 44.465 59.434 47.161 c h 174 | 45.457 56.88 m 44.473 58.653 47.516 55.215 45.457 56.88 c h 175 | 57.449 53.036 m 55.203 58.067 59.043 55.786 57.949 52.212 c 57.449 176 | 53.036 l 57.449 53.036 l h 177 | 36.766 66.829 m 35.762 68.481 34.102 73.325 34.637 74.805 c 35.117 178 | 72.395 39.758 64.438 36.91 71.508 c 33.766 77.434 40.672 69.587 41.383 179 | 68.106 c 41.715 66.637 39.441 68.508 40.98 65.059 c 38.172 68.985 180 | 39.324 62.891 36.766 66.829 c h 181 | 30.375 71.235 m 30.637 75.075 31.836 68.602 30.375 71.235 c h 182 | 33.25 70.243 m 34.621 73.141 35.574 66.204 33.25 70.243 c h 183 | 26.332 75.594 m 23.953 77.962 22.23 80.141 26.445 77.063 c 28.066 184 | 77.001 22.836 82.02 26.836 78.657 c 31.039 77.891 28.91 71.762 26.332 185 | 75.594 c h 186 | 29.965 75.688 m 31.348 77.059 30.699 74.34 29.965 75.688 c h 187 | 32.203 74.973 m 30.105 78.899 34.746 73.325 32.203 74.973 c h 188 | 27.758 79.219 m 20.84 85.38 36.449 76.001 28.887 78.079 c 27.758 79.219 189 | l 27.758 79.219 l h 190 | 47.582 67.704 m 44.586 69.497 46.785 80.34 47.809 72.926 c 50.719 191 | 73.868 47.648 69.094 49.816 69.141 c 49.477 66.13 48.504 65.047 47.582 192 | 67.704 c h 193 | 54.914 63.368 m 55.207 66.637 55.531 61.133 54.914 63.368 c h 194 | 53.641 64.63 m 53.969 66.024 53.672 62.985 53.641 64.63 c h 195 | 29.113 81.243 m 24.668 87.376 42.031 75.04 31.961 79.688 c 30.91 79.965 196 | 29.641 80.063 29.113 81.243 c h 197 | 43.234 73.758 m 42.813 78.922 44.172 72.903 43.234 73.758 c 43.234 198 | 73.758 l h 199 | 53.953 66.88 m 54.781 69.821 54.016 64.934 53.953 66.88 c h 200 | 29.797 83.583 m 32.438 84.149 40.742 78.946 33.117 82.098 c 32.27 201 | 83.036 30.461 82.61 29.797 83.583 c h 202 | 52.48 72.278 m 52.762 77.559 54.059 75.43 52.492 71.52 c 52.48 72.278 l 203 | 52.48 72.278 l h 204 | 31.762 85.422 m 32.84 87.001 28.902 92.559 32.328 87.415 c 33.809 205 | 86.239 36.613 85.446 34.137 84.95 c 38.031 81.516 33.188 84.02 31.762 206 | 85.422 c h 207 | 51.359 73.926 m 52.102 79.942 52.016 70.403 51.359 73.926 c h 208 | 29.512 90.977 m 30.336 91.329 29.949 89.88 29.512 90.977 c h 209 | 34.625 87.934 m 35.941 90.696 37.051 84.856 34.625 87.934 c h 210 | 49.043 79.915 m 49.031 80.973 49.316 78.372 49.043 79.915 c h 211 | 48.207 81.762 m 46.207 86.7 50.07 79.149 48.207 81.762 c h 212 | 46.98 85.001 m 46.645 87.04 48.121 82.438 46.98 85.001 c 46.98 85.001 l 213 | h 214 | 48.98 88.251 m 47.605 90.669 50.715 98.915 51.063 93.801 c 49.613 215 | 89.817 50.645 87.59 51.652 92.934 c 53.52 97.137 51.25 84.633 48.98 216 | 88.251 c 48.98 88.251 l h 217 | 51.035 100.512 m 51.633 101.247 51.168 99.626 51.035 100.512 c h 218 | 47.602 32.883 m 46.789 33.594 47.707 32.434 47.602 32.883 c h 219 | 54.672 29.309 m 58.605 28.297 58.586 29.919 55.031 30.403 c 53.121 220 | 32.18 47.086 34.067 52.488 30.622 c 52.844 29.715 53.973 29.739 54.672 221 | 29.309 c h 222 | 40.711 38.583 m 42.875 36.965 48.871 34.005 43.797 37.965 c 45.508 223 | 39.954 40.523 41.012 42.176 42.344 c 37.969 44.919 38.855 44.688 41.805 224 | 44.606 c 36.75 46.868 42.535 46.696 42.262 47.856 c 40.313 48.239 225 | 32.578 51.294 37.129 47.606 c 32.504 49.962 36.027 46.727 34.629 47.067 226 | c 29.898 48.356 38.84 43.465 33.879 44.68 c 36.59 42.532 41.18 39.172 227 | 35.023 42.407 c 34.215 41.239 39.43 39.469 40.711 38.583 c h 228 | 48.105 34.333 m 57.094 31.438 43.695 37.876 48.105 34.333 c h 229 | 85.957 11.403 m 86.074 13.188 84.73 9.88 85.957 11.403 c h 230 | 89.848 9.766 m 91.922 11.774 89.934 6.563 93.285 10.258 c 93.32 12.903 231 | 93.184 14.465 89.434 11.251 c 88.398 10.676 87.938 8.243 89.848 9.766 c 232 | h 233 | 28.09 48.551 m 27.453 51.055 23.625 51.044 28.09 48.551 c h 234 | 32.242 45.829 m 30.699 48.387 26.738 48.145 32.242 45.829 c h 235 | 55.879 31.575 m 58.188 29.524 66.477 30.071 58.68 31.321 c 57.527 236 | 33.028 51.352 32.618 55.879 31.575 c h 237 | 88.367 11.508 m 91.918 14.489 84.926 10.18 88.367 11.508 c h 238 | 95.754 6.434 m 95.777 7.391 94.223 6.016 95.754 6.434 c h 239 | 95.766 7.774 m 99.699 11.938 91.957 7.528 95.766 7.774 c 95.766 7.774 l 240 | h 241 | 17.871 57.106 m 14.52 61.887 15.789 64.036 12.555 67.942 c 11.941 70.93 242 | 7.008 77.704 10.004 70.528 c 12.746 66.329 13.559 59.829 17.871 57.106 243 | c h 244 | 94.531 9.098 m 101.77 13.774 91.563 11.133 94.531 9.098 c h 245 | 100.055 6.934 m 103.68 10.044 97.762 7.583 100.055 6.934 c h 246 | 26.859 53.837 m 27.895 55.38 24.18 54.036 26.859 53.837 c h 247 | 98.902 8.411 m 102.41 10.672 98.094 10.325 98.266 8.204 c 98.902 8.411 248 | l 98.902 8.411 l h 249 | 51.293 38.419 m 51.172 39.95 49.438 38.29 51.293 38.419 c h 250 | 54.234 36.727 m 53.297 38.618 52.797 36.43 54.234 36.727 c h 251 | 104.531 6.883 m 109.027 10.126 101.809 7.505 103.59 6.266 c 104.531 252 | 6.883 l 104.531 6.883 l h 253 | 102.809 7.715 m 106.473 10.782 98.945 6.356 102.809 7.715 c h 254 | 111.605 1.86 m 114.063 3.505 108.617 2.391 111.605 1.86 c h 255 | 29.113 54.95 m 32.406 54.212 42.281 46.837 36.457 54.438 c 33.473 256 | 55.321 35.262 62.614 32.219 61.325 c 34.262 57.911 33.898 56.462 29.609 257 | 58.61 c 24.223 61.243 26.582 57.309 27.637 56.223 c 26.199 55.895 258 | 29.535 54.977 29.113 54.95 c h 259 | 14.102 66.805 m 14.691 69.247 8.668 80.227 11.258 72.309 c 12.191 260 | 70.649 12.094 67.505 14.102 66.805 c h 261 | 41.656 49.817 m 39.957 51.235 41.574 50.02 41.656 49.817 c h 262 | 45.832 48.844 m 45.832 51.43 41.215 49.895 45.832 48.844 c h 263 | 82.043 26.02 m 81.352 27.786 79.313 26.059 82.043 26.02 c 82.043 26.02 264 | l h 265 | 83.781 24.751 m 83.523 25.739 82.777 24.559 83.781 24.751 c h 266 | 98.133 15.708 m 99.512 16.727 96.41 15.84 98.133 15.708 c h 267 | 21.598 64.891 m 25.547 66.419 17.367 65.981 21.598 64.891 c h 268 | 78.855 28.821 m 78.809 31.376 76.336 28.184 78.855 28.821 c h 269 | 20.039 68.528 m 22.574 69.383 17.691 69.09 20.039 68.528 c h 270 | 27.398 64.962 m 27.355 65.801 26.621 64.641 27.398 64.962 c h 271 | 117.184 9.903 m 120.445 10.563 127.879 8.243 129.078 10.766 c 125.117 272 | 10.864 115.379 13.563 114.918 10.126 c 115.785 9.989 l 117.184 9.903 l 273 | 117.184 9.903 l h 274 | 29.738 64.372 m 29.797 66.962 27.719 64.469 29.738 64.372 c h 275 | 10.387 77.797 m 9.508 82.731 7.043 78.544 10.387 77.797 c h 276 | 15 76.637 m 15.059 78.223 10.777 78.063 15 76.637 c h 277 | 17.637 75.34 m 16.875 75.958 17.043 74.563 17.637 75.34 c h 278 | 34.234 64.696 m 35.016 65.415 32.383 65.227 34.234 64.696 c h 279 | 15.883 78.262 m 15.434 81.989 10.535 78.821 15.883 78.262 c h 280 | 6.418 84.403 m 6.285 86.122 5.496 83.755 6.418 84.403 c h 281 | 7.828 85.465 m 7.598 87.505 6.617 85.208 7.828 85.465 c h 282 | 15.602 80.825 m 18.891 82.114 9.613 83.497 14.93 81.067 c 15.602 80.825 283 | l h 284 | 119.68 16.536 m 121.785 18.465 117.008 17.133 119.68 16.536 c h 285 | 132.254 10.02 m 133.098 12.512 130.129 9.692 132.254 10.02 c h 286 | 16.398 84.899 m 16.746 87.313 13.789 84.419 16.398 84.899 c h 287 | 5.332 92.313 m 4.738 95.719 4.82 101.7 10.504 99.68 c 2.918 98.172 288 | 15.758 90.247 14.137 96.505 c 17.328 96.348 20.379 98.391 18.703 95.294 289 | c 24.992 95.985 29.348 101.438 35.422 100.672 c 40.152 101.301 45.324 290 | 101.774 50.422 103.68 c 54.613 103.981 58.648 108.493 56.352 111.169 c 291 | 50.637 111.653 44.652 110.938 38.336 109.68 c 31.336 108.227 24.977 292 | 105.462 17.914 104.274 c 11.027 103.348 19.297 101.727 17.324 101.364 c 293 | 13.734 100.118 21.609 99.278 16.859 97.962 c 13.926 98.52 10.871 99.528 294 | 12.125 102.622 c 5.531 101.762 -0.266 99.028 4.945 92.317 c 5.332 295 | 92.313 l 5.332 92.313 l h 296 | 21.227 100.407 m 22.77 106.102 29.508 95.719 23.758 99.649 c 23.074 297 | 100.165 21.941 100.583 21.227 100.407 c h 298 | 21.527 103.169 m 23.758 104.829 22.711 102.235 21.527 103.169 c h 299 | 24.359 103.122 m 24.563 105.743 30.848 101.735 25.395 102.18 c 24.359 300 | 103.122 l 24.359 103.122 l h 301 | 28.234 104.68 m 29.652 106.337 28.645 103.212 28.234 104.68 c h 302 | 29.227 105.344 m 31.586 108.176 42.574 107.153 34.531 105.622 c 32.375 303 | 107.247 30.723 104.665 29.227 105.344 c h 304 | 43.57 107.555 m 43.215 115.294 50.699 104.809 43.57 107.555 c h 305 | 47.641 107.579 m 49.129 111.477 53.418 109.145 48.332 108.364 c 48.441 306 | 107.946 48.18 106.348 47.641 107.579 c h 307 | 14.793 86.899 m 19.238 89.622 10.074 89.262 14.793 86.899 c 14.793 308 | 86.899 l h 309 | 18.082 85.989 m 19.641 87.645 14.691 86.661 18.082 85.989 c h 310 | 8.395 92.86 m 10.934 94.813 5.387 93.602 8.395 92.86 c h 311 | 139.676 10.731 m 139.75 12.997 137.734 9.712 139.676 10.731 c h 312 | 126.336 19.837 m 126.715 22.442 124.621 19.61 126.336 19.837 c h 313 | 143.344 9.852 m 146.895 9.84 154.105 10.958 146.379 10.954 c 145.164 314 | 10.766 139.313 10.805 143.344 9.852 c 143.344 9.852 l h 315 | 20.973 87.587 m 23.848 87.782 25.469 90.755 20.414 90.587 c 12.582 316 | 91.395 27.324 87.903 19.41 88.903 c 18.348 88.2 20.91 87.391 20.973 317 | 87.587 c h 318 | 23.504 86.305 m 23.203 88.149 22.613 85.325 23.504 86.305 c h 319 | 26.508 94.313 m 27.754 95.86 24.781 94.727 26.508 94.313 c h 320 | 16.945 110.294 m 22.078 112.036 29.094 113.997 31.516 109.434 c 29.051 321 | 112.399 30.52 115.321 32.848 110.981 c 36.141 106.594 37.789 112.977 322 | 35.648 114.45 c 38.09 111.419 40.863 109.985 37.281 114.258 c 41.176 323 | 118.942 29.488 113.645 26.832 113.7 c 25.555 113.126 13.637 110.661 324 | 16.945 110.294 c h 325 | 19.953 116.051 m 22.879 118.258 30.074 114.735 25.457 118.247 c 25.004 326 | 118.645 15.348 115.583 19.953 116.051 c h 327 | 30.621 115.61 m 34.043 115.524 29.145 120.212 33.223 118.087 c 32.555 328 | 120.274 28.473 120.684 26.477 121.559 c 25.348 119.559 28.773 115.583 329 | 30.621 115.61 c h 330 | 21.824 125.294 m 23.008 126.899 19.746 124.477 21.824 125.294 c h 331 | 26.184 124.251 m 31.703 124.981 24.777 126.626 25.07 124.309 c 26.184 332 | 124.251 l 26.184 124.251 l h 333 | 18.043 130.618 m 14.156 135.692 25.352 129.766 21.402 135.079 c 18.078 334 | 137.723 14.887 132.098 18.043 130.618 c h 335 | 67.906 103.762 m 69.688 106.919 60.551 108.02 66.707 104.88 c 67.273 336 | 104.692 67.145 103.544 67.906 103.762 c h 337 | 67.906 103.762 m f 338 | 152.023 125.551 m 151.387 123.036 150.992 118.817 150.844 112.895 c 339 | 150.844 111.731 150.32 111.149 149.27 111.149 c 148.219 111.149 147.488 340 | 111.657 147.074 112.669 c 145.949 115.407 144.883 117.317 143.867 341 | 118.407 c 142.668 119.68 141.074 120.45 139.086 120.712 c 136.949 342 | 121.051 131.625 121.219 123.113 121.219 c 121.164 121.219 119.887 343 | 121.012 119.289 120.598 c 118.914 120.337 118.727 119.774 118.727 344 | 118.911 c 118.727 93.43 l 118.727 92.567 119.27 92.157 120.355 92.192 c 345 | 123.695 92.231 128.531 92.458 134.867 92.868 c 136.105 93.02 136.941 346 | 93.422 137.371 94.079 c 137.805 94.735 138.227 96.43 138.637 99.169 c 347 | 138.898 100.669 139.781 101.251 141.281 100.911 c 142.555 100.649 348 | 143.102 100.067 142.914 99.169 c 141.863 94.067 141.523 87.43 141.898 349 | 79.255 c 141.938 78.282 141.32 77.755 140.043 77.68 c 138.992 77.567 350 | 138.336 78.13 138.074 79.368 c 137.102 84.055 135.289 86.559 132.648 351 | 86.88 c 130.004 87.196 125.699 87.356 119.738 87.356 c 119.063 87.356 352 | 118.727 87.114 118.727 86.626 c 118.727 61.313 l 118.727 59.438 119.418 353 | 58.161 120.805 57.489 c 121.895 56.926 124.238 56.419 127.836 55.969 c 354 | 129.676 55.782 130.48 54.973 130.258 53.551 c 130.031 52.313 128.383 355 | 51.825 125.305 52.087 c 116.418 52.801 109.086 52.762 103.313 51.973 c 356 | 101.699 51.751 100.895 52.407 100.895 53.942 c 100.895 54.919 101.699 357 | 55.481 103.313 55.63 c 106.988 56.044 108.824 59.27 108.824 65.305 c 358 | 108.824 113.458 l 108.824 115.93 108.383 117.833 107.504 119.165 c 359 | 106.621 120.497 104.98 121.708 102.582 122.794 c 101.082 123.469 100.52 360 | 124.387 100.895 125.551 c 101.082 126.262 101.383 126.657 101.793 361 | 126.731 c 102.168 126.844 103.164 126.77 104.773 126.505 c 107.137 362 | 126.13 112.707 125.942 121.48 125.942 c 131.832 125.942 140.773 126.169 363 | 148.313 126.618 c 150.824 126.77 152.082 126.563 152.082 126.001 c 364 | 152.082 125.848 152.063 125.7 152.023 125.551 c h 365 | 152.023 125.551 m f 366 | 188.586 54.055 m 188.586 52.555 187.742 51.899 186.055 52.087 c 180.883 367 | 52.575 174.469 52.501 166.82 51.864 c 165.281 51.712 164.336 51.751 368 | 163.977 51.973 c 163.621 52.2 163.445 52.817 163.445 53.833 c 163.445 369 | 54.731 164.465 55.489 166.508 56.11 c 168.555 56.727 169.574 58.575 370 | 169.574 61.649 c 169.574 112.555 l 169.574 115.594 169.133 117.825 371 | 168.254 119.251 c 167.371 120.676 165.824 121.782 163.613 122.567 c 372 | 162.449 122.981 161.867 123.563 161.867 124.313 c 161.867 125.438 373 | 162.711 126.282 164.398 126.844 c 166.949 127.669 169.594 128.942 374 | 172.332 130.669 c 174.582 132.02 176.008 132.692 176.605 132.692 c 375 | 177.992 132.692 178.688 131.739 178.688 129.825 c 178.688 129.973 376 | 178.613 128.098 178.461 124.2 c 178.352 120.489 178.313 116.833 178.352 377 | 113.231 c 178.574 63.001 l 178.574 60.712 179.137 59.051 180.262 58.02 378 | c 181.387 56.989 183.32 56.305 186.055 55.969 c 187.742 55.782 188.586 379 | 55.145 188.586 54.055 c h 380 | 188.586 54.055 m f 381 | 239.887 57.825 m 239.887 57.036 238.453 55.848 235.586 54.255 c 232.715 382 | 52.661 230.418 51.864 228.695 51.864 c 227.23 51.864 225.938 52.575 383 | 224.813 54.001 c 223.688 55.426 222.898 56.137 222.449 56.137 c 222.113 384 | 56.137 220.332 55.368 217.105 53.833 c 213.883 52.294 210.637 51.524 385 | 207.375 51.524 c 204.301 51.524 201.73 52.426 199.668 54.223 c 197.418 386 | 56.212 196.293 58.911 196.293 62.325 c 196.293 68.813 203.719 73.462 387 | 218.57 76.274 c 221.117 76.762 222.414 77.794 222.449 79.368 c 222.563 388 | 82.969 l 222.789 89.118 220.07 92.192 214.406 92.192 c 212.793 92.192 389 | 211.266 90.751 209.82 87.864 c 208.379 84.973 206.305 83.419 203.605 390 | 83.192 c 200.531 82.895 198.992 84.188 198.992 87.075 c 198.992 88.876 391 | 201.281 90.973 205.855 93.376 c 210.656 95.887 215.27 97.145 219.695 392 | 97.145 c 227.305 97.145 231.074 93.524 231 86.286 c 230.773 63.114 l 393 | 230.738 60.676 231.77 59.458 233.867 59.458 c 234.281 59.458 235.07 394 | 59.551 236.23 59.739 c 237.395 59.926 238.07 60.02 238.258 60.02 c 395 | 239.344 60.02 239.887 59.286 239.887 57.825 c h 396 | 222.563 70.649 m 222.602 71.587 222.383 72.208 221.914 72.505 c 221.445 397 | 72.805 220.707 72.864 219.695 72.676 c 210.656 71.063 206.137 68.118 398 | 206.137 63.844 c 206.137 59.532 208.48 57.376 213.168 57.376 c 215.043 399 | 57.376 216.977 57.731 218.961 58.442 c 221.289 59.27 222.449 60.262 400 | 222.449 61.426 c h 401 | 222.563 70.649 m f 402 | 281.852 64.52 m 281.852 60.544 280.32 57.383 277.266 55.04 c 274.211 403 | 52.696 270.039 51.524 264.75 51.524 c 261.227 51.524 257.699 51.899 404 | 254.176 52.649 c 251.137 53.325 249.375 53.942 248.887 54.505 c 248.586 405 | 55.032 248.438 57.598 248.438 62.212 c 248.438 64.2 248.887 65.231 406 | 249.789 65.305 c 250.688 65.419 251.457 64.93 252.094 63.844 c 254.906 407 | 58.93 259.445 56.473 265.707 56.473 c 270.992 56.473 273.637 58.313 408 | 273.637 61.989 c 273.637 63.598 273.039 64.95 271.836 66.036 c 270.523 409 | 67.274 267.977 68.719 264.188 70.368 c 258.711 72.805 255.055 74.942 410 | 253.219 76.782 c 251.23 78.731 250.238 81.356 250.238 84.657 c 250.238 411 | 88.708 251.793 91.856 254.906 94.106 c 257.793 96.282 261.656 97.368 412 | 266.492 97.368 c 269.531 97.368 272.305 97.126 274.82 96.637 c 277.52 413 | 96.149 278.926 95.551 279.039 94.837 c 279.336 92.739 279.957 89.7 414 | 280.895 85.723 c 281.008 85.239 280.48 84.844 279.32 84.544 c 278.082 415 | 84.282 277.258 84.489 276.844 85.161 c 273.883 90.001 270.133 92.419 416 | 265.594 92.419 c 260.457 92.419 257.887 90.77 257.887 87.469 c 257.887 417 | 85.63 258.582 84.169 259.969 83.083 c 261.207 82.145 264.113 80.68 418 | 268.688 78.692 c 273.488 76.63 276.75 74.774 278.477 73.126 c 280.727 419 | 70.989 281.852 68.118 281.852 64.52 c h 420 | 281.852 64.52 m f 421 | 347.102 54.395 m 347.102 53.083 346.219 52.387 344.457 52.313 c 341.832 422 | 52.274 338.398 52.087 334.164 51.751 c 332.063 51.337 330.563 51.598 423 | 329.664 52.536 c 323.738 58.911 318.711 65.587 314.586 72.563 c 314.25 424 | 73.161 313.82 73.462 313.293 73.462 c 312.656 73.462 311.551 72.899 425 | 309.977 71.774 c 308.211 70.801 307.332 69.411 307.332 67.614 c 307.332 426 | 66.337 307.367 64.501 307.445 62.098 c 307.52 59.7 308.117 58.126 427 | 309.242 57.376 c 310.031 56.848 311.852 56.438 314.699 56.137 c 316.461 428 | 55.911 317.344 55.255 317.344 54.169 c 317.344 53.305 317.203 52.77 429 | 316.922 52.567 c 316.641 52.36 315.898 52.313 314.699 52.426 c 310.949 430 | 52.762 304.613 52.575 295.688 51.864 c 293.438 51.676 292.219 51.958 431 | 292.031 52.708 c 291.957 52.969 291.918 53.344 291.918 53.833 c 291.918 432 | 54.993 293.063 55.876 295.352 56.473 c 297.414 57.001 298.445 59.419 433 | 298.445 63.731 c 298.445 112.895 l 298.445 115.969 298.145 118.106 434 | 297.543 119.305 c 296.719 120.844 294.992 122.044 292.367 122.907 c 435 | 291.133 123.317 290.512 123.899 290.512 124.649 c 290.512 125.739 436 | 291.395 126.583 293.156 127.18 c 295.969 128.118 298.648 129.411 437 | 301.199 131.063 c 303.262 132.411 304.539 133.087 305.023 133.087 c 438 | 306.563 133.087 307.332 132.114 307.332 130.161 c 307.332 130.426 439 | 307.313 128.567 307.273 124.594 c 307.238 121.856 307.219 118.18 440 | 307.219 113.567 c 307.332 78.356 l 307.332 77.38 307.594 76.895 308.117 441 | 76.895 c 308.68 76.895 309.543 77.38 310.707 78.356 c 313.82 80.794 442 | 317.645 83.981 322.18 87.919 c 323.082 88.856 323.531 89.606 323.531 443 | 90.169 c 323.531 91.18 322.012 91.895 318.977 92.305 c 317.664 92.458 444 | 317.043 93.188 317.117 94.501 c 317.23 95.813 317.887 96.376 319.086 445 | 96.188 c 321.789 95.813 325.727 95.606 330.898 95.567 c 334.5 95.532 446 | 338.082 95.512 341.645 95.512 c 342.805 95.473 343.387 94.782 343.387 447 | 93.43 c 343.387 92.157 342.469 91.462 340.633 91.348 c 337.742 91.239 448 | 335.023 90.583 332.477 89.38 c 328.914 87.77 325.105 84.938 321.055 449 | 80.887 c 320.758 80.661 320.605 80.38 320.605 80.044 c 320.605 79.52 450 | 321.242 78.262 322.52 76.274 c 327.207 69.149 331.633 63.77 335.793 451 | 60.13 c 338.457 57.844 340.949 56.7 343.273 56.7 c 345 56.7 346.07 452 | 56.579 346.48 56.333 c 346.895 56.09 347.102 55.442 347.102 54.395 c h 453 | 347.102 54.395 m f 454 | 196.289 34.79 m 196.289 34.657 196.035 34.524 195.531 34.383 c 195.203 455 | 34.297 194.93 33.997 194.703 33.485 c 193.391 30.571 192.215 28.219 456 | 191.18 26.43 c 191.156 26.387 191.102 26.372 191.016 26.376 c 190.938 457 | 26.383 190.883 26.411 190.852 26.454 c 190.676 26.715 190.227 27.633 458 | 189.508 29.2 c 188.844 30.641 188.484 31.364 188.434 31.364 c 188.355 459 | 31.364 187.965 30.669 187.266 29.274 c 186.469 27.723 186 26.837 460 | 185.852 26.618 c 185.832 26.567 185.781 26.544 185.699 26.551 c 185.621 461 | 26.551 185.559 26.583 185.516 26.641 c 184.98 27.469 183.758 29.747 462 | 181.84 33.465 c 181.621 33.903 181.375 34.18 181.105 34.297 c 180.641 463 | 34.501 180.406 34.649 180.406 34.743 c 180.406 35.028 180.563 35.157 464 | 180.875 35.126 c 182.285 34.981 183.516 35.012 184.574 35.215 c 184.813 465 | 35.258 184.934 35.18 184.934 34.973 c 184.934 34.688 184.77 34.508 466 | 184.441 34.426 c 184.012 34.325 183.797 34.165 183.797 33.946 c 183.797 467 | 33.809 183.848 33.602 183.949 33.333 c 184.211 32.657 184.605 31.794 468 | 185.133 30.751 c 185.656 29.712 185.961 29.188 186.051 29.188 c 186.109 469 | 29.188 186.418 29.731 186.98 30.817 c 187.543 31.903 187.82 32.505 470 | 187.82 32.622 c 187.82 32.907 187.727 33.212 187.539 33.54 c 187.313 471 | 34.024 187.051 34.309 186.75 34.407 c 186.27 34.575 186.027 34.739 472 | 186.027 34.899 c 186.027 35.188 186.191 35.309 186.52 35.258 c 187.645 473 | 35.106 188.832 35.133 190.086 35.344 c 190.328 35.391 190.445 35.317 474 | 190.445 35.126 c 190.445 34.852 190.27 34.68 189.91 34.614 c 189.488 475 | 34.532 189.277 34.317 189.277 33.969 c 189.277 33.801 189.324 33.602 476 | 189.418 33.376 c 190.543 30.63 191.191 29.255 191.367 29.255 c 191.43 477 | 29.255 191.723 29.79 192.242 30.86 c 192.797 32.008 193.18 32.93 478 | 193.398 33.63 c 193.414 33.665 193.422 33.704 193.422 33.751 c 193.422 479 | 34.063 193.18 34.305 192.688 34.481 c 192.309 34.606 192.121 34.743 480 | 192.121 34.899 c 192.121 35.153 192.242 35.251 192.48 35.192 c 192.809 481 | 35.122 193.398 35.067 194.254 35.028 c 195.055 35.001 195.586 35.005 482 | 195.84 35.04 c 196.137 35.075 196.289 34.993 196.289 34.79 c h 483 | 196.289 34.79 m f 484 | 205.977 28.587 m 205.977 28.274 205.555 27.883 204.711 27.415 c 203.746 485 | 26.899 202.758 26.641 201.746 26.641 c 200.645 26.641 199.719 27.001 486 | 198.969 27.723 c 198.164 28.489 197.766 29.508 197.766 30.786 c 197.766 487 | 32.227 198.211 33.387 199.109 34.262 c 199.949 35.079 200.977 35.489 488 | 202.195 35.489 c 202.914 35.489 203.59 35.258 204.219 34.797 c 204.777 489 | 34.391 205.152 33.922 205.332 33.399 c 205.398 33.215 205.496 33.114 490 | 205.629 33.094 c 205.816 33.055 205.914 32.93 205.914 32.712 c 205.914 491 | 32.411 205.555 32.157 204.84 31.946 c 199.797 30.446 l 200.125 28.712 492 | 201.016 27.844 202.469 27.844 c 203.305 27.844 204.262 28.149 205.332 493 | 28.762 c 205.492 28.856 205.648 28.903 205.805 28.903 c 205.922 28.903 494 | 205.977 28.797 205.977 28.587 c h 495 | 203.387 32.973 m 203.387 33.376 203.223 33.727 202.898 34.028 c 202.574 496 | 34.333 202.176 34.481 201.703 34.481 c 200.359 34.481 199.688 33.516 497 | 199.688 31.583 c 199.688 31.321 l 202.664 32.219 l 203.145 32.356 498 | 203.387 32.61 203.387 32.973 c h 499 | 203.387 32.973 m f 500 | 217.035 31.661 m 217.035 30.215 216.531 29.005 215.527 28.028 c 214.563 501 | 27.087 213.418 26.618 212.094 26.618 c 211.34 26.618 210.559 26.743 502 | 209.742 26.989 c 208.953 27.231 208.555 27.45 208.547 27.645 c 208.543 503 | 27.813 208.543 28.399 208.559 29.407 c 208.582 30.641 208.594 31.536 504 | 208.594 32.098 c 208.594 32.942 208.586 34.169 208.57 35.778 c 208.555 505 | 37.387 208.547 38.454 208.547 38.977 c 208.547 39.501 208.469 39.864 506 | 208.309 40.059 c 208.164 40.235 207.844 40.376 207.355 40.477 c 207.168 507 | 40.54 207.07 40.661 207.07 40.837 c 207.07 40.989 207.215 41.118 207.5 508 | 41.219 c 207.906 41.364 208.414 41.61 209.02 41.954 c 209.5 42.223 509 | 209.801 42.356 209.914 42.356 c 210.141 42.356 210.254 42.172 210.254 510 | 41.797 c 210.254 41.77 210.242 41.391 210.223 40.661 c 210.207 39.977 511 | 210.203 39.282 210.211 38.571 c 210.234 34.79 l 210.234 34.43 210.355 512 | 34.329 210.605 34.481 c 211.48 34.985 212.391 35.235 213.34 35.235 c 513 | 214.434 35.235 215.324 34.907 216.008 34.247 c 216.695 33.587 217.035 514 | 32.723 217.035 31.661 c h 515 | 215.285 30.688 m 215.285 31.684 215.008 32.505 214.453 33.149 c 213.93 516 | 33.755 213.293 34.055 212.539 34.055 c 212.023 34.055 211.512 33.922 517 | 211.008 33.649 c 210.508 33.38 210.254 33.098 210.254 32.797 c 210.254 518 | 29.868 l 210.254 28.458 211.031 27.755 212.586 27.755 c 213.395 27.755 519 | 214.047 28.016 214.543 28.536 c 215.039 29.059 215.285 29.774 215.285 520 | 30.688 c h 521 | 215.285 30.688 m f 522 | 234.734 27.821 m 234.762 27.755 234.777 27.708 234.777 27.68 c 234.777 523 | 27.524 234.406 27.274 233.66 26.922 c 232.801 26.524 232.293 26.321 524 | 232.141 26.321 c 232.008 26.321 231.859 26.544 231.688 26.985 c 231.516 525 | 27.426 231.398 27.645 231.332 27.645 c 231.34 27.645 230.926 27.454 526 | 230.09 27.071 c 229.254 26.688 228.621 26.497 228.191 26.497 c 227.23 527 | 26.497 226.395 26.844 225.688 27.536 c 224.836 28.36 224.406 29.516 528 | 224.406 31.005 c 224.406 32.251 224.91 33.325 225.918 34.231 c 226.809 529 | 35.024 227.715 35.422 228.641 35.422 c 229.297 35.422 230.082 35.34 530 | 230.992 35.172 c 231.277 35.122 231.418 35.204 231.418 35.422 c 231.418 531 | 39.165 l 231.418 39.587 231.316 39.883 231.113 40.059 c 230.98 40.176 532 | 230.672 40.317 230.184 40.477 c 229.949 40.563 229.832 40.704 229.832 533 | 40.903 c 229.832 41.087 229.988 41.219 230.305 41.305 c 230.734 41.438 534 | 231.246 41.657 231.844 41.962 c 232.34 42.227 232.648 42.356 232.766 535 | 42.356 c 233.035 42.356 233.168 42.172 233.168 41.797 c 233.168 41.805 536 | 233.156 41.442 233.137 40.712 c 233.113 39.977 233.102 39.266 233.102 537 | 38.571 c 233.102 28.63 l 233.102 28.215 233.289 28.008 233.66 28.008 c 538 | 233.801 28.008 233.984 28.028 234.219 28.071 c 234.473 28.118 234.645 539 | 28.032 234.734 27.821 c h 540 | 231.352 28.903 m 231.352 32.821 l 231.352 33.141 231.07 33.473 230.5 541 | 33.813 c 229.895 34.18 229.238 34.36 228.531 34.36 c 227.008 34.36 542 | 226.246 33.422 226.246 31.54 c 226.246 30.532 226.547 29.672 227.152 543 | 28.958 c 227.758 28.243 228.469 27.887 229.285 27.887 c 229.656 27.887 544 | 230.094 28.012 230.598 28.258 c 231.102 28.508 231.352 28.723 231.352 545 | 28.903 c h 546 | 231.352 28.903 m f 547 | 244.215 28.587 m 244.215 28.274 243.793 27.883 242.945 27.415 c 241.984 548 | 26.899 240.996 26.641 239.984 26.641 c 238.883 26.641 237.957 27.001 549 | 237.203 27.723 c 236.402 28.489 236 29.508 236 30.786 c 236 32.227 550 | 236.449 33.387 237.348 34.262 c 238.188 35.079 239.215 35.489 240.43 551 | 35.489 c 241.152 35.489 241.828 35.258 242.453 34.797 c 243.016 34.391 552 | 243.387 33.922 243.57 33.399 c 243.637 33.215 243.734 33.114 243.867 553 | 33.094 c 244.055 33.055 244.148 32.93 244.148 32.712 c 244.148 32.411 554 | 243.793 32.157 243.078 31.946 c 238.035 30.446 l 238.363 28.712 239.254 555 | 27.844 240.703 27.844 c 241.543 27.844 242.5 28.149 243.57 28.762 c 556 | 243.73 28.856 243.887 28.903 244.039 28.903 c 244.156 28.903 244.215 557 | 28.797 244.215 28.587 c h 558 | 241.625 32.973 m 241.625 33.376 241.461 33.727 241.137 34.028 c 240.813 559 | 34.333 240.414 34.481 239.938 34.481 c 238.598 34.481 237.926 33.516 560 | 237.926 31.583 c 237.926 31.321 l 240.902 32.219 l 241.383 32.356 561 | 241.625 32.61 241.625 32.973 c h 562 | 241.625 32.973 m f 563 | 256.215 34.809 m 256.215 34.672 255.984 34.528 255.523 34.383 c 255.227 564 | 34.297 254.973 33.997 254.758 33.485 c 254.402 32.626 253.777 31.364 565 | 252.891 29.704 c 252.137 28.294 251.559 27.266 251.148 26.618 c 251.129 566 | 26.567 251.082 26.544 251.008 26.551 c 250.934 26.559 250.879 26.59 567 | 250.844 26.641 c 249.297 28.864 247.977 31.137 246.875 33.465 c 246.641 568 | 33.962 246.41 34.239 246.184 34.297 c 245.762 34.465 245.551 34.614 569 | 245.551 34.743 c 245.551 35.036 245.691 35.165 245.977 35.126 c 246.422 570 | 35.071 247.082 35.055 247.957 35.083 c 248.801 35.106 249.398 35.149 571 | 249.738 35.215 c 249.949 35.258 250.055 35.18 250.055 34.973 c 250.055 572 | 34.719 249.906 34.555 249.609 34.481 c 249.039 34.329 248.754 34.133 573 | 248.754 33.891 c 248.754 33.782 248.793 33.626 248.863 33.422 c 249.113 574 | 32.809 249.559 31.926 250.199 30.77 c 250.84 29.614 251.203 29.036 575 | 251.293 29.036 c 251.359 29.036 251.668 29.59 252.223 30.696 c 252.805 576 | 31.872 253.227 32.821 253.48 33.54 c 253.516 33.622 253.535 33.704 577 | 253.535 33.782 c 253.535 34.067 253.359 34.301 253.008 34.481 c 252.668 578 | 34.622 252.496 34.751 252.496 34.876 c 252.496 35.13 252.609 35.235 579 | 252.836 35.192 c 253.125 35.141 253.641 35.098 254.375 35.063 c 255.113 580 | 35.024 255.59 35.016 255.809 35.04 c 256.078 35.09 256.215 35.016 581 | 256.215 34.809 c h 582 | 256.215 34.809 m f 583 | 265.914 28.587 m 265.914 28.274 265.492 27.883 264.648 27.415 c 263.684 584 | 26.899 262.695 26.641 261.684 26.641 c 260.582 26.641 259.656 27.001 585 | 258.906 27.723 c 258.102 28.489 257.703 29.508 257.703 30.786 c 257.703 586 | 32.227 258.148 33.387 259.047 34.262 c 259.887 35.079 260.914 35.489 587 | 262.133 35.489 c 262.852 35.489 263.527 35.258 264.156 34.797 c 264.715 588 | 34.391 265.09 33.922 265.27 33.399 c 265.336 33.215 265.434 33.114 589 | 265.566 33.094 c 265.754 33.055 265.852 32.93 265.852 32.712 c 265.852 590 | 32.411 265.492 32.157 264.777 31.946 c 259.734 30.446 l 260.063 28.712 591 | 260.953 27.844 262.406 27.844 c 263.242 27.844 264.199 28.149 265.27 592 | 28.762 c 265.43 28.856 265.586 28.903 265.742 28.903 c 265.859 28.903 593 | 265.914 28.797 265.914 28.587 c h 594 | 263.324 32.973 m 263.324 33.376 263.16 33.727 262.836 34.028 c 262.512 595 | 34.333 262.113 34.481 261.641 34.481 c 260.297 34.481 259.625 33.516 596 | 259.625 31.583 c 259.625 31.321 l 262.602 32.219 l 263.082 32.356 597 | 263.324 32.61 263.324 32.973 c h 598 | 263.324 32.973 m f 599 | 272.676 27.067 m 272.676 26.774 272.512 26.649 272.184 26.684 c 271.176 600 | 26.778 269.93 26.762 268.441 26.641 c 268.145 26.61 267.961 26.618 601 | 267.891 26.661 c 267.82 26.704 267.785 26.825 267.785 27.024 c 267.785 602 | 27.196 267.984 27.344 268.383 27.465 c 268.781 27.587 268.977 27.946 603 | 268.977 28.544 c 268.977 38.442 l 268.977 39.032 268.895 39.465 268.723 604 | 39.743 c 268.551 40.02 268.25 40.235 267.82 40.387 c 267.594 40.469 605 | 267.48 40.583 267.48 40.727 c 267.48 40.946 267.645 41.11 267.973 606 | 41.219 c 268.469 41.38 268.98 41.63 269.516 41.962 c 269.953 42.227 607 | 270.23 42.356 270.344 42.356 c 270.617 42.356 270.75 42.172 270.75 608 | 41.797 c 270.75 41.829 270.734 41.465 270.707 40.704 c 270.684 39.985 609 | 270.676 39.274 270.684 38.571 c 270.727 28.805 l 270.727 28.36 270.836 610 | 28.04 271.055 27.837 c 271.273 27.637 271.652 27.505 272.184 27.438 c 611 | 272.512 27.403 272.676 27.278 272.676 27.067 c h 612 | 272.676 27.067 m f 613 | 283.273 31.157 m 283.273 29.887 282.805 28.813 281.863 27.934 c 280.922 614 | 27.059 279.754 26.618 278.363 26.618 c 276.969 26.618 275.867 27.005 615 | 275.059 27.778 c 274.281 28.536 273.891 29.54 273.891 30.786 c 273.891 616 | 32.075 274.383 33.161 275.367 34.044 c 276.32 34.899 277.461 35.325 617 | 278.789 35.325 c 280.211 35.325 281.32 34.942 282.113 34.176 c 282.887 618 | 33.43 283.273 32.426 283.273 31.157 c h 619 | 281.348 30.489 m 281.348 31.633 281.07 32.563 280.516 33.278 c 279.977 620 | 33.973 279.293 34.317 278.461 34.317 c 277.688 34.317 277.059 34.047 621 | 276.57 33.505 c 276.082 32.962 275.836 32.297 275.836 31.516 c 275.836 622 | 30.262 276.121 29.286 276.688 28.587 c 277.215 27.946 277.898 27.626 623 | 278.746 27.626 c 279.547 27.626 280.184 27.891 280.648 28.422 c 281.117 624 | 28.954 281.348 29.645 281.348 30.489 c h 625 | 281.348 30.489 m f 626 | 294.703 31.454 m 294.703 30.09 294.246 28.93 293.332 27.981 c 292.414 627 | 27.028 291.348 26.551 290.133 26.551 c 289.395 26.551 288.684 26.684 628 | 288 26.946 c 287.926 26.977 287.891 26.797 287.891 26.411 c 287.891 629 | 23.118 l 287.891 22.587 288.324 22.243 289.191 22.09 c 289.594 22.016 630 | 289.844 21.95 289.949 21.887 c 290.059 21.825 290.109 21.723 290.109 631 | 21.575 c 290.109 21.329 289.945 21.215 289.617 21.235 c 288.086 21.34 632 | 286.742 21.301 285.582 21.126 c 285.34 21.09 285.191 21.09 285.133 633 | 21.126 c 285.074 21.165 285.047 21.262 285.047 21.422 c 285.047 21.547 634 | 285.254 21.696 285.668 21.872 c 286.027 22.016 286.203 22.368 286.203 635 | 22.922 c 286.203 32.567 l 286.203 33.348 285.988 33.837 285.559 34.032 636 | c 285.051 34.258 284.793 34.446 284.793 34.59 c 284.793 34.751 284.945 637 | 34.872 285.242 34.954 c 285.629 35.047 286.027 35.215 286.434 35.454 c 638 | 286.777 35.653 286.984 35.751 287.059 35.751 c 287.277 35.751 287.457 639 | 35.551 287.594 35.149 c 287.797 34.567 287.934 34.274 288 34.274 c 640 | 288.012 34.274 288.328 34.446 288.938 34.79 c 289.609 35.161 290.266 641 | 35.344 290.906 35.344 c 291.949 35.344 292.813 35.051 293.488 34.462 c 642 | 294.297 33.766 294.703 32.766 294.703 31.454 c h 643 | 292.844 30.579 m 292.844 31.766 292.547 32.692 291.957 33.356 c 291.477 644 | 33.911 290.91 34.188 290.262 34.188 c 289.758 34.188 289.277 34.012 645 | 288.82 33.661 c 288.215 33.212 287.91 32.579 287.91 31.77 c 287.91 646 | 28.672 l 287.91 28.477 288.188 28.27 288.742 28.051 c 289.34 27.809 647 | 289.988 27.688 290.688 27.688 c 292.125 27.688 292.844 28.653 292.844 648 | 30.579 c h 649 | 292.844 30.579 m f 650 | 314.469 27.044 m 314.469 26.805 314.355 26.692 314.129 26.704 c 312.641 651 | 26.813 311.254 26.813 309.973 26.704 c 309.688 26.684 309.547 26.813 652 | 309.547 27.087 c 309.547 27.305 309.738 27.422 310.125 27.438 c 310.613 653 | 27.469 310.859 27.864 310.859 28.63 c 310.859 31.54 l 310.859 33.172 654 | 310.195 33.989 308.867 33.989 c 308.168 33.989 307.527 33.864 306.941 655 | 33.606 c 306.41 33.38 306.141 33.157 306.133 32.93 c 306.09 28.587 l 656 | 306.09 28.133 306.145 27.837 306.254 27.688 c 306.332 27.587 306.512 657 | 27.516 306.789 27.469 c 307.43 27.36 307.75 27.227 307.75 27.067 c 658 | 307.75 26.926 307.734 26.833 307.695 26.782 c 307.652 26.708 307.523 659 | 26.676 307.305 26.684 c 306.473 26.712 305.262 26.7 303.672 26.641 c 660 | 303.445 26.633 303.301 26.649 303.234 26.696 c 303.168 26.739 303.137 661 | 26.84 303.137 27.001 c 303.137 27.192 303.344 27.305 303.758 27.352 c 662 | 304.211 27.403 304.438 27.813 304.438 28.587 c 304.438 31.563 l 304.438 663 | 32.364 304.254 32.985 303.891 33.422 c 303.57 33.813 303.16 34.012 664 | 302.664 34.012 c 301.938 34.012 301.281 33.864 300.695 33.567 c 300.113 665 | 33.274 299.82 32.958 299.82 32.622 c 299.82 28.63 l 299.82 28.18 666 | 299.938 27.864 300.172 27.688 c 300.383 27.528 300.766 27.43 301.32 667 | 27.395 c 301.621 27.38 301.77 27.278 301.77 27.087 c 301.77 26.876 668 | 301.648 26.77 301.406 26.77 c 299.586 26.77 298.266 26.719 297.449 669 | 26.618 c 297.172 26.583 296.992 26.583 296.914 26.618 c 296.848 26.653 670 | 296.813 26.743 296.813 26.88 c 296.813 27.063 297.086 27.219 297.625 671 | 27.352 c 297.953 27.438 298.117 27.864 298.117 28.63 c 298.117 31.989 l 672 | 298.117 32.84 297.887 33.333 297.426 33.465 c 297.039 33.575 296.805 673 | 33.653 296.723 33.704 c 296.637 33.758 296.594 33.84 296.594 33.958 c 674 | 296.594 34.087 296.977 34.364 297.734 34.79 c 298.535 35.239 299.027 675 | 35.465 299.211 35.465 c 299.363 35.465 299.492 35.247 299.598 34.805 c 676 | 299.703 34.364 299.785 34.141 299.844 34.141 c 299.926 34.141 300.148 677 | 34.255 300.512 34.481 c 300.965 34.766 301.371 34.977 301.734 35.118 c 678 | 302.336 35.348 302.949 35.465 303.586 35.465 c 304.094 35.465 304.539 679 | 35.356 304.918 35.137 c 305.18 34.993 305.418 34.794 305.629 34.536 c 680 | 305.805 34.317 305.891 34.208 305.891 34.208 c 306.461 34.536 l 306.906 681 | 34.794 307.34 34.993 307.762 35.137 c 308.383 35.356 308.984 35.465 682 | 309.566 35.465 c 311.566 35.465 312.563 34.368 312.563 32.172 c 312.563 683 | 28.63 l 312.563 28.215 312.664 27.919 312.859 27.743 c 313.035 27.598 684 | 313.379 27.473 313.887 27.372 c 314.273 27.301 314.469 27.192 314.469 685 | 27.044 c h 686 | 314.469 27.044 m f 687 | 323.711 28.587 m 323.711 28.274 323.285 27.883 322.441 27.415 c 321.477 688 | 26.899 320.492 26.641 319.477 26.641 c 318.375 26.641 317.449 27.001 689 | 316.699 27.723 c 315.898 28.489 315.496 29.508 315.496 30.786 c 315.496 690 | 32.227 315.945 33.387 316.84 34.262 c 317.68 35.079 318.707 35.489 691 | 319.926 35.489 c 320.648 35.489 321.32 35.258 321.949 34.797 c 322.512 692 | 34.391 322.883 33.922 323.063 33.399 c 323.129 33.215 323.227 33.114 693 | 323.359 33.094 c 323.551 33.055 323.645 32.93 323.645 32.712 c 323.645 694 | 32.411 323.285 32.157 322.57 31.946 c 317.531 30.446 l 317.859 28.712 695 | 318.746 27.844 320.199 27.844 c 321.039 27.844 321.992 28.149 323.063 696 | 28.762 c 323.227 28.856 323.383 28.903 323.535 28.903 c 323.652 28.903 697 | 323.711 28.797 323.711 28.587 c h 698 | 321.117 32.973 m 321.117 33.376 320.957 33.727 320.629 34.028 c 320.305 699 | 34.333 319.906 34.481 319.434 34.481 c 318.09 34.481 317.422 33.516 700 | 317.422 31.583 c 317.422 31.321 l 320.395 32.219 l 320.875 32.356 701 | 321.117 32.61 321.117 32.973 c h 702 | 321.117 32.973 m f 703 | 336.836 26.946 m 336.836 26.719 336.672 26.618 336.344 26.641 c 334.773 704 | 26.719 333.586 26.735 332.777 26.684 c 332.359 26.653 332.137 26.704 705 | 332.098 26.837 c 332.086 26.88 332.078 26.942 332.078 27.024 c 332.078 706 | 27.169 332.289 27.301 332.711 27.415 c 333.098 27.524 333.289 27.903 707 | 333.289 28.544 c 333.289 31.454 l 333.289 33.122 332.566 33.958 331.113 708 | 33.958 c 330.465 33.958 329.863 33.805 329.309 33.497 c 328.785 33.2 709 | 328.523 32.887 328.523 32.567 c 328.523 28.563 l 328.523 27.88 328.969 710 | 27.497 329.867 27.415 c 330.211 27.387 330.383 27.278 330.383 27.087 c 711 | 330.383 26.907 330.336 26.797 330.238 26.758 c 330.195 26.747 330.07 712 | 26.743 329.867 26.751 c 328.723 26.794 327.543 26.735 326.324 26.575 c 713 | 326.063 26.54 325.898 26.528 325.832 26.54 c 325.688 26.571 325.613 714 | 26.684 325.613 26.88 c 325.613 27.055 325.82 27.204 326.234 27.329 c 715 | 326.621 27.446 326.816 27.93 326.816 28.782 c 326.816 32.098 l 326.816 716 | 32.661 326.742 33.016 326.598 33.169 c 326.496 33.278 326.156 33.43 717 | 325.578 33.63 c 325.434 33.68 325.359 33.782 325.359 33.934 c 325.359 718 | 34.083 325.512 34.208 325.809 34.317 c 326.219 34.469 326.668 34.715 719 | 327.156 35.051 c 327.563 35.329 327.824 35.465 327.941 35.465 c 328.141 720 | 35.465 328.27 35.243 328.336 34.794 c 328.402 34.344 328.492 34.122 721 | 328.609 34.122 c 328.551 34.122 328.922 34.333 329.727 34.762 c 330.527 722 | 35.188 331.32 35.399 332.098 35.399 c 333.988 35.399 334.938 34.325 723 | 334.953 32.172 c 334.977 28.653 l 334.977 28.2 335.094 27.876 335.324 724 | 27.68 c 335.5 27.532 335.84 27.411 336.344 27.305 c 336.672 27.243 725 | 336.836 27.122 336.836 26.946 c h 726 | 336.836 26.946 m f 727 | 343.855 27.778 m 343.855 27.426 343.535 27.13 342.895 26.88 c 342.324 728 | 26.661 341.75 26.551 341.164 26.551 c 339.582 26.551 338.793 27.395 729 | 338.793 29.079 c 338.793 33.04 l 338.793 33.54 338.754 33.848 338.672 730 | 33.962 c 338.594 34.075 338.324 34.188 337.875 34.297 c 337.758 34.325 731 | 337.699 34.438 337.699 34.633 c 337.699 34.848 337.742 34.973 337.828 732 | 35.016 c 338.617 35.403 339.305 36.098 339.887 37.094 c 339.965 37.235 733 | 340.125 37.278 340.355 37.227 c 340.516 37.176 340.602 37.083 340.609 734 | 36.942 c 340.652 35.575 l 340.652 35.473 340.672 35.399 340.707 35.356 735 | c 340.758 35.29 340.875 35.258 341.055 35.258 c 343.496 35.258 l 736 | 343.633 35.258 343.633 35.087 343.496 34.743 c 343.328 34.329 343.078 737 | 34.122 342.75 34.122 c 341.102 34.122 l 340.816 34.122 340.641 34.075 738 | 340.574 33.977 c 340.523 33.915 340.5 33.735 340.5 33.442 c 340.5 739 | 29.868 l 340.5 28.962 340.578 28.391 340.738 28.149 c 340.949 27.844 740 | 341.441 27.688 342.215 27.688 c 342.473 27.688 342.781 27.731 343.145 741 | 27.817 c 343.512 27.899 343.703 27.942 343.727 27.942 c 343.813 27.942 742 | 343.855 27.887 343.855 27.778 c h 743 | 343.855 27.778 m f 744 | 348.82 27.286 m 348.82 25.391 348.023 23.965 346.426 23.008 c 346.281 745 | 22.922 346.176 22.876 346.109 22.876 c 346.008 22.876 345.914 22.993 746 | 345.824 23.227 c 345.797 23.309 345.781 23.372 345.781 23.422 c 345.781 747 | 23.547 345.988 23.751 346.406 24.036 c 347.121 24.532 347.477 25.094 748 | 347.477 25.719 c 347.477 26.044 347.27 26.333 346.852 26.594 c 346.27 749 | 26.962 345.977 27.411 345.977 27.942 c 345.977 28.297 346.098 28.594 750 | 346.34 28.833 c 346.578 29.071 346.902 29.188 347.301 29.188 c 347.781 751 | 29.188 348.156 29.012 348.422 28.665 c 348.688 28.313 348.82 27.852 752 | 348.82 27.286 c h 753 | 348.82 27.286 m f 754 | 191.313 10.997 m 191.313 9.727 190.84 8.653 189.898 7.774 c 188.961 755 | 6.899 187.793 6.458 186.398 6.458 c 185.008 6.458 183.906 6.844 183.098 756 | 7.618 c 182.316 8.376 181.926 9.38 181.926 10.626 c 181.926 11.915 757 | 182.418 13.001 183.402 13.883 c 184.359 14.739 185.5 15.165 186.828 758 | 15.165 c 188.25 15.165 189.355 14.782 190.152 14.016 c 190.926 13.27 759 | 191.313 12.266 191.313 10.997 c h 760 | 189.387 10.329 m 189.387 11.473 189.109 12.403 188.555 13.118 c 188.016 761 | 13.813 187.328 14.157 186.5 14.157 c 185.727 14.157 185.094 13.887 762 | 184.605 13.344 c 184.117 12.801 183.875 12.137 183.875 11.356 c 183.875 763 | 10.102 184.156 9.126 184.727 8.426 c 185.25 7.786 185.938 7.465 186.781 764 | 7.465 c 187.586 7.465 188.219 7.731 188.688 8.262 c 189.152 8.794 765 | 189.387 9.485 189.387 10.329 c h 766 | 189.387 10.329 m f 767 | 204.621 6.786 m 204.621 6.559 204.457 6.458 204.129 6.481 c 202.563 768 | 6.559 201.375 6.575 200.563 6.524 c 200.148 6.493 199.922 6.547 199.887 769 | 6.676 c 199.871 6.719 199.863 6.782 199.863 6.864 c 199.863 7.008 770 | 200.074 7.141 200.5 7.255 c 200.887 7.364 201.078 7.743 201.078 8.383 c 771 | 201.078 11.294 l 201.078 12.962 200.352 13.797 198.902 13.797 c 198.254 772 | 13.797 197.652 13.645 197.098 13.337 c 196.57 13.04 196.309 12.727 773 | 196.309 12.407 c 196.309 8.403 l 196.309 7.719 196.758 7.337 197.656 774 | 7.255 c 197.996 7.227 198.168 7.118 198.168 6.926 c 198.168 6.747 775 | 198.121 6.637 198.027 6.598 c 197.984 6.587 197.859 6.583 197.656 6.59 776 | c 196.512 6.633 195.328 6.575 194.109 6.415 c 193.848 6.38 193.684 777 | 6.368 193.617 6.38 c 193.473 6.411 193.398 6.524 193.398 6.719 c 778 | 193.398 6.895 193.609 7.044 194.023 7.169 c 194.41 7.286 194.602 7.77 779 | 194.602 8.622 c 194.602 11.938 l 194.602 12.501 194.531 12.856 194.383 780 | 13.008 c 194.281 13.118 193.945 13.27 193.367 13.469 c 193.223 13.52 781 | 193.148 13.622 193.148 13.774 c 193.148 13.922 193.297 14.047 193.598 782 | 14.157 c 194.004 14.309 194.453 14.555 194.941 14.891 c 195.352 15.169 783 | 195.613 15.305 195.73 15.305 c 195.926 15.305 196.059 15.083 196.125 784 | 14.633 c 196.188 14.184 196.281 13.962 196.398 13.962 c 196.34 13.962 785 | 196.711 14.172 197.512 14.602 c 198.316 15.028 199.105 15.239 199.887 786 | 15.239 c 201.773 15.239 202.727 14.165 202.742 12.012 c 202.762 8.493 l 787 | 202.762 8.04 202.879 7.715 203.113 7.52 c 203.289 7.372 203.625 7.251 788 | 204.129 7.145 c 204.457 7.083 204.621 6.962 204.621 6.786 c h 789 | 204.621 6.786 m f 790 | 213.766 8.426 m 213.766 8.114 213.344 7.723 212.496 7.255 c 211.535 791 | 6.739 210.547 6.481 209.531 6.481 c 208.434 6.481 207.508 6.84 206.754 792 | 7.563 c 205.953 8.329 205.551 9.348 205.551 10.626 c 205.551 12.067 206 793 | 13.227 206.898 14.102 c 207.734 14.919 208.766 15.329 209.98 15.329 c 794 | 210.703 15.329 211.379 15.098 212.004 14.637 c 212.566 14.231 212.938 795 | 13.762 213.121 13.239 c 213.188 13.055 213.285 12.954 213.414 12.934 c 796 | 213.605 12.895 213.699 12.77 213.699 12.551 c 213.699 12.251 213.344 797 | 11.997 212.629 11.786 c 207.586 10.286 l 207.914 8.551 208.805 7.684 798 | 210.254 7.684 c 211.094 7.684 212.047 7.989 213.121 8.602 c 213.281 799 | 8.696 213.438 8.743 213.59 8.743 c 213.707 8.743 213.766 8.637 213.766 800 | 8.426 c h 801 | 211.172 12.813 m 211.172 13.215 211.012 13.567 210.688 13.868 c 210.363 802 | 14.172 209.965 14.321 209.488 14.321 c 208.148 14.321 207.477 13.356 803 | 207.477 11.422 c 207.477 11.161 l 210.453 12.059 l 210.934 12.196 804 | 211.172 12.45 211.172 12.813 c h 805 | 211.172 12.813 m f 806 | 231.277 7.661 m 231.305 7.594 231.32 7.547 231.32 7.52 c 231.32 7.364 807 | 230.949 7.114 230.203 6.762 c 229.344 6.364 228.836 6.161 228.684 6.161 808 | c 228.555 6.161 228.402 6.383 228.23 6.825 c 228.059 7.266 227.941 809 | 7.485 227.875 7.485 c 227.883 7.485 227.469 7.294 226.633 6.911 c 810 | 225.801 6.528 225.168 6.337 224.734 6.337 c 223.773 6.337 222.938 6.684 811 | 222.23 7.376 c 221.379 8.2 220.953 9.356 220.953 10.844 c 220.953 12.09 812 | 221.453 13.165 222.461 14.071 c 223.352 14.864 224.258 15.262 225.184 813 | 15.262 c 225.84 15.262 226.625 15.18 227.535 15.012 c 227.82 14.962 814 | 227.961 15.044 227.961 15.262 c 227.961 19.005 l 227.961 19.426 227.859 815 | 19.723 227.656 19.899 c 227.523 20.016 227.215 20.157 226.727 20.317 c 816 | 226.492 20.403 226.375 20.544 226.375 20.743 c 226.375 20.926 226.535 817 | 21.059 226.848 21.145 c 227.277 21.278 227.793 21.497 228.391 21.801 c 818 | 228.887 22.067 229.191 22.196 229.309 22.196 c 229.578 22.196 229.711 819 | 22.012 229.711 21.637 c 229.711 21.645 229.703 21.282 229.68 20.551 c 820 | 229.656 19.817 229.648 19.106 229.648 18.411 c 229.648 8.469 l 229.648 821 | 8.055 229.832 7.848 230.203 7.848 c 230.344 7.848 230.531 7.868 230.762 822 | 7.911 c 231.02 7.958 231.188 7.872 231.277 7.661 c h 823 | 227.898 8.743 m 227.898 12.661 l 227.898 12.981 227.613 13.313 227.043 824 | 13.653 c 226.438 14.02 225.781 14.2 225.074 14.2 c 223.551 14.2 222.789 825 | 13.262 222.789 11.38 c 222.789 10.372 223.094 9.512 223.695 8.797 c 826 | 224.301 8.083 225.012 7.727 225.828 7.727 c 226.203 7.727 226.641 7.852 827 | 227.141 8.098 c 227.645 8.348 227.898 8.563 227.898 8.743 c h 828 | 227.898 8.743 m f 829 | 239.535 14.344 m 239.535 13.462 239.281 13.02 238.77 13.02 c 238.688 830 | 13.02 238.422 13.071 237.969 13.172 c 237.52 13.274 237.188 13.325 831 | 236.977 13.325 c 236.16 13.325 235.75 12.778 235.75 11.676 c 235.75 832 | 8.45 l 235.75 8.071 235.883 7.801 236.145 7.637 c 236.297 7.544 236.68 833 | 7.419 237.293 7.255 c 237.621 7.176 237.785 7.051 237.785 6.883 c 834 | 237.785 6.688 237.758 6.571 237.703 6.528 c 237.648 6.489 237.512 6.481 835 | 237.293 6.501 c 235.688 6.669 234.418 6.676 233.484 6.524 c 233.195 836 | 6.473 233.008 6.473 232.93 6.524 c 232.863 6.567 232.828 6.696 232.828 837 | 6.907 c 232.828 7.102 233.031 7.258 233.438 7.376 c 233.84 7.493 838 | 234.043 7.844 234.043 8.426 c 234.043 11.938 l 234.043 12.395 233.984 839 | 12.708 233.863 12.868 c 233.742 13.028 233.414 13.243 232.875 13.512 c 840 | 232.809 13.544 l 232.664 13.618 232.59 13.719 232.59 13.852 c 232.59 841 | 13.997 232.738 14.122 233.039 14.223 c 233.539 14.399 234 14.645 842 | 234.414 14.965 c 234.758 15.239 234.977 15.372 235.07 15.372 c 235.336 843 | 15.372 235.492 15.145 235.543 14.692 c 235.609 14.118 235.684 13.829 844 | 235.773 13.829 c 235.781 13.829 236.188 14.102 236.996 14.649 c 237.531 845 | 15.008 238.113 15.184 238.746 15.184 c 239.273 15.184 239.535 14.907 846 | 239.535 14.344 c h 847 | 239.535 14.344 m f 848 | 250.375 10.997 m 250.375 9.727 249.902 8.653 248.961 7.774 c 248.023 849 | 6.899 246.855 6.458 245.461 6.458 c 244.07 6.458 242.969 6.844 242.16 850 | 7.618 c 241.379 8.376 240.988 9.38 240.988 10.626 c 240.988 11.915 851 | 241.48 13.001 242.465 13.883 c 243.422 14.739 244.563 15.165 245.891 852 | 15.165 c 247.313 15.165 248.418 14.782 249.215 14.016 c 249.988 13.27 853 | 250.375 12.266 250.375 10.997 c h 854 | 248.449 10.329 m 248.449 11.473 248.172 12.403 247.617 13.118 c 247.078 855 | 13.813 246.391 14.157 245.563 14.157 c 244.789 14.157 244.156 13.887 856 | 243.668 13.344 c 243.18 12.801 242.938 12.137 242.938 11.356 c 242.938 857 | 10.102 243.219 9.126 243.789 8.426 c 244.313 7.786 245 7.465 245.844 858 | 7.465 c 246.648 7.465 247.281 7.731 247.75 8.262 c 248.215 8.794 859 | 248.449 9.485 248.449 10.329 c h 860 | 248.449 10.329 m f 861 | 261.805 11.294 m 261.805 9.93 261.348 8.77 260.43 7.821 c 259.516 6.868 862 | 258.449 6.391 257.23 6.391 c 256.496 6.391 255.785 6.524 255.098 6.786 863 | c 255.027 6.817 254.988 6.637 254.988 6.251 c 254.988 2.958 l 254.988 864 | 2.426 255.422 2.083 256.289 1.93 c 256.691 1.856 256.945 1.79 257.051 865 | 1.727 c 257.156 1.665 257.211 1.563 257.211 1.415 c 257.211 1.169 866 | 257.047 1.055 256.719 1.075 c 255.188 1.18 253.84 1.141 252.68 0.965 c 867 | 252.441 0.93 252.293 0.93 252.234 0.965 c 252.176 1.005 252.145 1.102 868 | 252.145 1.262 c 252.145 1.387 252.352 1.536 252.77 1.712 c 253.125 869 | 1.856 253.305 2.208 253.305 2.762 c 253.305 12.407 l 253.305 13.188 870 | 253.09 13.676 252.66 13.872 c 252.148 14.098 251.895 14.286 251.895 871 | 14.43 c 251.895 14.59 252.043 14.712 252.344 14.794 c 252.73 14.887 872 | 253.125 15.055 253.535 15.294 c 253.879 15.493 254.086 15.59 254.156 873 | 15.59 c 254.375 15.59 254.555 15.391 254.695 14.989 c 254.898 14.407 874 | 255.031 14.114 255.098 14.114 c 255.113 14.114 255.426 14.286 256.039 875 | 14.63 c 256.711 15.001 257.367 15.184 258.008 15.184 c 259.051 15.184 876 | 259.91 14.891 260.59 14.301 c 261.398 13.606 261.805 12.606 261.805 877 | 11.294 c h 878 | 259.945 10.419 m 259.945 11.606 259.648 12.532 259.059 13.196 c 258.578 879 | 13.751 258.012 14.028 257.363 14.028 c 256.859 14.028 256.379 13.852 880 | 255.918 13.501 c 255.313 13.051 255.012 12.419 255.012 11.61 c 255.012 881 | 8.512 l 255.012 8.317 255.289 8.11 255.844 7.891 c 256.441 7.649 257.09 882 | 7.528 257.789 7.528 c 259.227 7.528 259.945 8.493 259.945 10.419 c h 883 | 259.945 10.419 m f 884 | 278.012 7.637 m 278.012 7.485 277.734 7.255 277.176 6.946 c 276.617 885 | 6.633 276.172 6.481 275.836 6.481 c 275.551 6.481 275.301 6.618 275.082 886 | 6.895 c 274.863 7.172 274.711 7.309 274.621 7.309 c 274.555 7.309 887 | 274.211 7.161 273.582 6.864 c 272.957 6.563 272.324 6.415 271.691 6.415 888 | c 271.094 6.415 270.594 6.59 270.191 6.938 c 269.754 7.325 269.535 889 | 7.852 269.535 8.512 c 269.535 9.774 270.98 10.68 273.867 11.227 c 890 | 274.363 11.321 274.613 11.52 274.621 11.829 c 274.645 12.528 l 274.688 891 | 13.723 274.16 14.321 273.059 14.321 c 272.746 14.321 272.449 14.04 892 | 272.168 13.481 c 271.887 12.919 271.484 12.614 270.957 12.571 c 270.359 893 | 12.512 270.063 12.766 270.063 13.325 c 270.063 13.676 270.508 14.087 894 | 271.395 14.551 c 272.328 15.04 273.227 15.286 274.086 15.286 c 275.566 895 | 15.286 276.301 14.583 276.285 13.172 c 276.242 8.669 l 276.234 8.192 896 | 276.434 7.958 276.844 7.958 c 276.922 7.958 277.074 7.973 277.301 8.012 897 | c 277.527 8.047 277.66 8.067 277.695 8.067 c 277.906 8.067 278.012 898 | 7.922 278.012 7.641 c h 899 | 274.645 10.133 m 274.652 10.317 274.609 10.434 274.52 10.493 c 274.426 900 | 10.551 274.281 10.563 274.086 10.528 c 272.328 10.212 271.449 9.641 901 | 271.449 8.809 c 271.449 7.969 271.906 7.551 272.816 7.551 c 273.184 902 | 7.551 273.559 7.622 273.945 7.758 c 274.395 7.919 274.621 8.114 274.621 903 | 8.34 c h 904 | 274.645 10.133 m f 905 | 285.363 7.618 m 285.363 7.266 285.043 6.969 284.398 6.719 c 283.832 906 | 6.501 283.254 6.391 282.672 6.391 c 281.09 6.391 280.297 7.235 280.297 907 | 8.919 c 280.297 12.88 l 280.297 13.38 280.258 13.688 280.18 13.801 c 908 | 280.098 13.915 279.832 14.028 279.379 14.137 c 279.262 14.165 279.203 909 | 14.278 279.203 14.473 c 279.203 14.688 279.25 14.813 279.336 14.856 c 910 | 280.125 15.243 280.809 15.938 281.391 16.934 c 281.473 17.075 281.629 911 | 17.118 281.863 17.067 c 282.023 17.016 282.105 16.922 282.113 16.782 c 912 | 282.156 15.415 l 282.156 15.313 282.176 15.239 282.211 15.196 c 282.266 913 | 15.13 282.379 15.098 282.563 15.098 c 285 15.098 l 285.141 15.098 914 | 285.141 14.926 285 14.583 c 284.836 14.169 284.586 13.962 284.258 915 | 13.962 c 282.605 13.962 l 282.32 13.962 282.148 13.915 282.082 13.817 c 916 | 282.031 13.755 282.004 13.575 282.004 13.282 c 282.004 9.708 l 282.004 917 | 8.801 282.086 8.231 282.246 7.989 c 282.457 7.684 282.949 7.528 283.723 918 | 7.528 c 283.977 7.528 284.289 7.571 284.652 7.657 c 285.016 7.739 919 | 285.211 7.782 285.23 7.782 c 285.32 7.782 285.363 7.727 285.363 7.618 c 920 | h 921 | 285.363 7.618 m f 922 | 301.199 7.637 m 301.199 7.485 300.922 7.255 300.363 6.946 c 299.805 923 | 6.633 299.359 6.481 299.023 6.481 c 298.738 6.481 298.488 6.618 298.27 924 | 6.895 c 298.051 7.172 297.898 7.309 297.809 7.309 c 297.742 7.309 925 | 297.398 7.161 296.77 6.864 c 296.145 6.563 295.512 6.415 294.879 6.415 926 | c 294.281 6.415 293.781 6.59 293.379 6.938 c 292.941 7.325 292.723 927 | 7.852 292.723 8.512 c 292.723 9.774 294.168 10.68 297.055 11.227 c 928 | 297.551 11.321 297.801 11.52 297.809 11.829 c 297.832 12.528 l 297.875 929 | 13.723 297.348 14.321 296.246 14.321 c 295.934 14.321 295.637 14.04 930 | 295.355 13.481 c 295.074 12.919 294.672 12.614 294.145 12.571 c 293.547 931 | 12.512 293.25 12.766 293.25 13.325 c 293.25 13.676 293.695 14.087 932 | 294.582 14.551 c 295.516 15.04 296.414 15.286 297.273 15.286 c 298.754 933 | 15.286 299.488 14.583 299.473 13.172 c 299.43 8.669 l 299.422 8.192 934 | 299.621 7.958 300.031 7.958 c 300.109 7.958 300.262 7.973 300.488 8.012 935 | c 300.715 8.047 300.848 8.067 300.883 8.067 c 301.094 8.067 301.199 936 | 7.922 301.199 7.641 c h 937 | 297.832 10.133 m 297.84 10.317 297.797 10.434 297.707 10.493 c 297.613 938 | 10.551 297.469 10.563 297.273 10.528 c 295.516 10.212 294.637 9.641 939 | 294.637 8.809 c 294.637 7.969 295.094 7.551 296.004 7.551 c 296.371 940 | 7.551 296.746 7.622 297.133 7.758 c 297.582 7.919 297.809 8.114 297.809 941 | 8.34 c h 942 | 297.832 10.133 m f 943 | 314.105 7.618 m 314.105 7.266 313.785 6.969 313.145 6.719 c 312.574 944 | 6.501 312 6.391 311.414 6.391 c 309.832 6.391 309.043 7.235 309.043 945 | 8.919 c 309.043 12.88 l 309.043 13.38 309.004 13.688 308.922 13.801 c 946 | 308.844 13.915 308.574 14.028 308.125 14.137 c 308.008 14.165 307.949 947 | 14.278 307.949 14.473 c 307.949 14.688 307.992 14.813 308.078 14.856 c 948 | 308.867 15.243 309.555 15.938 310.137 16.934 c 310.215 17.075 310.375 949 | 17.118 310.605 17.067 c 310.766 17.016 310.852 16.922 310.859 16.782 c 950 | 310.902 15.415 l 310.902 15.313 310.922 15.239 310.957 15.196 c 311.008 951 | 15.13 311.125 15.098 311.305 15.098 c 313.746 15.098 l 313.883 15.098 952 | 313.883 14.926 313.746 14.583 c 313.578 14.169 313.328 13.962 313 953 | 13.962 c 311.352 13.962 l 311.066 13.962 310.891 13.915 310.824 13.817 954 | c 310.773 13.755 310.75 13.575 310.75 13.282 c 310.75 9.708 l 310.75 955 | 8.801 310.828 8.231 310.988 7.989 c 311.199 7.684 311.691 7.528 312.465 956 | 7.528 c 312.723 7.528 313.031 7.571 313.395 7.657 c 313.762 7.739 957 | 313.953 7.782 313.977 7.782 c 314.063 7.782 314.105 7.727 314.105 7.618 958 | c h 959 | 314.105 7.618 m f 960 | 319.586 19.243 m 319.586 18.907 319.461 18.598 319.207 18.309 c 318.957 961 | 18.02 318.684 17.876 318.383 17.876 c 318.039 17.876 317.758 17.977 962 | 317.539 18.184 c 317.32 18.387 317.211 18.653 317.211 18.981 c 317.211 963 | 19.301 317.348 19.602 317.613 19.88 c 317.879 20.157 318.164 20.294 964 | 318.469 20.294 c 319.215 20.294 319.586 19.942 319.586 19.243 c h 965 | 320.801 6.864 m 320.766 6.653 320.676 6.532 320.539 6.501 c 320.5 6.493 966 | 320.328 6.501 320.012 6.524 c 318.926 6.598 317.859 6.583 316.809 6.481 967 | c 316.523 6.45 316.344 6.462 316.273 6.512 c 316.199 6.563 316.164 6.68 968 | 316.164 6.864 c 316.164 7.032 316.355 7.169 316.742 7.278 c 317.164 969 | 7.403 317.375 7.805 317.375 8.493 c 317.375 11.356 l 317.375 11.934 970 | 317.32 12.34 317.203 12.571 c 317.043 12.891 316.711 13.137 316.207 971 | 13.305 c 315.98 13.383 315.867 13.505 315.867 13.665 c 315.867 13.876 972 | 316.031 14.036 316.359 14.137 c 316.973 14.325 317.516 14.579 317.988 973 | 14.891 c 318.367 15.153 318.602 15.286 318.688 15.286 c 318.98 15.286 974 | 319.125 15.094 319.117 14.715 c 319.086 12.805 319.07 10.86 319.07 975 | 8.876 c 319.07 8.403 319.141 8.063 319.281 7.856 c 319.434 7.633 976 | 319.727 7.473 320.156 7.376 c 320.629 7.266 320.844 7.094 320.801 6.864 977 | c h 978 | 320.801 6.864 m f 979 | 340.063 6.883 m 340.063 6.645 339.949 6.532 339.723 6.544 c 338.234 980 | 6.653 336.848 6.653 335.566 6.544 c 335.281 6.524 335.141 6.653 335.141 981 | 6.926 c 335.141 7.145 335.332 7.262 335.719 7.278 c 336.207 7.309 982 | 336.453 7.704 336.453 8.469 c 336.453 11.38 l 336.453 13.012 335.789 983 | 13.829 334.461 13.829 c 333.762 13.829 333.121 13.704 332.535 13.446 c 984 | 332.004 13.219 331.734 12.997 331.727 12.77 c 331.684 8.426 l 331.684 985 | 7.973 331.738 7.676 331.848 7.528 c 331.926 7.426 332.105 7.356 332.383 986 | 7.309 c 333.023 7.2 333.344 7.067 333.344 6.907 c 333.344 6.766 333.328 987 | 6.672 333.289 6.622 c 333.246 6.547 333.117 6.516 332.898 6.524 c 988 | 332.066 6.551 330.855 6.54 329.266 6.481 c 329.039 6.473 328.895 6.489 989 | 328.828 6.536 c 328.762 6.579 328.73 6.68 328.73 6.84 c 328.73 7.032 990 | 328.938 7.145 329.352 7.192 c 329.805 7.243 330.031 7.653 330.031 8.426 991 | c 330.031 11.403 l 330.031 12.204 329.848 12.825 329.484 13.262 c 992 | 329.164 13.653 328.754 13.852 328.258 13.852 c 327.531 13.852 326.875 993 | 13.704 326.289 13.407 c 325.707 13.114 325.414 12.797 325.414 12.462 c 994 | 325.414 8.469 l 325.414 8.02 325.531 7.704 325.766 7.528 c 325.977 995 | 7.368 326.359 7.27 326.914 7.235 c 327.215 7.219 327.363 7.118 327.363 996 | 6.926 c 327.363 6.715 327.242 6.61 327 6.61 c 325.18 6.61 323.859 6.559 997 | 323.043 6.458 c 322.766 6.422 322.586 6.422 322.508 6.458 c 322.441 998 | 6.493 322.406 6.583 322.406 6.719 c 322.406 6.903 322.68 7.059 323.219 999 | 7.192 c 323.547 7.278 323.711 7.704 323.711 8.469 c 323.711 11.829 l 1000 | 323.711 12.68 323.48 13.172 323.02 13.305 c 322.633 13.415 322.398 1001 | 13.493 322.316 13.544 c 322.23 13.598 322.188 13.68 322.188 13.797 c 1002 | 322.188 13.926 322.57 14.204 323.328 14.63 c 324.129 15.079 324.621 1003 | 15.305 324.805 15.305 c 324.957 15.305 325.086 15.087 325.191 14.645 c 1004 | 325.297 14.204 325.379 13.981 325.438 13.981 c 325.52 13.981 325.742 1005 | 14.094 326.105 14.321 c 326.559 14.606 326.965 14.817 327.328 14.958 c 1006 | 327.93 15.188 328.543 15.305 329.18 15.305 c 329.688 15.305 330.133 1007 | 15.196 330.512 14.977 c 330.773 14.833 331.012 14.633 331.223 14.376 c 1008 | 331.398 14.157 331.484 14.047 331.484 14.047 c 332.055 14.376 l 332.5 1009 | 14.633 332.934 14.833 333.355 14.977 c 333.977 15.196 334.578 15.305 1010 | 335.16 15.305 c 337.16 15.305 338.156 14.208 338.156 12.012 c 338.156 1011 | 8.469 l 338.156 8.055 338.258 7.758 338.453 7.583 c 338.629 7.438 1012 | 338.973 7.313 339.48 7.212 c 339.867 7.141 340.063 7.032 340.063 6.883 1013 | c h 1014 | 340.063 6.883 m f 1015 | 349.305 8.426 m 349.305 8.114 348.879 7.723 348.035 7.255 c 347.07 1016 | 6.739 346.086 6.481 345.07 6.481 c 343.969 6.481 343.043 6.84 342.293 1017 | 7.563 c 341.492 8.329 341.09 9.348 341.09 10.626 c 341.09 12.067 1018 | 341.539 13.227 342.434 14.102 c 343.273 14.919 344.301 15.329 345.52 1019 | 15.329 c 346.242 15.329 346.914 15.098 347.543 14.637 c 348.105 14.231 1020 | 348.477 13.762 348.656 13.239 c 348.723 13.055 348.82 12.954 348.953 1021 | 12.934 c 349.145 12.895 349.238 12.77 349.238 12.551 c 349.238 12.251 1022 | 348.879 11.997 348.164 11.786 c 343.125 10.286 l 343.453 8.551 344.34 1023 | 7.684 345.793 7.684 c 346.633 7.684 347.586 7.989 348.656 8.602 c 1024 | 348.82 8.696 348.977 8.743 349.129 8.743 c 349.246 8.743 349.305 8.637 1025 | 349.305 8.426 c h 1026 | 346.711 12.813 m 346.711 13.215 346.551 13.567 346.223 13.868 c 345.898 1027 | 14.172 345.5 14.321 345.027 14.321 c 343.684 14.321 343.016 13.356 1028 | 343.016 11.422 c 343.016 11.161 l 345.988 12.059 l 346.469 12.196 1029 | 346.711 12.45 346.711 12.813 c h 1030 | 346.711 12.813 m f 1031 | Q 1032 | showpage 1033 | %%Trailer 1034 | count op_count sub {pop} repeat 1035 | countdictstack dict_count sub {end} repeat 1036 | cairo_eps_state restore 1037 | %%EOF 1038 | -------------------------------------------------------------------------------- /flask_website/static/logo/flask.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pallets/flask-website/8b083412f98842ee5e2b674cad40b8bf18501216/flask_website/static/logo/flask.pdf -------------------------------------------------------------------------------- /flask_website/static/logo/flask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pallets/flask-website/8b083412f98842ee5e2b674cad40b8bf18501216/flask_website/static/logo/flask.png -------------------------------------------------------------------------------- /flask_website/static/mailinglist.js: -------------------------------------------------------------------------------- 1 | $(function() { 2 | var first_mail = $('div.mail:first')[0].id; 3 | 4 | function display(id) { 5 | var pos = { 6 | x: window.pageXOffset || document.body.scrollLeft, 7 | y: window.pageYOffset || document.body.scrollTop 8 | }; 9 | $('ul.mailtree div.link').removeClass('selected'); 10 | $('#link-' + id).addClass('selected').focus(); 11 | $('div.mail').hide(); 12 | $('h2:first').text($('h3', $('#' + id).show()).text()); 13 | if (!(document.location.hash == '' && id == first_mail)) 14 | document.location.href = '#' + id; 15 | window.scrollTo(pos.x, pos.y); 16 | } 17 | 18 | $('div.mail') 19 | .addClass('dynamic-mail') 20 | .appendTo($('
').insertBefore('div.mail:first')) 21 | .hide(); 22 | $('div.mail h3').hide(); 23 | 24 | $('div.link').each(function() { 25 | var id = $('a', $(this).parent()).attr('href').substr(1); 26 | $(this).click(function() { 27 | display(id); 28 | return false; 29 | }); 30 | }).css({cursor: 'pointer'}); 31 | 32 | var href = document.location.href.split(/#/, 2)[1]; 33 | display(href != null ? href : first_mail); 34 | }); 35 | -------------------------------------------------------------------------------- /flask_website/static/mailinglist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pallets/flask-website/8b083412f98842ee5e2b674cad40b8bf18501216/flask_website/static/mailinglist.png -------------------------------------------------------------------------------- /flask_website/static/mask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pallets/flask-website/8b083412f98842ee5e2b674cad40b8bf18501216/flask_website/static/mask.png -------------------------------------------------------------------------------- /flask_website/static/new-snippet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pallets/flask-website/8b083412f98842ee5e2b674cad40b8bf18501216/flask_website/static/new-snippet.png -------------------------------------------------------------------------------- /flask_website/static/openid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pallets/flask-website/8b083412f98842ee5e2b674cad40b8bf18501216/flask_website/static/openid.png -------------------------------------------------------------------------------- /flask_website/static/profile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pallets/flask-website/8b083412f98842ee5e2b674cad40b8bf18501216/flask_website/static/profile.png -------------------------------------------------------------------------------- /flask_website/static/search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pallets/flask-website/8b083412f98842ee5e2b674cad40b8bf18501216/flask_website/static/search.png -------------------------------------------------------------------------------- /flask_website/static/ship.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pallets/flask-website/8b083412f98842ee5e2b674cad40b8bf18501216/flask_website/static/ship.png -------------------------------------------------------------------------------- /flask_website/static/snippets.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pallets/flask-website/8b083412f98842ee5e2b674cad40b8bf18501216/flask_website/static/snippets.png -------------------------------------------------------------------------------- /flask_website/static/style.css: -------------------------------------------------------------------------------- 1 | body { font-family: 'Georgia', serif; font-size: 17px; color: #000; } 2 | a { color: #004B6B; } 3 | a:hover { color: #6D4100; } 4 | .box { width: 540px; margin: 40px auto; } 5 | h2, h3, h4 { font-family: 'Garamond', 'Georgia', serif; font-weight: normal; } 6 | h1 { margin: 0 0 30px 0; background: url(/static/flask.png) no-repeat center; 7 | height: 165px; } 8 | h1 span { display: none; } 9 | h2 { font-size: 30px; margin: 15px 0 5px 0; } 10 | h3 { font-size: 24px; margin: 15px 0 5px 0; } 11 | h4 { font-size: 19px; margin: 15px 0 5px 0; } 12 | textarea, code, 13 | pre { font-family: 'Consolas', 'Menlo', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', 14 | monospace!important; font-size: 15px; background: #eee; } 15 | pre { padding: 7px 30px; margin: 15px -30px; line-height: 1.3; } 16 | .ig { color: #888; } 17 | p { line-height: 1.4; } 18 | ul { margin: 15px 0 15px 0; padding: 0; list-style: none; line-height: 1.4; } 19 | ul li:before { content: "\00BB \0020"; color: #888; position: absolute; margin-left: -19px; } 20 | ol { line-height: 1.4; margin: 15px 0 15px 30px; padding: 0; } 21 | blockquote { margin: 0; font-style: italic; color: #444; } 22 | .footer { font-size: 13px; color: #888; text-align: right; margin-top: 25px; } 23 | .more { text-align: right; margin-top: 0; font-size: 0.9em; font-style: italic; } 24 | .nav { text-align: center; } 25 | .nav a { font-style: italic; } 26 | .backnav { float: right; color: #444; font-style: italic; 27 | margin: 5px 0 0 0; font-size: 0.9em; } 28 | .message { background: #DEEBF3; color: #004B6B; padding: 5px 30px; 29 | margin: 10px -30px; } 30 | .actions { margin-top: 0; } 31 | .twitter:before { background: url(twitter.png) no-repeat; content: " "; 32 | float: right; width: 64px; height: 64px; 33 | margin: -25px 0 0 0; padding: 0 0 10px 10px; } 34 | .twitter li { margin: 15px 0; line-height: 1.2; font-size: 15px; } 35 | .twitter li:before { content: "♯"; padding-left: 4px; } 36 | .twitter .meta, .twitter .meta a { color: #888; font-size: 13px; } 37 | table { border: 1px solid black; border-collapse: collapse; 38 | margin: 15px 0; } 39 | td, th { border: 1px solid black; padding: 4px 10px; 40 | text-align: left; } 41 | th { background: #eee; font-weight: normal; } 42 | 43 | td input { border: none; padding: 0; } 44 | 45 | /* latest version button */ 46 | .latestver { margin: 20px 0 0 0; float: right; font-style: italic; } 47 | .latestver strong { font-weight: normal; } 48 | 49 | /* forms */ 50 | input, textarea, select { border: 1px solid black; padding: 2px; background: white; 51 | font-family: 'Georgia', serif; font-size: 17px; color: #004B6B; } 52 | textarea { width: 99%; } 53 | input[type="submit"] { background: #DEEBF3; border-color: #004B6B; 54 | cursor: pointer; } 55 | input[name="delete"]:hover { background: #A50000; color: white; 56 | border-color: #860000; } 57 | input.openid { background: url(openid.png) no-repeat 4px center; 58 | padding-left: 26px; } 59 | .formlist dt { color: #004B6B; margin: 8px 0; } 60 | 61 | /* badges */ 62 | .badge { margin: 15px -30px; padding: 0 30px; 63 | border: 1px solid #eee; } 64 | .badge p { margin: 0; padding: 10px 0; line-height: 0; } 65 | .badge img { margin: 0; } 66 | .badge pre { margin: 0 -30px; padding: 5px 30px; } 67 | 68 | /* logo hint */ 69 | .logohint { background: #f3f3f3; margin: 0 -30px 0 -30px; padding: 10px 30px; 70 | font-size: 14px; border-top: 1px solid #ddd; border-bottom: 1px solid #ddd; } 71 | .logohint p { margin: 10px 0; } 72 | 73 | /* snippets */ 74 | .snippet-author { margin: 0 0 20px 0; font-size: 0.9em; } 75 | #comment-box { background: #fafafa; margin: 45px -30px 15px -30px; padding: 10px 30px; } 76 | .comments { margin-top: 0; } 77 | .comments .title { border-bottom: 1px solid black; margin: 0; font-style: italic; } 78 | .comments .body { margin: 0 0 0 30px; } 79 | .comments .body pre { padding: 7px 30px 7px 60px; margin: 10px -30px 10px -60px; } 80 | .comments .body p { margin: 10px 0; } 81 | .comments li:before { display: none; } 82 | .comments ul li { list-style: disc; } 83 | .comments ul, 84 | .comments ol { margin: 15px 0 15px 20px; padding: 0; } 85 | #preview { margin: 20px -30px; padding: 10px 30px; background: #fafafa; } 86 | 87 | /* snippet warning */ 88 | .snippets-warning { background: #fdd; margin: 0 -30px 0 -30px; padding: 10px 30px; 89 | font-size: 14px; border-top: 1px solid #ebb; border-bottom: 1px solid #ebb; } 90 | .snippets-warning p { margin: 10px 0; } 91 | 92 | /* mailinglist */ 93 | .pagination { text-align: center; font-size: 15px; margin: 20px 0 0 0; } 94 | .disabled { color: #888; } 95 | .archive .meta { font-size: 0.9em; display: block; margin: 0 0 0.5em 1em; } 96 | .mailtree { border-top: 1px solid black; padding: 5px 12px 5px 12px; 97 | border-bottom: 1px solid black; font-size: 14px; 98 | max-height: 100px; overflow: auto; } 99 | .mailtree ul { margin: 0 0 0 15px; line-height: 1.5; } 100 | .mailtree li:before { display: none; } 101 | .mailtree .selected { background: #fafafa; } 102 | .mailtree .selected:before { content: "\00BB\0020"; color: #888; 103 | position: relative; margin-left: -12px; 104 | width: 12px!important; } 105 | .mail { margin: 15px 0; } 106 | .children .mail { margin: 15px 0 15px 20px; } 107 | .dynamic-mail { margin-left: 0!important; } 108 | .mail dl { margin: 0; padding-bottom: 15px; 109 | border-bottom: 1px solid black; } 110 | .mail dl dt { color: #888; width: 70px; float: left; height: 20px; } 111 | .mail dl dd { height: 20px; width: 500px; } 112 | .mail dl dd.from { text-decoration: underline; } 113 | .mail pre { background: transparent; font-size: 13px; 114 | line-height: 1.15; } 115 | .mail .quote { color: #004B6B; } 116 | .mail .sig { color: #888; } 117 | 118 | /* extensions */ 119 | .extension div.description p { margin: 10px 0; } 120 | .extension dl { margin: 0; font-size: 0.9em; } 121 | .extension dl dt { width: 130px; float: left; height: 22px; } 122 | .extension dl dd { height: 22px; } 123 | .extension h2.approved { background: url(approved.png) 6px 8px no-repeat; 124 | margin-left: -30px; padding-left: 30px; } 125 | .extension p.approved { color: #888; font-size: 14px; } 126 | 127 | /* projects */ 128 | .project { border: 1px solid #eee; margin: 10px -10px; 129 | padding: 10px; } 130 | .project h4 { font-size: 22px; margin: -10px -10px 10px -10px; 131 | padding: 0; border-bottom: 1px solid #ddd; } 132 | .project h4 a { color: #444; text-decoration: none; display: block; 133 | background: #fafafa; padding: 5px 10px; } 134 | .project h4 a:hover { color: black; background: white; } 135 | .project div.description p { margin: 7px 0; font-size: 0.9em; color: #666; } 136 | .project dl { margin: 0; font-size: 0.9em; } 137 | .project dl dt { width: 110px; float: left; height: 22px; } 138 | .project dl dd { height: 22px; } 139 | 140 | /* search */ 141 | .search-box { background: #eee; margin: 10px -30px; 142 | padding: 10px 30px; color: #444; } 143 | .search-box input { color: black; } 144 | .search-box input[type="text"] { margin-left: 10px; } 145 | .search-box input[type="submit"] { background: #ddd; } 146 | .search-box p { margin: 0; } 147 | 148 | .search-results span.kind { padding-left: 12px; font-size: 14px; } 149 | .search-results li { margin: 10px 0; } 150 | .search-results p { margin: 0; } 151 | .search-results p.description { padding-left: 20px; color: #888; 152 | font-size: 15px; } 153 | .search-results em.search-match { font-style: normal; background: #DEEBF3; 154 | color: #004B6B; font-weight: bold; } 155 | .search-results .ellipsis { padding: 0 4px; color: #666; 156 | font-weight: bold; } 157 | 158 | /* pygments style, same as flaskystyle */ 159 | .hll { background-color: #ffffcc } 160 | .c { color: #8f5902; font-style: italic } /* Comment */ 161 | .err { color: #a40000; border: 1px solid #ef2929 } /* Error */ 162 | .g { color: #000000 } /* Generic */ 163 | .k { color: #004461; font-weight: bold } /* Keyword */ 164 | .l { color: #000000 } /* Literal */ 165 | .n { color: #000000 } /* Name */ 166 | .o { color: #582800 } /* Operator */ 167 | .x { color: #000000 } /* Other */ 168 | .p { color: #000000; font-weight: bold } /* Punctuation */ 169 | .cm { color: #8f5902; font-style: italic } /* Comment.Multiline */ 170 | .cp { color: #8f5902 } /* Comment.Preproc */ 171 | .c1 { color: #8f5902; font-style: italic } /* Comment.Single */ 172 | .cs { color: #8f5902; font-style: italic } /* Comment.Special */ 173 | .gd { color: #a40000 } /* Generic.Deleted */ 174 | .ge { color: #000000; font-style: italic } /* Generic.Emph */ 175 | .gr { color: #ef2929 } /* Generic.Error */ 176 | .gh { color: #000080; font-weight: bold } /* Generic.Heading */ 177 | .gi { color: #00A000 } /* Generic.Inserted */ 178 | .go { color: #808080 } /* Generic.Output */ 179 | .gp { color: #745334 } /* Generic.Prompt */ 180 | .gs { color: #000000; font-weight: bold } /* Generic.Strong */ 181 | .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ 182 | .gt { color: #a40000; font-weight: bold } /* Generic.Traceback */ 183 | .kc { color: #004461; font-weight: bold } /* Keyword.Constant */ 184 | .kd { color: #004461; font-weight: bold } /* Keyword.Declaration */ 185 | .kn { color: #004461; font-weight: bold } /* Keyword.Namespace */ 186 | .kp { color: #004461; font-weight: bold } /* Keyword.Pseudo */ 187 | .kr { color: #004461; font-weight: bold } /* Keyword.Reserved */ 188 | .kt { color: #004461; font-weight: bold } /* Keyword.Type */ 189 | .ld { color: #000000 } /* Literal.Date */ 190 | .m { color: #990000 } /* Literal.Number */ 191 | .s { color: #4e9a06 } /* Literal.String */ 192 | .na { color: #c4a000 } /* Name.Attribute */ 193 | .nb { color: #004461 } /* Name.Builtin */ 194 | .nc { color: #000000 } /* Name.Class */ 195 | .no { color: #000000 } /* Name.Constant */ 196 | .nd { color: #808080 } /* Name.Decorator */ 197 | .ni { color: #ce5c00 } /* Name.Entity */ 198 | .ne { color: #cc0000; font-weight: bold } /* Name.Exception */ 199 | .nf { color: #000000 } /* Name.Function */ 200 | .nl { color: #f57900 } /* Name.Label */ 201 | .nn { color: #000000 } /* Name.Namespace */ 202 | .nx { color: #000000 } /* Name.Other */ 203 | .py { color: #000000 } /* Name.Property */ 204 | .nt { color: #004461; font-weight: bold } /* Name.Tag */ 205 | .nv { color: #000000 } /* Name.Variable */ 206 | .ow { color: #004461; font-weight: bold } /* Operator.Word */ 207 | .w { color: #f8f8f8; text-decoration: underline } /* Text.Whitespace */ 208 | .mf { color: #990000 } /* Literal.Number.Float */ 209 | .mh { color: #990000 } /* Literal.Number.Hex */ 210 | .mi { color: #990000 } /* Literal.Number.Integer */ 211 | .mo { color: #990000 } /* Literal.Number.Oct */ 212 | .sb { color: #4e9a06 } /* Literal.String.Backtick */ 213 | .sc { color: #4e9a06 } /* Literal.String.Char */ 214 | .sd { color: #8f5902; font-style: italic } /* Literal.String.Doc */ 215 | .s2 { color: #4e9a06 } /* Literal.String.Double */ 216 | .se { color: #4e9a06 } /* Literal.String.Escape */ 217 | .sh { color: #4e9a06 } /* Literal.String.Heredoc */ 218 | .si { color: #4e9a06 } /* Literal.String.Interpol */ 219 | .sx { color: #4e9a06 } /* Literal.String.Other */ 220 | .sr { color: #4e9a06 } /* Literal.String.Regex */ 221 | .s1 { color: #4e9a06 } /* Literal.String.Single */ 222 | .ss { color: #4e9a06 } /* Literal.String.Symbol */ 223 | .bp { color: #3465a4 } /* Name.Builtin.Pseudo */ 224 | .vc { color: #000000 } /* Name.Variable.Class */ 225 | .vg { color: #000000 } /* Name.Variable.Global */ 226 | .vi { color: #000000 } /* Name.Variable.Instance */ 227 | .il { color: #990000 } /* Literal.Number.Integer.Long */ 228 | -------------------------------------------------------------------------------- /flask_website/static/twitter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pallets/flask-website/8b083412f98842ee5e2b674cad40b8bf18501216/flask_website/static/twitter.png -------------------------------------------------------------------------------- /flask_website/templates/404.html: -------------------------------------------------------------------------------- 1 | 2 |A careful and diligent search has been made for the desired page, but it just cannot be found. 47 |
And so they returned to familiar waters. 48 | -------------------------------------------------------------------------------- /flask_website/templates/_twitter.html: -------------------------------------------------------------------------------- 1 | {% macro tweet_box(tweets, limit=none) %} 2 |
{{ badge(filename, title) }} 13 |
{{ badge(filename, title)|forceescape }}14 |
19 | If you want to share the word and want to add a “powered by 20 | Flask” badge to your website you can display one of these 21 | nifty badges. We also have some badges if your website is not 22 | yet powered by Flask :) 23 |
Idea for badges inspired by the Django Framework badges.
32 | {% endblock %} 33 | -------------------------------------------------------------------------------- /flask_website/templates/community/index.html: -------------------------------------------------------------------------------- 1 | {% extends "community/layout.html" %} 2 | {% block body %} 3 |4 | Flask is supported by an active, helpful community. 5 | Get involved by joining the 6 | mailing list and 7 | IRC channel. 8 | Discussion for developers using Flask as well as working on the core is welcome. 9 |
10 | If you want to spread the word, there is also a selection of 11 | badges and 12 | logos 13 | you can use on your own website. 14 | There are also shirts and mugs available at the 15 | Flask store, and 16 | stickers too. 17 |
6 | The Flask IRC channel is #pocoo
on irc.freenode.net.
7 | Flask shares that channel with other Pocoo projects, so please
8 | let the others know that you are talking about Flask when asking
9 | a question.
10 |
11 | You can use any IRC client to connect to freenode. If you don't 12 | have one yet, pick one from the list: 13 |
19 |20 | Alternatively you can also use the freenode web interface to 21 | join the IRC channel: open 22 | #pocoo in your browser. 23 |
24 | If you want to read up on older discussions you can access 25 | the IRC logs on https://botbot.me/freenode/pocoo/ (note: archive.org link). 26 | {% endblock %} 27 | -------------------------------------------------------------------------------- /flask_website/templates/community/layout.html: -------------------------------------------------------------------------------- 1 | {% extends "layout.html" %} 2 | {% block head %} 3 | {{ super() }} 4 | 7 | {% endblock %} 8 | {% block body_title %} 9 |
10 | The Flask logo is available for download and use in the formats 11 | below. You can use the logo to promote Flask like you want. 12 | The image is licensed under the “Flask Artwork License”. 13 | Read license text. 15 |
22 | The font used in the logo is “Hightower 23 | Text roman” from the Font Bureau foundry. 24 | {% endblock %} 25 | -------------------------------------------------------------------------------- /flask_website/templates/community/poweredby.html: -------------------------------------------------------------------------------- 1 | {% extends "community/layout.html" %} 2 | {% block title %}Powered By Flask{% endblock %} 3 | {% macro project_url(project) %} 4 | {%- if project.url -%} 5 | {{ project.url }} 6 | {%- elif project.source -%} 7 | {{ project.source }} 8 | {%- endif -%} 9 | {% endmacro %} 10 | {% macro render_projects(kind) %} 11 | {% for project in projects[kind] %} 12 |
33 | This is a list of websites and projects that disclosed that they 34 | are running on Flask. If you want your own website or project 35 | listed here, 36 | send me a mail 37 | with the URL, name and description of the website. 38 |
5 | Welcome to the Flask extensions registry. Here you can find a list 6 | of packages that extend Flask. This list is moderated and updated 7 | on a regular basis. If you want your package to show up here, 8 | follow the guide on creating extensions. 10 | {% for extension in extensions %} 11 | 12 |
This is an approved extension. 18 | {%- endif %} 19 |
because sometimes a pocket knife is not enough 26 |
35 | {% endblock %} 36 | {% block body %} 37 |38 | Flask is a microframework for Python based on Werkzeug, Jinja 2 and good intentions. 39 | And before you ask: It's BSD licensed! 41 |42 |
43 | Latest Version: 44 | {{ latest_release.version }} 45 |
from flask import Flask
47 | app = Flask(__name__)
48 |
49 | @app.route("/")
50 | def hello():
51 | return "Hello World!"
52 |
53 | $ pip install Flask 55 | $ FLASK_APP=hello.py flask run 56 | * Running on http://localhost:5000/57 | 58 |
83 | If you are looking for some example code of applications written with Flask, 84 | have a look at the sources of the examples on github: 85 |
Found a bug? Have a good idea for improving Flask? Head over to
93 | Flask's github page and
94 | create a new ticket or fork. If you just want to chat with fellow
95 | developers, visit the IRC
96 | channel or join the mailinglist. You can also directly add issues and feature
98 | requests to the
99 | issue tracker.
100 |
101 |
103 | {% endblock %}
104 |
--------------------------------------------------------------------------------
/flask_website/templates/general/login.html:
--------------------------------------------------------------------------------
1 | {% extends "layout.html" %}
2 | {% block head %}
3 | {{ super() }}
4 |
7 | {% endblock %}
8 | {% block title %}Login{% endblock %}
9 | {% block body %}
10 |
{{ result.title }} 21 | [{{ result.kind }}] 22 | {%- if result.description %} 23 |
{{ result.description }} 24 | {%- endif %} 25 | {%- else %} 26 |
5 | « list information 6 |
6 | There is a mailinglist for Flask hosted on python.org that 8 | you can use for both user requests and development discussions that may not 9 | fit well in a Github issue or StackOverflow question. 10 | 11 |
12 | You can subscribe or change your subscription options at 13 | 14 | https://mail.python.org/mailman/listinfo/flask/. If you're having 15 | problems, don't forget to check your Spam folder. 16 | 17 |
18 | You can view the list archives at 20 | http://mail.python.org/pipermail/flask/. 21 | 22 |
23 | Before July 2015, we used librelist for the mailing list. You can view those 24 | archives here: 25 | {{ url_for('mailinglist.archive') }}. Just keep in mind any new messages 26 | should now be posted to the python.org 28 | Flask mailing list mentioned above. 29 | 30 | {% endblock %} 31 | -------------------------------------------------------------------------------- /flask_website/templates/mailinglist/layout.html: -------------------------------------------------------------------------------- 1 | {% extends "layout.html" %} 2 | {% block head %} 3 | {{ super() }} 4 | 7 | {% endblock %} 8 | {% block body_title %} 9 |
10 | « back to archive 11 |
{{ mail.rendered_text() }}32 | {% if mail.children %} 33 |
Snippets are unofficial and unmaintained. 14 |
This is an archived view of user-submitted snippets. Despite being 15 | hosted on the Flask site, they are not official. No Flask 16 | maintainer has curated or checked the snippets for security, 17 | correctness, or design. 18 |
This snippet by {{ snippet.author.name }} can be used freely for 14 | anything you like. Consider it public domain. 15 | {% if snippet.comments %} 16 |
Comments
18 |19 | {% for comment in snippet.comments %} 20 |-
21 |
{{ comment.rendered_text }}
29 | {% endfor %}
30 |
31 |22 | {{ comment.title or "Comment" }} 23 | by {{ comment.author.name }} 24 | on {{ comment.pub_date|datetimeformat }} 25 | {% if g.user.is_admin %} 26 | (edit) 27 | {% endif %} 28 |