Files
cms-website/.deps_siteforge_v812/jinja2/__pycache__/ext.cpython-312.pyc
T

322 lines
41 KiB
Plaintext
Raw Normal View History

Ë
íÅÙjƒ|ãó>—UdZddlZddlZddlZddlmZddlmZddlm Z ddl
m Z ddl m
Z
dd l mZdd
lmZdd lmZdd lmZdd
lmZddlmZej,rGddlZddlmZddlmZddlmZGd„dej<«ZGd„de«Z ejBee fZ"dZ#ejHe%dfe&d<ejNd«Z(Gd„d«Z)ededejTdejTdejBejTeffd „«Z+d!ejXe%ge%fdejXde%ffd"„Z-d!ejXe%e%e.ge%fdejXde%ffd#„Z/d!ejXe%e%ge%fdejXde%ffd$„Z0d!ejXe%e%e%e.ge%fdejXde%ffd%„Z1Gd&„d'e)«Z2Gd(„d)e)«Z3Gd*„d+e)«Z4Gd,„d-e)«Z5e#d.fd/e jld0ejne%d1e8dejrejHe.e%ejBejte%ejHejte%dffffd2„Z;Gd3„d4«Z<d5ejzd6ejne%d7ejne%d8ej|e%ejTfdejrejHe.e%ejBejte%ejHejte%dffej~e%ff
d9„Z@e2ZAe3ZBe4ZCe5ZDy):z2Extension API for adding custom tags and behavior.éN)ÚMarkupé)Údefaults)Únodes)Ú Environment)ÚTemplateAssertionError)ÚTemplateSyntaxError)Úconcat)ÚContext)Ú Undefined)Ú
import_string)Ú pass_context)ÚToken)Ú TokenStream)ÚParsercó4—eZdZdedefd„Zdedededefd„Zy) Ú_TranslationsBasicÚmessageÚreturncó—y©N©)Úselfrs úNC:\Users\30997\AppData\Local\Temp\pip-target-6g32zz5s\lib\python\jinja2/ext.pyÚgettextz_TranslationsBasic.gettexts€°óÚsingularÚpluralÚncó—yrr)rrrrs rÚngettextz_TranslationsBasic.ngettexts€Ø rN)Ú__name__Ú
__module__Ú __qualname__ÚstrrÚintr!rrrrrs0„Ø3 3Ð3¨3Ó3ð  Sð °#ð ¸#ð À#ô rrc
ó<—eZdZdededefd„Zdededededef
d„Zy )
Ú_TranslationsContextÚcontextrrcó—yrr)rr)rs rÚpgettextz_TranslationsContext.pgettext"s€¸srrrrcó—yrr)rr)rrrs rÚ npgettextz_TranslationsContext.npgettext$s€àrN)r"r#r$r%r+r&r-rrrr(r(!sA„ØB CÐB°#ÐB¸#ÓBð Øð Ø*-ð Ø7:ð Ø?Bð à
ô rr()Ú_rr!r+r-.ÚGETTEXT_FUNCTIONSz\s*\n\s*có,—eZdZUdZej
eed<dd„Ze «Z
ejeed<dZ de
ddfd „Zde
dd
fd „Z dd ed
ej edej edefd„Zdddej$dej&dffd„Zdddej$ej,ej.ej,ffd„Z dd
edej edej4fd„Z d d
edej ej.ej8dej ej.ej:dej ej8dej ej8dej edej<fd„Zy)!Ú ExtensionagExtensions can be used to add extra functionality to the Jinja template
system at the parser level. Custom extensions are bound to an environment
but may not store environment specific data on `self`. The reason for
this is that an extension can be bound to another environment (for
overlays) by creating a copy and reassigning the `environment` attribute.
As extensions are created by the environment they cannot accept any
arguments for configuration. One may want to work around that by using
a factory function, but that is not possible as extensions are identified
by their import name. The correct way to configure the extension is
storing the configuration values on the environment. Because this way the
environment ends up acting as central configuration storage the
attributes may clash which is why extensions have to ensure that the names
they choose for configuration are not too generic. ``prefix`` for example
is a terrible name, ``fragment_cache_prefix`` on the other hand is a good
name as includes the name of the extension (fragment cache).
Ú
identifierrNcóD—|j›d|j›�|_y)NÚ.)r#r"r2)Úclss rÚ__init_subclass__zExtension.__init_subclass__Ls€ØŸN™NÐ+¨1¨S¯\©\¨NÐ;ˆ�rÚtagsédÚ environmentcó—||_yr)r9)rr9s rÚ__init__zExtension.__init__Ys
€Ø&ˆÕrzte.Selfcóœ—tj|j«}|jj |j«||_|S)z=Create a copy of this extension bound to another environment.)ÚobjectÚ__new__Ú __class__Ú__dict__Úupdater9)rr9Úrvs rÚbindzExtension.bind\s6€ä
�^‰^˜DŸN™NÓ
+ˆØ
� ‰ ×ј4Ÿ=™=Ô)Ø$ˆŒØˆ rÚsourceÚnameÚfilenamecó—|S)zÁThis method is called before the actual lexing and can be used to
preprocess the source. The `filename` is optional. The return value
must be the preprocessed source.
r)rrDrErFs rÚ
preprocesszExtension.preprocesscs €ðˆ
rÚstreamrrcó—|S)a It's passed a :class:`~jinja2.lexer.TokenStream` that can be used
to filter tokens returned. This method has to return an iterable of
:class:`~jinja2.lexer.Token`\s, but it doesn't have to return a
:class:`~jinja2.lexer.TokenStream`.
r)rrIs rÚ
filter_streamzExtension.filter_streamls €ðˆ
rÚparserrcó—t«‚)aIf any of the :attr:`tags` matched this method is called with the
parser as first argument. The token the parser stream is pointing at
is the name token that matched. This method has to return one or a
list of multiple nodes.
)ÚNotImplementedError)rrLs rÚparsezExtension.parsevs
€ô "Ó#Ð#rÚlinenocóF—tj|j||¬«S)zÓReturn an attribute node for the current extension. This is useful
to pass constants on extensions to generated template code.
::
self.attr('_my_attribute', lineno=lineno)
©rP)rÚExtensionAttributer2)rrErPs rÚattrzExtension.attr~s€ô×'Ñ'¨¯©¸ÀfÔMÐMrÚargsÚkwargsÚdyn_argsÚ
dyn_kwargscój—|€g}|€g}tj|j||¬«|||||¬«S)zsCall a method of the extension. This is a shortcut for
:meth:`attr` + :class:`jinja2.nodes.Call`.
rR)rÚCallrT)rrErUrVrWrXrPs rÚ call_methodzExtension.call_methodŠsH€ð ˆ<؈DØ ˆ>؈FÜ�z‰zØ �I‰I�d 6ˆIÓ *Ø Ø Ø Ø Øô

ð
r)rNr)NNNNN) r"r#r$Ú__doc__ÚtÚClassVarr%Ú__annotations__r6Úsetr7ÚSetÚpriorityrr;rCÚOptionalrHÚUnionÚIterablerKrÚNodeÚListrOr&rSrTÚExprÚKeywordrZr[rrrr1r17sÙ…ñð$—
‘
˜3‘Óó<ñ“u€Dˆ!�%‰%�‰*Óð€Hð' Kð'°Dó'ð  ð° óðOSñØðØ!"§¡¨C¡ðØ<=¿J¹JÀs¹Oðà óðØ#ðà
�‰� §
¡
¨7Ñ 3Ð3Ñ 4óð$˜Hð$¨¯©°·±¸Q¿V¹VÀEÇJÁJÑ=OÐ1OÑ)Pó$ð48ñ
NØð
NØ!"§¡¨C¡ð
Nà × !Ñ !ó
Nð04Ø48Ø+/Ø-1Ø"&ñ
àð
ð�j‰j˜Ÿ™ §
¡
Ñ+Ñ,ð
ð—
‘
˜1Ÿ6™6 %§-¡-Ñ0Ñ1ð 
ð
—*‘*˜UŸZ™ZÑ(ð 
ð —J‘J˜uŸz™zÑ*ð

ð—
‘
˜3‘ð
ð
�‰ô
rr1Ú __contextrUrVrcóL—|j|jd«g|¢­i|¤ŽS)Nr)ÚcallÚresolve)rjrUrVs rÚ_gettext_aliasrn¤s*€ð ˆ9�>‰>˜)×+Ñ+¨IÓ6Ð H¸Ò HÀÑ HÐHrÚfuncc ój‡—tdtdtdtjdtfˆfd„ «}|S)NrjÚ__stringÚ variablesrcót•—|j‰|«}|jjr t|«}||zSr)rlÚeval_ctxÚ
autoescaper)rjrqrrrBros €rrz"_make_new_gettext.<locals>.gettext¬s7ø€à
�^‰^˜D (Ó
+ˆØ × Ñ × (Ò (ܘ“ˆBð�I‰~Ðr©rr r%r]ÚAny)rors` rÚ_make_new_gettextrx«s<ø€Üðœ7ð¬cðÄÇÁðÌ#ôóðð €Nrc
󂇗tdtdtdtdtdtj
dtf ˆfd„ «}|S)NrjÚ
__singularÚ__pluralÚ__numrrrc󜕗|jd|«|j‰|||«}|jjr t |«}||zS)NÚnum©Ú
setdefaultrlrtrur)rjrzr{r|rrrBros €rr!z$_make_new_ngettext.<locals>.ngettextºsKø€ð ×јU EÔ*Ø
�^‰^˜D *¨h¸Ó
>ˆØ × Ñ × (Ò (ܘ“ˆBà�I‰~Ðr©rr r%r&r]rw)ror!s` rÚ_make_new_ngettextr‚¹sXø€Üð Üð äð ôð ôð ô
—U‘Uð ô
ô
óð ð €Orc óv‡—tdtdtdtdtjdtf
ˆfd„ «}|S)NrjÚ __string_ctxrqrrrcóš•—|jd|«|j‰||«}|jjr t |«}||zS)Nr)r)rjr„rqrrrBros €rr+z$_make_new_pgettext.<locals>.pgettextÍsKø€ð ×јY¨ Ô5Ø
�^‰^˜D ,°Ó
9ˆà × Ñ × (Ò (ܘ“ˆBð�I‰~Ðrrv)ror+s` rÚ_make_new_pgettextr†ÌsHø€Üð
Üð
Ü*-ð
Ü9<ð
ÜKLÏ5É5ð
ä ô
óð
ð €Orc󎇗tdtdtdtdtdtdtj
dtfˆfd„ «}|S) Nrjr„rzr{r|rrrcó•—|jd|«|jd|«|j‰||||«}|jjr t |«}||zS)Nr)r~r)rjr„rzr{r|rrrBros €rr-z&_make_new_npgettext.<locals>.npgettextàs_ø€ð ×јY¨ Ô5Ø×јU EÔ*Ø
�^‰^˜D ,°
¸HÀeÓ
Lˆà × Ñ × (Ò (ܘ“ˆBð�I‰~Ðrr�)ror-s` rÚ_make_new_npgettextr‰Ýseø€ôðÜðäðôðôð ô
ð ô —U‘Uð
ô
ôóðð$ Ðrcóf‡—eZdZdZdhZdeddfˆfd„ Z d&ddd eje ddfd
„Z
d&d eje ddfd „Z d'd eje
ge
fd
eje
e
ege
fd eje dejeje
e
ge
fdejeje
e
e
ege
fddf d„Zd(d„Zefdej$e
ej(fdej*e
dej,ej.ee
ej$eje
ej.eje
dffffd„Zdddej$ej2ej4ej2ffd„Zefde
dej:e
de
fd„Zddde dej.ej4e
e
ffd„Zde
deje
d eje
d!ej@e
ejBfd"ejejBd#e d$e dejDfd%„Z#ˆxZ$S))ÚInternationalizationExtensionz-This extension adds gettext support to Jinja.Útransr9rNcóÜ•—t‰|�|«t|jd<|j |j
|j |j|j|jd¬«y)Nr.F)Úinstall_gettext_translationsÚinstall_null_translationsÚinstall_gettext_callablesÚuninstall_gettext_translationsÚextract_translationsÚnewstyle_gettext)
Úsuperr;rnÚglobalsÚextendÚ_installÚ
_install_nullÚ_install_callablesÚ
_uninstallÚ_extract)rr9r?s €rr;z&InternationalizationExtension.__init__s]ø€Ü
‰Ñ˜Ô%Ü#1ˆ ×јCÑ Ø×ÑØ)-¯©Ø&*×&8Ñ&8Ø&*×&=Ñ&=Ø+/¯?©?Ø!%§¡Ø"ð
õ
rÚ translationsÚ_SupportedTranslationsÚnewstylecóЗt|dd«}|€ |j}t|dd«}|€ |j}t|dd«}t|dd«}|j|||||¬«y)NÚugettextÚ ungettextr+r-)ržr+r-)Úgetattrrr!r™)rrœržrr!r+r-s rr—z&InternationalizationExtension._installs{€ô
˜,¨
°DÓ9ˆØ ˆ?Ø"×*Ñ*ˆGܘ<¨°dÓ;ˆØ Ð Ø#×,Ñ,ˆHä˜<¨°TÓ:ˆÜ˜L¨+°tÓ<ˆ Ø ×ÑØ �X¨¸8Èyð õ
rc
óT—ddl}|j«}t|d«r
|j}ndtdtdtfd„}t|d«r
|j
}n"dtdtdtd t dtf
d
„}|j|j|j|||¬ «y) Nrr+ÚcÚsrcó—|Srr)r¤r¥s rr+z=InternationalizationExtension._install_null.<locals>.pgettext*s€Ø�rr-Úprcó—|dk(r|S|S)Nrr)r¤r¥r§rs rr-z>InternationalizationExtension._install_null.<locals>.npgettext1s€Ø šF�qÐ)¨Ð)r)rr!ržr+r-) rÚNullTranslationsÚhasattrr+r%r-r&r™r!)rržrrœr+r-s rr˜z+InternationalizationExtension._install_null s±€Ûà×/Ñ/Ó1ˆ ä �< Ô ,à#×,Ñ,‰Hð
œCð
¤Cð
¬Có
ô �< Ô -Ø$×.Ñ.‰Ið
*œSð
*¤Sð
*¬Sð
*´Sð
*¼Só
*ð
×ÑØ ×(Ñ(Ø!×*Ñ*ØØØð õ
rrr!r+r-có—|�||j_|jjr0t|«}t|«}|� t |«}|� t |«}|jj j||||¬«y©N)rr!r+r-)r9r“rxr‚r†r‰r•rA)rrr!ržr+r-s rr™z0InternationalizationExtension._install_callables<sƒ€ð Ð Ø08ˆD× Ñ Ô -Ø × Ñ × ,Ò ,Ü'¨Ó0ˆGÜ)¨(Ó3ˆHàÐ#Ü-¨hÓ7�àÐ$Ü/° Ó:� à ×Ñ× Ñ ×'Ñ'Ø h¸ÈYð (õ
rcó^—dD](}|jjj|d«Œ*yr¬)r9r•Úpop)rrœÚkeys rršz(InternationalizationExtension._uninstallTs)€ÛCˆCØ × Ñ × $Ñ $× (Ñ (¨¨dÕ 3ñDrrDÚgettext_functions.cóp—t|t«r|jj|«}t ||«Sr)Ú
isinstancer%r9rOÚextract_from_ast)rrDr°s rr›z&InternationalizationExtension._extractXs2€ô �fœcÔ "Ø×%Ñ%×+Ñ+¨FÓ3ˆFÜ Ð(9Ó:Ð:rrLrc
ó’ —t|j«j}d}|jjd«}|� |j}d}d}d}i}d} |jj
j dk7�rÝ|r|jjd«|jjd«r�n£|jjd«}
|
j|vr0|jd|
j›d �|
jt¬
«|jj
j d k(r5t|j«|j«x||
j<} nP| €|
jd vr|
jd
k(} �Œ0tj|
jd«x||
j<} |€{t| tj«rPtjdd«}|||
j<tj tjdd«| «}n| }|
jdk(}|jj
j dk7r�ŒÝ|jjd«d} d}
t#«}|j%|d«\}}|r4|j'|«|€!tj|dd«}|ddk(}|jj
j)d«�rd}
t|j«|jj
j dk7rw|jjd«}
|
j|vr0|jd|
j›d�|
jt¬
«||
j}|
jdk(}|jjd«|j%|d«\}} t|j«|j'|«nt|j«|D] }||vsŒtj|d«||<Œ"|
sd}n|€|jd|«| €|j*j,d} | r$|j/|«}| r|j/| «} |j1|| |||t3|«|xr|
«}|j5|«|�||gS|S)zParse a translatable tag.NÚstringFÚ block_endÚcommaÚcolonrEztranslatable variable z defined twice.)ÚexcÚassign)ÚtrimmedÚ notrimmedr»ÚloadÚ_transÚstorer~Trzname:pluralizezunknown variable z for pluralizationzpluralize without variablesúext.i18n.trimmed)ÚnextrIrPÚnext_ifÚvalueÚcurrentÚtypeÚexpectÚskip_ifÚfailrÚparse_expressionrÚNamer²rZÚAssignr`Ú _parse_blockrAÚtestr9ÚpoliciesÚ_trim_whitespaceÚ
_make_nodeÚboolÚ
set_lineno)rrLrPr)Ú
context_tokenÚ plural_exprÚplural_expr_assignmentÚnum_called_numrrr»ÚtokenÚvarrÚ have_pluralÚ
referencedÚsingular_namesrÚ plural_namesrEÚnodes rrOz#InternationalizationExtension.parsecsC€ä�f—m‘mÓ$×+Ñ+ˆàˆØŸ
™
×-Ñ-¨hÓ7ˆ
à Ð $Ø#×)Ñ)ˆGð
/3ˆ Ø;?ÐØˆØ-/ˆ ؈Ø�m‰m×#Ñ#×(Ñ(¨KÓ7ÙØ—
‘
×$Ñ$ WÔ-ð�}‰}×$Ñ$ WÔ-Ùà—M‘M×(Ñ(¨Ó0ˆEØ�{‰{˜iÑ'Ø— ‘ Ø,¨U¯[©[¨O¸?ÐKØ—L‘LÜ.ðôð�}‰}×$Ñ$×)Ñ)¨XÒ5Ü�V—]‘]Ô#Ø/5×/FÑ/FÓ/HÐH� ˜%Ÿ+™+Ñ&©Ø� U§[¡[Ð4LÑ%LØŸ+™+¨Ñ2�Ùä/4¯z©z¸%¿+¹+ÀvÓ/NÐN� ˜%Ÿ+™+Ñ&¨àÐ"ܘc¤5§:¡:Ô.Ü"'§*¡*¨X°vÓ">�KØ-8�I˜eŸk™kÑ*Ü-2¯\©\ÜŸ
™
 8¨WÓ5°só.Ñ*ð#&�KØ!&§¡°Ñ!5�ðG�m‰m×#Ñ#×(Ñ(¨KÔ7ðJ �
‰
×ј[Ô)àˆØˆ Ü“Uˆ
ð$(×#4Ñ#4°V¸TÓ#BÑ ˆ˜Ù Ø × Ñ ˜nÔ -ØÐ"Ü#Ÿj™j¨¸Ñ):¸FÓC� Ø!/°Ñ!2°eÑ!;�ð �=‰=× Ñ × %Ñ %Ð&6Õ 7؈KÜ �—‘Ô Ø�}‰}×$Ñ$×)Ñ)¨[Ò8ØŸ
™
×,Ñ,¨VÓ4�Ø—;‘; iÑ/Ø—K‘KØ+¨E¯K©K¨?Ð:LÐMØŸ ™ Ü2ð ôð
(¨¯ © Ñ4� Ø!&§¡°Ñ!5�Ø �M‰M× Ñ  Ô -Ø#'×#4Ñ#4°V¸UÓ#CÑ ˆL˜&Ü �—‘Ô Ø × Ñ ˜lÕ +ä �—‘Ô óˆDؘ9Ò$Ü"'§*¡*¨T°6Ó":� ˜$’ðñ؉KØ
Ð
Ø �K‰KÐ5°vÔ >à ˆ?Ø×&Ñ&×/Ñ/Ð0BÑCˆGÙ Ø×,Ñ,¨XÓ6ˆHÙØ×.Ñ.¨vÓ6�à�‰Ø Ø Ø Ø Ø Ü �Ó Ø Ò *˜{ó
ˆð
�‰˜ÔØ !Ð -Ø*¨DÐ1Ð 1àˆKrrµÚ_ws_recóB—|jd|j««S)NÚ )ÚsubÚstrip)rrµrÞs rrÏz.InternationalizationExtension._trim_whitespaceÝs€Ø�z‰z˜#˜vŸ|™|›~Ó.Ð.rÚallow_pluralizecóR—g}g} |jjjdk(rV|j|jjjj dd««t
|j«�n›|jjjdk(r|t
|j«|jjd«j}|j|«|jd|›d�«|jjd«nü|jjjd k(r¦t
|j«|jjjdk(r |jjjnd
}|d k(rn{|d k(r|rns|jd
«n|dk(r|jd«|jd|›d�«n3|jjr|jd«n td«‚�Œ|t|«fS)z1Parse until the next block tag with a given name.ÚdataÚ%ú%%Úvariable_beginrEz%(z)sÚ variable_endÚ block_beginNÚendtransÚ pluralizez:a translatable section can have only one pluralize sectionrŒz6trans blocks can't be nested; did you mean `endtrans`?zBcontrol structures in translatable sections are not allowed; saw `Ú`zunclosed translation blockzinternal parser error) rIrÄrÅÚappendrÃÚreplacerÁrÆrÈÚeosÚ RuntimeErrorr
)rrLrãrÚÚbufrEÚ
block_names rrÌz*InternationalizationExtension._parse_blockàs΀ðˆ
؈àØ�}‰}×$Ñ$×)Ñ)¨VÒ3Ø—
‘
˜6Ÿ=™=×0Ñ0×6Ñ6×>Ñ>¸sÀDÓIÔJÜ�V—]‘]Ö#Ø—‘×&Ñ&×+Ñ+Ð/?Ò?Ü�V—]‘]Ô#Ø—}‘}×+Ñ+¨FÓ3×9Ñ9�Ø×!Ñ! $Ô'Ø—
‘
˜R ˜v R˜=Ô)Ø—
‘
×$Ñ$ ^Õ4Ø—‘×&Ñ&×+Ñ+¨}Ò<Ü�V—]‘]Ô#ð—}‘}×,Ñ,×1Ñ1°VÒ;ð—M‘M×)Ñ)×/Ò/àðð
 Ò+ØØ ;Ò.Ù&ØØ—K‘KØTõð  7Ò*Ø—K‘KØPôð— ‘ ðØ&˜< qð*õð—‘×"Ò"Ø— ‘ Ð8Õ9ä"Ð#:Ó;Ð;ñIðLœ6 #›;Ð&Ð&rrrr)rrrÔÚvars_referencedrÖcóª—|jj}|s(|s&|jdd«}|r|jdd«}d} tj|«g}
|�*|
j dtj|««d| ›�} |�+d| ›�} |
j
tj|«|f«tjtj| d«|
gdd«} |rP|j«D]<\} }
|r| d k(rŒ| jjtj| |
««Œ>nˆtj| «} |rqtj| tj|j«D� �
cgc].\} }
tj tj| «|
«‘Œ0c}
} ««} tj"| g«Scc}
} w)
z/Generates a useful node from the data provided.rçrærNrr§rr½r~)r9r“rïrÚConstÚinsertr–rZrÊÚitemsrVrîriÚMarkSafeIfAutoescapeÚModÚDictÚPairÚOutput)rrrr)rrrÔrôrÖržÚ func_nameÚ func_argsrÝr¯rÃs rrÐz(InternationalizationExtension._make_nodesš€ð×#Ñ#×4Ñ4ˆñ
¡xØ×'Ñ'¨¨cÓ2ˆHÙØŸ™¨¨cÓ2�àˆ Ü).¯©°XÓ)>Ð(?ˆ à Ð Ø × Ñ ˜Q¤§ ¡ ¨GÓ 4Ô 5ؘI˜;˜ˆIà Ð "ؘI˜;˜ˆIØ × Ñ œeŸk™k¨&Ó1°;Ð?Ô @ä�z‰zœ%Ÿ*™* Y°Ó7¸ÀBÈÈdÓSˆñ
Ø'Ÿo™oÖ/‘
��Uñ" c¨U¢lØØ— ‘ ×"Ñ"¤5§=¡=°°eÓ#<Õ=ñ 0ô×-Ñ-¨dÓ3ˆDÙÜ—y‘yØÜ—J‘Jð/8¯o©oÔ.?ôá.?¡
  Uô"ŸJ™J¤u§{¡{°3Ó'7¸Õ?Ø.?òóó�ô�|‰|˜T˜FÓ#Ð#ùó
sÅ:3Gr)NNN)rœr�rN)%r"r#r$r\r7rr;r]rcrÑr—r˜ÚCallabler%r&r™ršr/rdrÚTemplateÚSequenceÚIteratorÚTupler›rfrgrOrÞÚPatternrÏrÌrûrhrýrÐÚ
__classcell__)r?s@rr‹r‹ösÀø„Ù7à ˆ9€Dð

 Kð

°Dõ

ðTXñ
Ø4ð
Ø@AÇ
Á
È4Ñ@Pð
à
ó
ñ$
 a§j¡j°Ñ&6ð
À$ó
ð@&*Ø<@ØGKñ

à—‘˜S˜E 3˜JÑ'ð
ð—*‘*˜c 3¨˜_¨cÐ1Ñ2ð
ð—*‘*˜TÑ"ð 
ð
—*‘*˜QŸZ™Z¨¨c¨
°C¨Ñ8Ñ9ð 
ð —:‘:˜aŸj™j¨#¨s°C¸Ð)=¸sÐ)BÑCÑDð

ð
ó
ó04ð.?ñ ;à—‘˜˜UŸ^™^Ð+Ñ,ð ;ðŸ:™: c™?ð ;ð
�‰Ø �‰��S˜!Ÿ'™' !§*¡*¨S¡/°1·7±7¸1¿:¹:Àc¹?ÈCÐ;OÑ3PÐ"PÑQÐQÑRñ
ó ;ðx˜Hðx¨¯©°·±¸Q¿V¹VÀEÇJÁJÑ=OÐ1OÑ)PóxðtFLñ/ sð/°A·I±I¸c±Nð/ÐPSó/ð-'Øð-'Ø15ð-'à
�‰�—‘˜‘˜cÐ!Ñ "ó-'ð^<$àð<$ð—
‘
˜3‘ð<$𗑘C‘ð <$ð
—6‘6˜#˜uŸz™z˜/Ñ*ð <$ð —Z‘Z §
¡
Ñ+ð
<$ðð<$ðð<$ð
�‰÷<$rr‹có:—eZdZdZdhZdddej fd„Zy)ÚExprStmtExtensionzrAdds a `do` tag to Jinja that works like the print statement just
that it doesn't print the return value.
ÚdorLrrcó–—tjt|j«j¬«}|j «|_|S)NrR)rÚExprStmtrÁrIrPÚ parse_tuplerÝ)rrLrÝs rrOzExprStmtExtension.parseUs4€Ü�~‰~¤T¨&¯-©-Ó%8×%?Ñ%?Ô@ˆØ×&Ñ&Ó(ˆŒ ؈ rN)r"r#r$r\r7rr rOrrrrrNs'„ñð
ˆ6€Dð˜H𨯩ôrrcón—eZdZdZddhZdddej ejejffd„Z
y) ÚLoopControlExtensionz/Adds break and continue to the template engine.ÚbreakÚcontinuerLrrcóÊ—t|j«}|jdk(r tj|j
¬«Stj |j
¬«S)NrrR)rÁrIrÃrÚBreakrPÚContinue)rrLr×s rrOzLoopControlExtension.parse`sB€Ü�V—]‘]Ó#ˆØ �;‰;˜'Ò !Ü—;‘; e§l¡lÔ3Ð 3Ü�~‰~ U§\¡\Ô2Ð2rN) r"r#r$r\r7r]rdrrrrOrrrrr[s8„Ù9à �ZÐ €Dð3˜Hð3¨¯©°·±¸e¿n¹nÐ1LÑ)Mô3rrcóJ—eZdZdZdhZdddej fd„Zdede fd„Z
y )
ÚDebugExtensiona·A ``{% debug %}`` tag that dumps the available variables,
filters, and tests.
.. code-block:: html+jinja