dE \HdZddlZddlmZddlmZddlmZddl m Z ddl m Z ddlmZdd lmZd d lmZd d lmZd d lmZd dlmZd dlmZd dlmZd dlmZd dlmZd dlmZd dlmZd dlm Z d dl!m"Z"ej#r ddl$Z%d dl&m'Z'ej(dej)dej*fZ+dddddd d!d"d#Z,d$e+d%e+fd&Z-d'e.d%ej)d(ej/d)gdffd*Z0d'e.d%ej)d(ej1d)gdffd+Z2 dHd.ej3d/d0d1ej4e.d2ej4e.d3ej4ej5d4e6d5e6d%ej4e.fd6Z7d7ej*d%e6fd8Z8d9ej9ej:d:ej9e.d%ej;e.fd;Z<Gd<d=Z=Gd>d)Z>Gd?d@e?Z@GdAdBe"ZAGdCdDe"ZBGdEdFeCZDGdGd(e"ZEdS)Iz0Compiles nodes from the parser into Python code.N)contextmanager)update_wrapper)StringIO)chain) iskeyword)escape)Markup)nodes)TemplateAssertionError)Symbols)VAR_LOAD_ALIAS)VAR_LOAD_PARAMETER)VAR_LOAD_RESOLVE)VAR_LOAD_UNDEFINED) EvalContext) Optimizer)_PassArg)concat) NodeVisitor) EnvironmentF.)boundz==z!=>z>=.new_func,sk > %en.E %~++D%.AAH4zz(E222qtU--f---)r ExprtAnyrcastr)r$r5s` r4 optimizeconstr;+sm . .%*Z .8? .KL5 .  . . . . . . !&H--q 1 11r6opr(r+c \tdddtjdtddffd }|S)Nr'r(r)r*r%c|jjrs|jjvre|dd||j||d||j|nd|d||j||dd||j||ddS)Nz environment.call_binop(context, , ( )) environment sandboxedintercepted_binopswriter2leftrightr'r)r*r<s r4visitorz_make_binop..visitor<s   & *d&999 JJB"BBB C C C JJty% ( ( ( JJt    JJtz5 ) ) ) ) JJsOOO JJty% ( ( ( JJy2yyy ! ! ! JJtz5 ) ) ) 3r6)r;r BinExprr+r<rJs` r4 _make_binoprM;sPoU]5T]" Nr6c \tdddtjdtddffd }|S)Nr'r(r)r*r%c6|jjrC|jjvr5|dd||j|n3|dz||j||ddS)Nzenvironment.call_unop(context, r?r@rB)rCrDintercepted_unopsrFr2r)rIs r4rJz_make_unop..visitorTs   & )d&888 JJAAAA B B B JJty% ( ( ( ( JJsRx JJty% ( ( ( 3r6)r;r UnaryExprr+rLs` r4 _make_unoprRQsR o U_ U t     ]  Nr6FTr)rCrnamefilenamestream defer_init optimizedct|tjstd|||||||}||||jSdS)z+Generate the python source for a node tree.z Can't compile non template nodesN) isinstancer Template TypeErrorcode_generator_classr2rUgetvalue)r)rCrSrTrUrVrW generators r4generater_es| dEN + +<:;;;00T8VZIOOD ~((*** 4r6valuec||tus |turdSt|ttt t ttthvrdSt|tttthvrtd|DSt|tur+td|DSdS)z)Does the node have a safe representation?NTc34K|]}t|VdSr. has_safe_repr).0vs r4 z has_safe_repr..s*33=##333333r6c3XK|]%\}}t|ot|V&dSr.rcrekrfs r4rgz has_safe_repr..s;SSTQ=##8 a(8(8SSSSSSr6F)NotImplementedEllipsistypeboolintfloatcomplexrangestrr tuplelistset frozensetalldictitemsr`s r4rdrd}s }//5H3D3Dt E{{tS%%fEEEt E{{udC33333U333333 E{{dSSU[[]]SSSSSS 5r6r namesct|} |D]}||n#t$rYnwxYw|jS)zCheck if the names passed are accessed undeclared. The return value is a set of all the undeclared names from the sequence of names found. )UndeclaredNameVisitorr2 VisitorExit undeclared)r r|rJr)s r4find_undeclaredrsh $E**G   D MM$           s , 99cLeZdZdejejejfddfdZdS)MacroRefr)r%Nc>||_d|_d|_d|_dSNF)r)accesses_calleraccesses_kwargsaccesses_varargsr'r)s r4__init__zMacroRef.__init__s' $$ %r6) __name__ __module__ __qualname__r8Unionr Macro CallBlockrr6r4rrsF&QWU[%/%AB&t&&&&&&r6rc eZdZdZ d dedejddejeddfdZddZ dd e ddfd Z dd Z e Z dS)r+z&Holds compile time information for us.Nr0parentlevelr%c@||_||_|+t||_d|_d|_d|_n?t|j||_|j|_|j|_|j|_d|_d|_d|_ d|_ d|_ dS)NrF) r0rr symbolsrequire_output_checkbufferblocktoplevel rootlevel loop_frame block_frame soft_frame)r'r0rrs r4rzFrame.__init__s !  >"///DL).D % ,0DK+/DJJ#6>???DL(.(CD % -DKDJ     r6ctjtt|j}|j|j|j |_|S)z!Create a copy of the current one.) r8r:r+object__new__ __class____dict__updatercopyr'rvs r4rz Frame.copysS VE6>>$.99 : : 4=)))\&&((  r6Fisolatedcv|r#t|j|jjdzSt|j|S)zReturn an inner frame.r r)r+r0rr)r'rs r4innerz Frame.inners<  Fdl.@1.DEEE ET]D)))r6cJ|}d|_d|_|S)a&Return a soft frame. A soft frame may not be modified as standalone thing as it shares the resources with the frame it was created of, but it's not a rootlevel frame any longer. This is only used to implement if-statements and conditional expressions. FT)rrrrs r4softz Frame.softs$YY[[   r6)NN)r%r+F)rrr__doc__rr8Optionalrorrrnrr__copy__rr6r4r+r+s00 '+!% 1 1 1  7#1 z# 1  1 1 1 1 f**d*w****    HHHr6ceZdZdZdS)rz?Exception used by the `UndeclaredNameVisitor` to signal a stop.Nrrrrrr6r4rrsIIIIr6rcheZdZdZd dZdejddfdZdejddfdZ dej ddfdZ dS) DependencyFinderVisitorz.A visitor that collects filter and test calls.r%NcRt|_t|_dSr.)rvfilterstestsr's r4rz DependencyFinderVisitor.__init__s#&55 !$ r6r)cn|||j|jdSr.) generic_visitraddrSrs r4 visit_Filterz$DependencyFinderVisitor.visit_Filters4 4    #####r6cn|||j|jdSr.)rrrrSrs r4 visit_Testz"DependencyFinderVisitor.visit_Tests2 4    ty!!!!!r6cdS)zStop visiting at blocks.Nrrs r4 visit_Blockz#DependencyFinderVisitor.visit_Block r6r%N) rrrrrr FilterrTestrBlockrrr6r4rrs88''''$$$$$$$"uz"d""""' '''''''r6rcleZdZdZdejeddfdZdej ddfdZ dej ddfdZ dS) r~zA visitor that checks if a name is accessed without being declared. This is different from the frame visitor as it will not stop at closure frames. r|r%NcTt||_t|_dSr.)rvr|r)r'r|s r4rzUndeclaredNameVisitor.__init__sZZ &)eer6r)c|jdkrM|j|jvr?|j|j|j|jkrt dS|j|jdS)Nload)ctxrSr|rrrdiscardrs r4 visit_Namez UndeclaredNameVisitor.visit_Namesv 8v  $)tz"9"9 O   * * *$*,,!mm#-, J  ty ) ) ) ) )r6cdS)zStop visiting a blocks.Nrrs r4rz!UndeclaredNameVisitor.visit_Block!rr6) rrrrr8Iterablersrr Namerrrrr6r4r~r~s ,ajo,$,,,,*uz*d****& &&&&&&&r6r~ceZdZdZdS) CompilerExitzRaised if the compiler encountered a situation where it just doesn't make sense to further process the code. Any block that raises such an exception is not further processed. Nrrr6r4rr%sr6rc eZdZU ddddejedejedejejd ed ed dfd Ze d efd Z dede d dfdZ d efdZ ded dfdZ ddeded dfdZddZdde d dfdZddedejejd dfdZded dfdZ ddededejejd dfdZd ejejded dfd!Zd"ed dfd#Z dd"edejejd%e d dfd&Zddejejd%e d dfd'Z ddejejejej fded(ejej!eej"fd dfd)Z#d ejejd dfd*Z$ded dfd+Z%dded,ed dfd-Z&dd0ed1ed efd2Z'ded efd3Z(dejej)ej*fded ej+ee,ffd4Z-d5e,ded dfd6Z.dejd efd7Z/ded efd8Z0dd9Z1ded dfd:Z2dd;Z3dZ5dd?Z6d efd@Z7d efdAZ8ded efdBZ9ddej?ded dfdGZ@dejAded dfdHZBdejCded dfdIZDdejejEejFfded dfdJZGdejEded dfdKZHdejFded dfdLZIdejJded dfdMZKdejLded dfdNZMdej)ded dfdOZNdej*ded dfdPZOdejPded dfdQZQdejRded dfdRZSdejTded dfdSZUGdTdUejVZWeXdVej"d ej"fdWZYdZZejeWe[dX<d eWfdYZ\dZejej"d efd[Z]dej^ded\eWd efd]Z_dej^ded\eWd dfd^Z`dej^ded\eWd dfd_Zadejbded dfd`Zcdejdded dfdaZedejfded dfdbZgdejhded dfdcZidejjded dfddZkdejlded dfdeZmdejnded dfdfZodej+ded dfdgZpdejqded dfdhZrdejsded dfdiZteudjZveudkZweudlZxeudmZyeudnZzeudoZ{eudpZ|eudqZ}eudrZ~edjZedkZedsZedejded dfdtZedejded dfduZdejded dfdvZedejded dfdwZedejded dfdxZdejded dfdyZedejejej fdedzed ejdfd{Zedejded dfd|Zedej ded dfd}Zedejded dfd~Ze ddejdeded dfdZdejded dfdZdejded dfdZdejded dfdZdejded dfdZdejded dfdZdejded dfdZdejded dfdZdejded dfdZdejded dfdZdejded dfdZdejded dfdZdejded dfdZdejded dfdZdejded dfdZdejded dfdZdS)r(NFTrCrrSrTrUrVrWr%c|t}||_||_||_||_d|_||_d|_|rt||_i|_ i|_ d|_ d|_ d|_ i|_i|_g|_d|_d|_d|_d|_d|_d|_g|_g|_dg|_dS)NFrr Tcontext)rrCrSrTrUcreated_block_contextrVr/rimport_aliasesblocksextends_so_farhas_known_extends code_linenorr debug_info_write_debug_info _new_lines _last_line _first_write_last_identifier _indentation _assign_stack_param_def_block_context_reference_stack)r'rCrSrTrUrVrWs r4rzCodeGenerator.__init__-s >ZZF&    %*"$04  4&{33DN1313   "'(* )+ 6826!!"2457*3 %%%r6c|jduSr.)r/rs r4rWzCodeGenerator.optimizedvs~T))r6msglinenoz te.NoReturnc:t|||j|j)z*Fail with a :exc:`TemplateAssertionError`.)r rSrT)r'rrs r4failzCodeGenerator.fail|s$S&$)T]KKKr6c6|xjdz c_d|jS)zGet a new unique identifier.r t_)rrs r4temporary_identifierz"CodeGenerator.temporary_identifiers' "+D)+++r6r*cr||_||jddS)z7Enable buffering for the frame from that point onwards.z = []N)rr writeliner'r*s r4rzCodeGenerator.buffers80022  %,---.....r6force_unescapedc&|s|jjr|d||d|jd||d||d|jd|dS|jjr |d|jddS|d|jddS)z(Return the buffer contents of the frame.zif context.eval_ctx.autoescape:zreturn Markup(concat())else:zreturn concat(rBN)r0r1rindentroutdent autoescape)r'r*rs r4return_buffer_contentsz$CodeGenerator.return_buffer_contentss ~& @AAA Gu|GGGHHH w''' ? ???@@@ * Gu|GGGHHH 7 77788888r6c&|xjdz c_dS)zIndent by one.r Nrrs r4rzCodeGenerator.indents Qr6r stepc&|xj|zc_dS)zOutdent by step.Nr)r'rs r4rzCodeGenerator.outdents T!r6r)c|j|d|dS||jd|dS)z%Yield or write into the frame buffer.Nyield .append()rr)r'r*r)s r4 start_writezCodeGenerator.start_writesI <  NN8T * * * * * NNel444d ; ; ; ; ;r6cB|j|ddSdS)z1End the writing process started by `start_write`.NrB)rrFrs r4 end_writezCodeGenerator.end_writes% < # JJsOOOOO $ #r6sc|||||||dS)z4Simple shortcut for start_write + write + end_write.N)rrFr)r'rr*r)s r4 simple_writezCodeGenerator.simple_writesA %%% 1  ur6r c |d|D]}|||dS#t$rYdSwxYw)zVisit a list of nodes as block in a frame. If the current frame is no buffer a dummy ``if 0: yield None`` is written automatically. passN)rr2r)r'r r*r)s r4 blockvisitzCodeGenerator.blockvisitsk  NN6 " " " ( ( 4'''' ( (    DD s04 AAxc|jr|jsk|jd|jz|xj|jz c_|j-|j|j|jfd|_d|_|jd|jzd|_|j|dS)z&Write a string into the output stream. NFz r) rrrUrFrrrappendr)r'r s r4rFzCodeGenerator.writes ? $ 2 !!$"8999  DO3  )5O**D,BDDT+UVVV-1D* %D  K  ft'88 9 9 9DO !r6rextrac\|||||dS)z!Combination of newline and write.N)newlinerF)r'r r)r s r4rzCodeGenerator.writelines+ T5!!! 1 r6ct|jd|z|_|*|j|jkr|j|_|j|_dSdSdS)z/Add one or more newlines before the next write.r N)maxrrrr)r'r)r s r4rzCodeGenerator.newlinesRdoq5y99   t > >%)[D ""kDOOO   > >r6 extra_kwargsctdtd|jD|pdD}|jD]-}|d|||.|sl|jD]-}|d|||.|5|D] \}}|d|d|!|jr0|d||j||r%|j|dn|d |jD]O}||j d ||j ||dP|5|D] \}}||d |d!|jG|d ||j||d dS|d dS|j2|d||j|dSdS)a+Writes a function call to the stream for the current node. A leading comma is added automatically. The extra keyword arguments may not include python keywords otherwise a syntax error could occur. The extra keyword arguments should be given as python dict. c3dK|]+}ttjt|V,dSr.)is_python_keywordr8r:rs)rerjs r4rgz*CodeGenerator.signature..sH   afS!nn - -      r6c3$K|] }|jV dSr.)keyrer s r4rgz*CodeGenerator.signature..s$77aAE777777r6rr?N=z, *z , **dict({z, **{: z}, **rB}z, **) anyrr,argsrFr2rzdyn_args dyn_kwargsrr`) r'r)r*rkwarg_workaroundargkwargrr`s r4 signaturezCodeGenerator.signatures  774;7779KLL      9 # #C JJt    JJsE " " " " 3 ) ) 4    5%(((('"."4"4"6"633JCJJ1C11%112222 = - JJu    JJt}e , , ,  /* <(((( 7### ! ! ei---... 5;... 4    '"."4"4"6"666JCJJ#4454445555* 7### 4?E222 3 3 _ ( JJv    JJt . . . . .) (r6c >t}|D]}|||j|jdf|j|jdffD]T\}}}t |D]<}||vr|||<|d||||d|d|d||d||d|d ||d ||d |d d d|d||>Vd S)aFind all filter and test names used in the template and assign them to variables in the compiled namespace. Checking that the names are registered with the environment is done when compiling the Filter and Test nodes. If the node is in an If or CondExpr node, the check is done at runtime instead. .. versionchanged:: 3.0 Filters and tests in If and CondExpr nodes are checked at runtime instead of compile time. rrtry:z = environment.[]zexcept KeyError:z @internalcodedef z (*unused):zraise TemplateRuntimeError("No N named z found.")) rr2rrsortedrrrr)r'r rJr)id_mapr| dependencyrSs r4pull_dependencieszCodeGenerator.pull_dependenciess*++  D MM$    *.,)S J M V *    %FE: u   v%%#'#<#<#>#>F4Lv&&& &,UUzUUDUUUVVV 1222 ///>fTl>>>??? 0j"o00"000  )    r6c g}|jjD]\}\}}|tkr|tkr1||d|d|dP|tkr||d|v|tkr| |td|r-|d |ddSdS)N = r@rBzunknown load instruction = missing) rloadsrzrrrget_resolve_funcrrr NotImplementedErrorjoin)r'r*undefstargetactionparams r4 enter_framezCodeGenerator.enter_frameEs$',}':'@'@'B'B F F #FOVU++++++&QQT-B-B-D-DQQuQQQRRRR>))&44U445555--- f%%%%)*DEEE  > NNejj00<<< = = = = = > >r6with_python_scopec|sUg}|jjD]}|||r/|d|ddSdSdS)Nr0r1)rr2r rr5)r'r*r;r6r7s r4 leave_framezCodeGenerator.leave_frameUs  BF-- & & f%%%% B%**V"4"4@@@AAAAA  B B B Br6async async_value sync_valuec"|jjr|n|Sr.)rCis_async)r'r@rAs r4 choose_asynczCodeGenerator.choose_async]s".7G{{ZGr6c4|d|S)Nr()rD)r'rSs r4funczCodeGenerator.func`s"##%%114111r6c P|}|j|t|}d}t }g}t |jD]g\}}|jdkr|}|jdvr||j| |j |jht|j d} d| vr|O |j |t|jz nX#t$r|d|jYn1wxYw| |jdd|_d| vr8d|vr4| |jdd|_d| vr8d|vr4| |jdd|_d |_|j|||d d d |d ||||||||t |jD]\}}|j |j} |d| d| |j |t|jz } || d|| |n8#t$r+|| d|jd|jdYnwxYw|| | |!|"|j ||#|d|$|d| ||fS)z/Dump the function def of a macro or call block.Ncaller)r,varargs)rHr,rIzhWhen defining macros or call blocks the special "caller" argument must be omitted or be given a default.Tr,rIFmacror@r?):if is missing:r0z = undefined("parameter z was not provided", name=rB)rr;)%rr analyze_noderrv enumeraterrSrr refrbodydefaultslen IndexErrorrrdeclare_parameterrrrrrrFr5rrr:push_parameter_definitionsr2mark_parameter_storedrpop_parameter_definitionsrrr=) r'r)r* macro_refexplicit_callerskip_special_paramsridxr!rrQdefaults r4 macro_bodyzCodeGenerator.macro_bodycsM  ""4(((TNN !ee!$),, 5 5HCx8##"%x000#''111 KK ))#(33 4 4 4 4$TY0OPP z ! !*M/C NN"BCCC!II1  EM;;HEEFFF(,I % z ! !h6I&I&I KK 77AA B B B(,I %  " "y8K'K'K KK 77 BB C C C)-I &&+" ""4((( $))G,,BBtyyBBBDIII  E  ''...!$),,  HC-##CH--C NN2222 3 3 3 KKMMM +-c$)nn(<=#{{{+++ 7E****   ++CH++ X+++   & &s + + + LLNNNN &&(((  5))) ##E4#@@@ $777 is$("D %D32D3?"M2NNrZc 0dd|jjD}t|jdd}t |jjdkr|dz }|d|d|d |jd|jd|jd dS) zK|]}t|jVdSr.)reprrSrs r4rgz*CodeGenerator.macro_def..s*HHqd16llHHHHHHr6rSNr ,zMacro(environment, macro, z, (z), z, context.eval_ctx.autoescape)) r5r)rgetattrrTrFrrr)r'rZr* arg_tuplerSs r4 macro_defzCodeGenerator.macro_defsIIHHIN4GHHHHH y~vt44 y~" # #q ( (  I  L L LI L L) L L/8/I L L) L L L     r6c@d|j}|j |d|j}|S)z.Return a human readable position for the node.zline N in )rrS)r'r)rs r4positionzCodeGenerator.positions3 "T[ " " 9 ))DI))B r6cdd|jD}d|dS)Nr?c3*K|]\}}|d|VdSrNr)rerSr7s r4rgz3CodeGenerator.dump_local_context..sH  f ! ! ! !      r6{r)r5r dump_storesrz)r'r*items_kvs r4dump_local_contextz CodeGenerator.dump_local_contexts^99  % 9 9 ; ; A A C C     !H    r6c|d|d|d|ddS)zWrites a common preamble that is used by root and block functions. Primarily this sets up common local helpers and enforces a generator through a dead branch. z$resolve = context.resolve_or_missingz!undefined = environment.undefinedzcond_expr_undefined = Undefinedzif 0: yield NoneNrrs r4 write_commonszCodeGenerator.write_commonssX =>>> :;;; 8999 )*****r6ch|j|jdS)aQPushes all parameter targets from the given frame into a local stack that permits tracking of yet to be assigned parameters. In particular this enables the optimization from `visit_Name` to skip undefined expressions for parameters in macros as macros can reference otherwise unbound parameters. N)rr rdump_param_targetsrs r4rWz(CodeGenerator.push_parameter_definitionss/ $$U]%E%E%G%GHHHHHr6c8|jdS)z+Pops the current parameter definitions set.N)rpoprs r4rYz'CodeGenerator.pop_parameter_definitionss !!#####r6r7cX|jr"|jd|dSdS)zMarks a parameter in the current parameter definitions as stored. This will skip the enforced undefined checks. r)N)rrr'r7s r4rXz#CodeGenerator.mark_parameter_storeds;   6  !" % - -f 5 5 5 5 5 6 6r6c:|j|dSr.)rr rys r4push_context_referencez$CodeGenerator.push_context_references %,,V44444r6c8|jdSr.)rrwrs r4pop_context_referencez#CodeGenerator.pop_context_references %))+++++r6c|jdS)Nr)rrs r4get_context_refzCodeGenerator.get_context_refs,R00r6c6|jd}|dkrdS|dS)Nr)rresolvez.resolverrys r4r3zCodeGenerator.get_resolve_funcs..r2 Y  9""""r6c\|d||dS)Nz .derived(rB)rrprs r4derive_contextzCodeGenerator.derive_contexts3&&((TT43J3J53Q3QTTTTr6c2|jsdS||jdvS)z4Checks if a given target is an undeclared parameter.Fr))rrys r4parameter_is_undeclaredz%CodeGenerator.parameter_is_undeclareds%$ 5.r222r6cR|jtdS)z+Pushes a new layer for assignment tracking.N)rr rvrs r4push_assign_trackingz"CodeGenerator.push_assign_trackings# !!#%%(((((r6cz|j}|js|js|jr|sdSd|D}t |dkrt t|}|j |}|jr| d|d|dS|jr| d|d|dS| d|d|n|jr| dn2|jr| d n| d t|D]P\}}|r| d |j |}| |d |Q| d |js|js{|r{t |dkr!| d|dddSd tt|}| d|ddSdSdSdS)zoPops the topmost level for assignment tracking and updates the context variables if necessary. Nc.g|]}|dddk|S)Nr _rrs r4 z5CodeGenerator.pop_assign_tracking..s%888a1RaR5C<<<<>T ##D-##D))C >T>>>>???  ?d??#??@@@ NN<4<> M MMMNNNNN  O O O O O Or6c  | Jdt|j|j}ddlm}m}|jjrt||z}nt|}|d|dd |z|j rdnd}| tj du}|tjD]C} | j|jvr$|d | jd | j| |j| j<D|tjD]} | j|jvr|| j} |x|j| <} d | vr8| d d\} }|d | d |d| q|d| d| |d|j||dd|dd||t7|}dt9|jdvr2|jd}||d|j |dx|_!|_"|o|j# |_$|r|d|%||&|j|'|j||(|d|)|r|j#s)||d||jjs|dnR|d||d|)|)d|j# z|j*D]\}} ||d|zd|d| d||t7|}d|_+t9| jd }d|vr2|jd}||dd!|vr8|jd!}||d"|d#|d$|j | ||_,|d%|%||&| j|'| j||(|d|)d d&|jD}|d'|d(dd) d*|j-D}|d+|dS),Nzno root frame allowedr )exportedasync_exportedz%from __future__ import generator_stopzfrom jinja2.runtime import r?r?z, environment=environmentzblock z defined twice.zfrom z import z as zimport zname = rootz(context, missing=missingrK)r r'rz = TemplateReference(context)Tzparent_template = NonerNif parent_template is not None:z4yield from parent_template.root_render_func(context)z=async for event in parent_template.root_render_func(context):z yield eventblock_)r'superrz = context.super(z, block_rBz_block_vars = {}c3$K|] }|d|V dS)z: block_Nrrs r4rgz/CodeGenerator.visit_Template..s0!K!K!Q"5"5!"5"5!K!K!K!K!K!Kr6z blocks = {r&c3*K|]\}}|d|VdS)rNrris r4rgz/CodeGenerator.visit_Template..s0GGtq!1 q GGGGGGr6z debug_info = ).rrCrSruntimerrrCr+rr5rVfindr Extendsfind_allrrrr ImportedName importnamerrrsplitrFrrsr+rrRrrVrOrrrrr:r.rr=rrzrrr)r'r)r*r0rrexported_namesenvenv have_extendsrimport_impaliasmoduleobjrQrSrr blocks_kv_str debug_kv_strs r4visit_TemplatezCodeGenerator.visit_Template9s}}5}}}t/;;55555555   $ .#H~$=>>NN#H--N >??? 4tyy7P7PPQQQG,Gyy//t; ]]5;// , ,EzT[(( ?5:???NNN&+DK # #}}U%788 ? ?G!)<<<(373L3L3N3NN#C(5#::"%**S!"4"4KFCNN#K6#K#K3#K#KE#K#KLLLLNN#=S#=#=e#=#=>>> .../// yy  E E6 E E EQ      h _TY :: : :-11&99C NNc@@@ A A A ""4(((+//%1%P$:P6P"  5 NN3 4 4 4  ty)))  5))) $777   ;) B @AAA KKMMM#, UVVVVS }---  LL$"889 : : : ;,,..  KD% NN99X_--RRRRR    KKMMM     //K&*K #(5FGGJ##!);;FCC#DDDEEE*$$!);;GDD#OOOOOOOPPP   , ,U 3 3 3 $K  NN- . . .   [ ) ) )  " "5: . . . OOEJ 4 4 4   [D  A A A LLNNNN !K!Kt{!K!K!KKK  6]666a@@@xxGGtGGGGG  7|7788888r6cVd}|jrB|jrdS|jdkr.|d||dz }|jr||}n|}|jrf|d|j d|||d|j d|| |j j s*|j #|d |j d |d |nt||d |j d |d |||d|| | |dS)z.Call a block and register it for the template.rNif parent_template is None:r zif len(context.blocks[z]) <= 1:z+raise TemplateRuntimeError("Required block z not found")zyield from context.blocks[z][0](rBzfor event in context.blocks[rKevent)rrrrrscopedrrrequiredrSrrCrCrrDr)r'r)r*rrs r4rzCodeGenerator.visit_Blocks > % "Q&&<===   ; -))%00GG**,,G =  NNIDIIII4 P P P KKMMM NNWdiWWW    LLNNN( U\-A NNITYIIwIII4     NN$$&&AA#'9AA5<AAA    KKMMM   gu - - - LLNNN Ur6c|js|d|j|jdkrn|js)|d||d|jrt||d|| |j || d|j d|d||d ||j rd |_|xjd z c_d S) zCalls the extender.z,cannot use extend from a non top-level scoperrz5raise TemplateRuntimeError("extended multiple times")z+parent_template = environment.get_template(r?rBz9for name, parent_block in parent_template.blocks.items():z8context.blocks.setdefault(name, []).append(parent_block)Tr N)rrrrrrrrrr2templaterFrSrr'r)r*s r4 visit_ExtendszCodeGenerator.visit_ExtendssS~ S IIDdk R R R   " " ) @AAA NNR S S S% "nn$  DdKKK 4=%((( & &&&''' RSSS  QRRR  ? *%)D " q r6c*|jr)|d|d}t|jt jrKt|jjtrd}nVt|jjttfrd}n-t|jt j t j frd}|d|d|| |j||d|jd|jr||d ||d ||d |d }|jrA||d ||dn9|jjr|dn|dd}|s>||d|||jr|dSdS)zHandles includes.r%get_or_select_template get_templateselect_templateztemplate = environment.r@r?rBzexcept TemplateNotFound:rrFzUfor event in template.root_render_func(template.new_context(context.get_all(), True, z)):zGfor event in (await template._get_default_module_async())._body_stream:z6yield from template._get_default_module()._body_streamTrN)ignore_missingrrrYrr Constr`rsrtruTupleListr2rFrSr with_contextrDrprCrCr)r'r)r* func_nameskip_event_yields r4 visit_IncludezCodeGenerator.visit_Includes    NN6 " " " KKMMM, dmU[ 1 1 *$--s33 .* DM/%?? .-   UZ'@ A A *)I ====tDDD 4=%((( & &&&'''    LLNNN NN5 6 6 6 KKMMM NN6 " " " LLNNN NN7 # # # KKMMM    $ NN$$&&88++E22888       & $ NN!     NNS T T T#   KKMMM   gu - - - LLNNN    LLNNNNN  r6c||dd||j||d|jd|jrHd|d}||d||ddS|d |dd dS) Nawait zenvironment.get_template(r?z). make_module_asyncz(context.get_all(), True, rB_get_default_modulez (context))rFrDr2rrSrrp)r'r)r*f_names r4_import_commonzCodeGenerator._import_common9s d''11LLLMMM 4=%((( ' '''(((   U@4#4#4X#>#>@@F JJVVT5L5LU5S5SVVV      JJST->->x-H-HSSS T T T T Tr6cn||j|jd||jr|d|jd||||jr:|jds"|d|jddSdSdS)zVisit regular imports.r0rrrcontext.exported_vars.discard(rBN)rrrQr7rrFr startswithrs r4 visit_ImportzCodeGenerator.visit_ImportHs %-++DK88===tDDD > < JJ:t{::: ; ; ; D%((( > N$+"8"8"="= N NNLDKLLL M M M M M N N N Nr6c 0|||d||g}g}|jD]C}t |t r|\}}n|}|j|d|d|dj|d| d| |d|}|j|d|d |d | j r?| ||d s| |E|rt|d kr<|d }|d|dj|n:dfd|D}|d|d|rwt|d kr!|d|d d dSdt#t$|} |d| ddSdS)zVisit named imports.zincluded_template = z = getattr(included_template, z , missing)rLrMz9the template {included_template.__name__!r} (imported on z%) does not export the requested name z = undefined(fz, name=rBrr rrrr?c3VK|]#}|dj|V$dSrl)rrQ)rerSr*s r4rgz1CodeGenerator.visit_FromImport..xsR%%?Ct::!2!24!8!8::%%%%%%r6rrrz)context.exported_vars.difference_update((rN)rrFrr|rYrtrrrQrrirrr rrTr5rrb) r'r)r* var_namesdiscarded_namesrSrmessagenames_kvrs ` r4visit_FromImportzCodeGenerator.visit_FromImportSs T )*** D%((( J 2 2D$&& " ee NN=$$U++BB/3BBB    NNG!2!25!9!9GGG H H H KKMMM@!%t!4!4@@7;@@  NN=$$U++VV7VVTVVV    LLNNN~ 2  ''''',,2#**5111  G9~~"" |TtTT5=;L;LT;R;RTTUUUU99%%%%GP%%%EEEEFFF  ?##q((WPQ@RWWWXXXXX IIc$&@&@AA M MMM   r6c|}d|_|}|}|jp[dt|ddvp5t d|tjD}d}|r|j d}|j |d|j r|j |d |j r|}|j |d |||d |j |||||d d ||j||d||dd|d||d|j ||j ||d||d||j||d||d|jra||dd|||||j|_|r||d|tjD]3} | jdkr&| jdkr|d| j4|j r,|} || d||d d |||j||r0|d|d|ddn|d|j r||d|jr|dna|jj r|s|d ||j!||jj r|s|d!|j r|d!|jr|d"n||rd#nd||||d$|"|j#||j r|| d%||||jo|j |j r|d| d||||"|j |||||jr|$|||%||||d&d'|jj r|d ||j!||jj r|d!|d(|&||j'r,|j'd)(|j j)dSdS)*NTloop)rR)only)rc3$K|] }|jV dSr.)r)rers r4rgz*CodeGenerator.visit_For..s$HHE5<HHHHHHr6rR) for_branchelsetestz(fiter):z async for zfor rhzauto_aiter(fiter)fiter:rLrrNz%(reciter, loop_render_func, depth=0):r1storez8Can't assign to special loop variable in for-loop targetz = 1r?Asyncz LoopContext(r@reciterz auto_aiter(rBz&, undefined, loop_render_func, depth):z , undefined):z_loop_vars = {}z = 0rzloop(z, loop)r))*rr recursiveriter_child_nodesrrr rrrVrOelse_rrrrFrr:rDr2r7rFrr=rrrrSrrrCrCrrrRrrrrdifference_updatestores) r'r)r*r test_frame else_frame extended_looploop_refloop_filter_funcrSiteration_indicators r4 visit_ForzCodeGenerator.visit_Fors[[]] $ [[]] [[]] N It44)4DDiPPQ IHHT]]5;-G-GHHHHH   D!);;FCCH'''@@@ : E   + +DV + D D D 9 A#88::    + +DV + D D D NNdii(899CCCTY O O O KKMMM   Z ( ( ( NN4,,\6BB C C C JJt{J / / / JJv    JJt(() 2 NN99V$$KKKT    KKMMM KK # # #!+ 1J   4 NNh222 3 3 3MM%*--  Dx7""tyF':': NK : 9"&";";"="=  NN1777 8 8 8 t((v>>EEE 4; +++   JJRHRR$*;*;G*D*DRRR S S S S JJv    9 / JJ*--- . . . > JJy ! ! ! !( * * =))) JJty% ( ( ((   3 9  JJsOOO > B JJ? @ @ @ @ JJ-@S A A A  $$$ ()))  :... : 9 NN1777 8 8 8   $.*K^     :  NN7!4777 8 8 8 KKMMM   Z ( ( ( OODJ 3 3 3   Z ( ( ( LLNNN > "  ' ' 3 3 3 LLNNN   UD ) ) ) JJ$++H55<<< = = =( * =))) JJty% ( ( ((  3 JJy ! ! ! NN5 ! ! !   P  r " 4 4Z5G5N O O O O O P Pr6c(|}|d|||j||d|||j|||j D]}|d|||j||d|||j|||j rZ|d|||j ||dSdS)NrLrzelif r) rrr2rrFrrrRrelif_r)r'r)r*if_framers r4visit_IfzCodeGenerator.visit_IfsN::<< ud### 49h''' 3   8,,, Z  E NN7E * * * JJuz8 , , , JJsOOO KKMMM OOEJ 1 1 1 LLNNNN :  NN7 # # # KKMMM OODJ 1 1 1 LLNNNNN   r6c|||\}}||jrV|jds|d|jd|d|jd||j|jd| ||dS)NrrrBrrr0) r_rrrSrrFrrrQrf)r'r)r* macro_framerZs r4 visit_MacrozCodeGenerator.visit_Macro%s!%u!=!= Y  > >9'',, H F FFFGGG NN<49<<< = = = em'' 22777888 y+.....r6c|||\}}|d||||||||j|d||dS)Nz caller = T)forward_caller)r_rrfr visit_Callcallr)r'r)r* call_framerZs r4visit_CallBlockzCodeGenerator.visit_CallBlock/s $e < < I {### y*--- %%%  5>>> ur6c|}|j|||||||j||||||j || || |dSr.) rrrOr:rrrRrrfilterrr=)r'r)r* filter_frames r4visit_FilterBlockzCodeGenerator.visit_FilterBlock7s{{}} ))$/// &&& L!!!  <000 %%% $+|444 u &&&&&r6c|}|j|||t |j|jD]Z\}}||||| d|||[| |j || |dSNr0) rrrOr:ziptargetsvaluesrr2rFrrRr=)r'r)r* with_framer7exprs r4 visit_WithzCodeGenerator.visit_WithBs[[]] ''--- $$$ dk:: $ $LFD LLNNN JJvz * * * JJu    JJtU # # # #  :... $$$$$r6cf||||j|dSr.)rr2r)rs r4visit_ExprStmtzCodeGenerator.visit_ExprStmtNs0 T 49e$$$$$r6cjeZdZUejejdefed<ejeed<dS)CodeGenerator._FinalizeInfo.constsrcN)rrrr8rCallablers__annotations__rr6r4 _FinalizeInforRsBz!*S#X.//// Z_r6rr`c t|S)zThe default finalize function if the environment isn't configured with one. Or, if the environment has one, this is called on that function's output for constants. )rsr{s r4_default_finalizezCodeGenerator._default_finalizeVs 5zzr6 _finalizecjjSjx}d}jjrd}jjtjdtjdtjdit j}d}| dtj dtj ffd }n-||d }|dkr dtj dtj ffd } ||_jS) aBuild the finalize function to be used on constants and at runtime. Cached so it's only created once for all output nodes. Returns a ``namedtuple`` with the following attributes: ``const`` A function to finalize constant data at compile time. ``src`` Source code to output around nodes to be evaluated at runtime. Nzenvironment.finalize(rcontext.eval_ctxrCr`r%c,|Sr.r)r`r^ env_finalizes r4finalizez.CodeGenerator._make_finalize..finalizes"7<<#6#6777r6r?c8j|Sr.)rC)r`r^rr's r4rz.CodeGenerator._make_finalize..finalizes"&w||D4De'L'LMMMr6) rrrCrrr eval_contextgetfrom_objr8r9r)r'rrpass_argr^rs` @@r4_make_finalizezCodeGenerator._make_finalize`sX > %> !"337   $ N)C+4L )%'9$mc!,// H8AE8ae88888888*h***},,NN!%NNNNNNNN++Hc::~r6groupc:tt|S)zGiven a group of constant values converted from ``Output`` child nodes, produce a string to write to the template module source. )rbr)r'r&s r4_output_const_reprz CodeGenerator._output_const_reprs F5MM"""r6rc||j}|jjrt|}t |t jrt|S||S)aCTry to optimize a child of an ``Output`` node by trying to convert it to constant, finalized data at compile time. If :exc:`Impossible` is raised, the node is not constant and will be evaluated at runtime. Any other exception will also be evaluated at runtime for easier debugging. ) as_constr0rrrYr TemplateDatarsr)r'r)r*rrs r4_output_child_to_constz$CodeGenerator._output_child_to_constsd en-- > $ "5MME dE. / / u:: ~~e$$$r6c|jjr|dn7|jjr|dn|d|j||jdSdS)zXOutput extra source code before visiting a child of an ``Output`` node. z1(escape if context.eval_ctx.autoescape else str)(zescape(zstr(N)r0r1rFrrr'r)r*rs r4_output_child_prezCodeGenerator._output_child_pres > "  JJJ K K K K ^ &  JJy ! ! ! ! JJv    < # JJx| $ $ $ $ $ $ #r6cl|d|j|ddSdS)zWOutput extra source code after visiting a child of an ``Output`` node. rBN)rFrr.s r4_output_child_postz CodeGenerator._output_child_posts6 3 < # JJsOOOOO $ #r6c|jr2|jrdS|d||}g}|jD]} |js-t|t jst j | |||}n1#t j tf$r| |Y|wxYw|r7t|dtr|d || |g|jbt|dkr||jdn||jd||D]}t|trN||}|j|d|zL||dze|j|d|n||||||||||||||j|d|j>||t|dkrdnd |jr|dSdS) Nrr)r rz .extend((rrcrBr)rrrrr%r rrYr+ Impossibler, Exceptionr rurrTr(rr/r2r1rFr) r'r)r*rrRchildritemvals r4 visit_OutputzCodeGenerator.visit_Outputs  % %  NN8 9 9 9 KKMMM&&((;= Z % %E N- "%);<< - *,,,33E5(KK$i0    E"""   % 48T22 %R&&&& UG$$$$ < #4yyA~~%,8889999%,999::: KKMMM $ $D$%% $--d33<'NN8c>2222NN39----<'NN8T2222LL&&&&&tUH=== 4'''''eX>>><+JJsOOO < # LLNNN NN#d))q..33d ; ; ;  %  LLNNNNN  sA B&&+CCc|||||j||d||j|||dSr)rrr2r7rFr)rrs r4 visit_AssignzCodeGenerator.visit_Assigns~ !!### T 4;&&& 5 49e$$$   '''''r6c||}d|_|j|||||||j|| || |j || d|j ||j |n| d|jd| d||||dS)NFz9 = (Markup if context.eval_ctx.autoescape else identity)(concat(rB)rrrrrOr:rrrRrr2r7rFrrrr=)r'r)r*rs r4visit_AssignBlockzCodeGenerator.visit_AssignBlocks: !!###kkmm ,1 (((... %%% K     ;/// T 4;&&& NOOO ; "   dk; 7 7 7 7 JJ6!3666 7 7 7 3   ''' %%%%%r6c |jdkrA|js|js|jr,|jr%|jd|j|j|j}|jdkrh|j |}|&|dtkr| |r&| d|jd|d|ddS| |dS) Nrr)rrz(undefined(name=z) if z is missing else rB) rrrrrrrSrrQ find_loadrrrF)r'r)r*rQrs r4rzCodeGenerator.visit_Name6s 8w   N #. 272C ! 6"2&**49555m ** 8v  =**3//D G11144S992 UtyUUUUsUUU 3r6c0|j|j}|d|d||d|||d|jddS)Nzif not isinstance(z , Namespace):zMraise TemplateRuntimeError("cannot assign attribute on non-namespace object")r&r')rrQrSrrrattr)r'r)r*rQs r4 visit_NSRefzCodeGenerator.visit_NSRefOsm ** >C>>>???   B     #.. .../////r6c||j}t|tr$|t |dS|t |dSr.)r*r0rYrprFrsrb)r'r)r*r7s r4 visit_ConstzCodeGenerator.visit_Const]scmmEN++ c5 ! ! " JJs3xx JJtCyy ! ! ! ! !r6c |t||jdS#tj$r"|d|jdYdSwxYwNz6(Markup if context.eval_ctx.autoescape else identity)(rB)rFrbr*r0r r3datars r4visit_TemplateDataz CodeGenerator.visit_TemplateDatads  JJtDMM%.99:: ; ; ; ; ;    JJWWWW       s:>-A/.A/c|dd}t|jD]2\}}|r|d|||3||dkrdnddS)Nr@r)r?rz,)rBrFrPrzr2r'r)r*r]r6s r4 visit_TuplezCodeGenerator.visit_Tuplels 3"4:.. $ $IC ! 4   JJtU # # # # 3!8844-----r6c|dt|jD]2\}}|r|d|||3|ddS)Nr&r?r'rJrKs r4 visit_ListzCodeGenerator.visit_Listusr 3"4:.. $ $IC ! 4   JJtU # # # # 3r6cR|dt|jD]g\}}|r|d||j||d||j|h|ddS)Nrmr?rr)rFrPrzr2rr`rKs r4 visit_DictzCodeGenerator.visit_Dict}s 3"4:.. * *IC ! 4   JJtx ' ' ' JJt    JJtz5 ) ) ) ) 3r6+-*/z//z**%andorznot c |jjrd}n|jjrd}nd}||d|jD]-}||||d.|ddS)Nz8(markup_join if context.eval_ctx.volatile else str_join) markup_joinstr_joinz((r?r)r0r1rrFr r2)r'r)r*rr!s r4 visit_ConcatzCodeGenerator.visit_Concats > " #RII ^ & #%II"I i###$$$:  C JJsE " " " JJt     4r6c|d||j||jD]}||||ddS)Nr@rB)rFr2r opsrIs r4 visit_ComparezCodeGenerator.visit_Comparesb 3 49e$$$( " "B JJr5 ! ! ! ! 3r6c|dt|jd||j|dS)NrA)rF operatorsr<r2r rs r4 visit_OperandzCodeGenerator.visit_OperandsC ,y),,,--- 49e$$$$$r6c*|jjr|d|d||j||d|jd|jjr|ddSdS)N(await auto_await(zenvironment.getattr(r?rBr)rCrCrFr2r)rArs r4 visit_GetattrzCodeGenerator.visit_Getattrs   $ - JJ+ , , , )*** 49e$$$ & &&&'''   $  JJt       r6czt|jtjrb||j||d||j||ddS|jjr|d|d||j||d||j||d|jjr|ddSdS)Nr&r'rczenvironment.getitem(r?rBr) rYr!r Slicer2r)rFrCrCrs r4 visit_GetitemzCodeGenerator.visit_Getitems dh , , ! JJty% ( ( ( JJsOOO JJtx ' ' ' JJsOOOOO( 1 /000 JJ- . . . JJty% ( ( ( JJt    JJtx ' ' ' JJsOOO( ! 4      ! !r6c*|j||j||d|j||j||j2|d||j|dSdS)Nr)startr2rFstoprrs r4 visit_SlicezCodeGenerator.visit_Slices : ! JJtz5 ) ) ) 3 9 JJty% ( ( ( 9 JJsOOO JJty% ( ( ( ( ( ! r6 is_filterc#\K|jjr|d|rM||j|jd|jj|j}nL||j|jd|jj|j}|4|js-|rdnd}|d|d|jd|j tj dtj d tjd itj |}|||d dV||||d |jjr|d dSdS) Nawait auto_await(r@rrzNo r*rrrrCr?rB)rCrCrFrrSr"rrrrrrr!r#r#)r'r)r*rlrF type_namer$s r4_filter_test_commonz!CodeGenerator._filter_test_commons   $ , JJ* + + +  9 JJ$,ty1444 5 5 5#+// ::DD JJ$*TY/222 3 3 3#)--di88D < 0<$-96I II.write_expr2siz% 4:u--- JJ+MM$''+++     r6r@z if z else rBr)rrFr2expr1r)r'r)r*rvs``` r4visit_CondExprzCodeGenerator.visit_CondExprs          3 4:u%%% 6 49e$$$ 8  3r6rc|jjr|d|jjr|dn|d||j||rddind}|jrddini}|jrddini}|r|j|fi|n|s|r t|fi|}| ||||d|jjr|ddSdS)Nrnzenvironment.call(context, z context.call(rH _loop_vars _block_varsrB) rCrCrFrDr2r)rrrryr#)r'r)r*rr loop_kwargs block_kwargss r4rzCodeGenerator.visit_Call0sN   $ , JJ* + + +   % ( JJ3 4 4 4 4 JJ ' ' ' 49e$$$/=G(++4 6;6FN|\22B 9>9JR }55PR  = L  < <| < < < <  =L = <<|<""" 4:u%%%%%r6c|d||j||ddS)NzMarkup(rBrFr2r rs r4visit_MarkSafezCodeGenerator.visit_MarkSafeMs= 9 49e$$$ 3r6c|d||j||ddSrFrrs r4visit_MarkSafeIfAutoescapez(CodeGenerator.visit_MarkSafeIfAutoescapeRs@ KLLL 49e$$$ 3r6c@|d|jzdS)Nz environment.rFrSrs r4visit_EnvironmentAttributez(CodeGenerator.visit_EnvironmentAttributeYs# >DI-.....r6cP|d|jd|jdS)Nzenvironment.extensions[z].)rF identifierrSrs r4visit_ExtensionAttributez&CodeGenerator.visit_ExtensionAttribute^s1 MT_MM$)MMNNNNNr6cP||j|jdSr.)rFrrrs r4visit_ImportedNamez CodeGenerator.visit_ImportedNamecs$ 4&t788888r6c:||jdSr.rrs r4visit_InternalNamez CodeGenerator.visit_InternalNamefs 49r6c0|ddS)Nr)rFrs r4visit_ContextReferencez$CodeGenerator.visit_ContextReferenceis 9r6cV|||dSr.)rFrrs r4visit_DerivedContextReferencez+CodeGenerator.visit_DerivedContextReferencens* 4&&u--.....r6c2|d|dS)Ncontinuerrrs r4visit_ContinuezCodeGenerator.visit_Continuess z4(((((r6c2|d|dS)Nbreakrrrs r4 visit_BreakzCodeGenerator.visit_Breakvs w%%%%%r6c|}|j|||||j|||dSr.)rrrOr:rrRr=)r'r)r* scope_frames r4 visit_ScopezCodeGenerator.visit_Scopeysjkkmm ((... %%%  ;/// %%%%%r6c*|}||d||||d||j||||d}|j|| || |j || || dS)Nr0z.vars = T)r)rrrr2rr{rrrOr:rrRr=r})r'r)r*rrs r4visit_OverlayScopez CodeGenerator.visit_OverlayScopes'')) #>>$"5"5e"<"<>>??? #'''((( 4<''' ##C(((kk4k00 ((... %%%  ;/// %%% ""$$$$$r6cD|jD]}|d|jd||j| |j|j}t|j|j|w#tj $rd|j_ YwxYwdS)Nzcontext.eval_ctx.r0T) optionsrrr2r`r*r0setattrr r3r1)r'r)r*keywordr7s r4visit_EvalContextModifierz'CodeGenerator.visit_EvalContextModifiers| : :G NN?w{??? @ @ @ JJw}e , , , :m,,U^<< S9999# / / /*.''' /  : :sA??BBcb|}|j}||d||||jD]}||||j||d|ddS)Nz = context.eval_ctx.save()zcontext.eval_ctx.revert(rB)rr0saverrrRr2revert)r'r)r* old_ctx_name saved_ctxr5s r4visit_ScopedEvalContextModifierz-CodeGenerator.visit_ScopedEvalContextModifiers0022 N''))  ,BBBCCC &&tU333Y % %E JJue $ $ $ $ i((( A,AAABBBBBr6NFTrr)r r.)Nr)r>r?)rrrr8rrsTextIOrnrpropertyrWrorrr+rrrrr NoderrrrrrFrrrCallrrMappingr9r#r.r:r=rDrFrrrrr_rfrirprsrWrYrXr{r}rr3rrrrrZrrrrrIncluderImport FromImportrrrForrIfrrr FilterBlockrWithrExprStmtr NamedTupler staticmethodrrrr%r(r7r,r/r1Outputr8Assignr: AssignBlockr=rrNSRefrBrrDr+rHrLrrNDictrPrM visit_Add visit_Sub visit_Mul visit_Divvisit_FloorDiv visit_Pow visit_Mod visit_Andvisit_OrrR visit_Pos visit_Neg visit_Notr;Concatr[Comparer^OperandraGetattrrdGetitemrgrfrkrIteratorrprrCondExprrxrKeywordrMarkSaferMarkSafeIfAutoescaperEnvironmentAttributerExtensionAttributerrr InternalNamerContextReferencerDerivedContextReferencerContinuerBreakrScoper OverlayScoperEvalContextModifierrScopedEvalContextModifierrrr6r4r(r(,s, (, G4G4"G4joG4*S/ G4  18$ G4  G4G4 G4G4G4G4R*4***X* LLSL]LLLL,c,,,, /E/d//// 5:999-19 9999(""C"""""<<>4>>>> BBB4BDBBBBHHHCHQTHHHH222222Q GEK89Q BGQ  !Q Q Q Q f  8  E  d     UZC!!#!!!! + + + +II$IIII$$$$6C6D66665S5T5555,,,,11111###### UEUcUUUU3c3d3333 )))))O)O4)O)O)O)O\@Du9u9Nu9+,:e+<u9 u9u9u9u9n) )E)d))))V)!%-)!)!$)!)!)!)!V1%-11$1111f UGEL%*::; UDI U  U U U U N Ne N N N N N0U%50e00000dIPeiIPIP$IPIPIPIPVUXe*/ /E/d////EOEd 'e&7 ' '$ ' ' ' ' %uz %% %D % % % %%5>%%%D%%%% 15\,0Iqz-(///. ....`# 15(9#c####%J%',%8E% %%%%*%J%',%8E% %%%% J ', 8E      MMeMMMMM^((e(((((&e&7&&$&&&&0uz%D2 0 0E 0d 0 0 0 0" "E"d""""u'9%D. .E.d....uz%Duz%D C  I C  I C  I C  I [&&N D!!I C  I E""I{4  H 3I 3I 6""I  e    ] %-$]%%-%%$%%%% %-  $   ] !%-!!$!!!]!() )E)d))))'GEL%*45'>C'PT' D '''^'R66e6666]6 )uz)%)D)))])5>%D],EJJ',>B ],&%-&&$&&&& 5>%D .7< /./7</ //// O,O5:O OOOO 9u'99%9D9999u'9%D*38  /1/:?/ //// )5>)%)D))))& &E&d&&&&& &E&d&&&& %u'9 %% %D % % % % :- :6; :  : : : : C3 Crs66%%%%%%$$$$$$222222......&&&&&&******((((((******  ?)""""(((((( AIcCJ/000          2Q 21 2 2 2 2 CAJ'PRV'VW, Z%/7;TAB2$( . *S/jo  Jqx   Z_04"  :ej ! *+*S/ U3Z    &&&&&&&&PPPPPPPPfJJJJJ,JJJ'''''k'''&&&&&&K&&&,9yCyCyCyCyCKyCyCyCyCyCr6