6V=j!dZddlZddlmZddlmZddlmZddl 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 ExprtAnyr)r$r5s` r4 optimizeconstr:-sa . .%*Z .8? .KL5 .  . . . . . . (A & &&r6opr(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   & *+-1A1T+T+T JJB"BBB C C C JJty% ( ( ( JJt    JJtz5 ) ) ) ) JJsOOO JJty% ( ( ( JJy2yyy ! ! ! JJtz5 ) ) ) 3r6)r:r BinExprr+r;rIs` r4 _make_binoprL=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?rA)rBrCintercepted_unopsrEr2r)rHs r4rIz_make_unop..visitorUs   & )+-1A1S+S+S JJAAAA B B B JJty% ( ( ( ( JJsRx JJty% ( ( ( 3r6)r:r UnaryExprr+rKs` r4 _make_unoprQRsR o U_ U t     ]  Nr6FTr)rBrnamefilenamestream 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_classr2rTgetvalue)r)rBrRrSrTrUrV 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.rbrdkres r4rfz has_safe_repr..s;SSTQ=##8 a(8(8SSSSSSr6F)NotImplementedEllipsistypeboolintfloatcomplexrangestrr tuplelistset frozensetalldictitemsr_s r4rcrc}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{rIr)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 ddedejddejeddfdZdd Z 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     r6te.Selfct|j}|j|j|j|_|S)z!Create a copy of the current one.)object__new__ __class____dict__updatercopyr'rvs r4rz Frame.copysG ^^DN + + 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%rF)rrr__doc__rr8Optionalrnrrrmrr__copy__rr6r4r+r+s00 '+!% 1 1 1  7#1 z# 1  1 1 1 1 f**d*w****    HHHr6ceZdZdZdS)r~z?Exception used by the `UndeclaredNameVisitor` to signal a stop.Nrrrrrr6r4r~r~sIIIIr6r~cheZdZdZd dZdejddfdZdejddfdZ dej ddfdZ dS) DependencyFinderVisitorz.A visitor that collects filter and test calls.r%NcRt|_t|_dSr.)rufilterstestsr's r4rz DependencyFinderVisitor.__init__s#&55 !$ r6r)cn|||j|jdSr.) generic_visitraddrRrs r4 visit_Filterz$DependencyFinderVisitor.visit_Filters4 4    #####r6cn|||j|jdSr.)rrrrRrs 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.)rur{r)r'r{s r4rzUndeclaredNameVisitor.__init__sZZ &)eer6r)c|jdkrM|j|jvr?|j|j|j|jkrt dS|j|jdS)Nload)ctxrRr{rrr~discardrs 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) rrrrr8Iterablerrrr 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(NFTrBrrRrSrTrUrVr%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)rrBrRrSrTcreated_block_contextrUr/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'rBrRrSrTrUrVs r4rzCodeGenerator.__init__-s >ZZF&    %*"$04  4&{33DN1313   "'(* )+ 6826!!"2457*3 %%%r6c|jduSr.)r/rs r4rVzCodeGenerator.optimizedvs~T))r6msglinenoz te.NoReturnc:t|||j|j)z*Fail with a :exc:`TemplateAssertionError`.)r rRrS)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(rAN)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`.NrA)rrErs r4 end_writezCodeGenerator.end_writes% < # JJsOOOOO $ #r6sc|||||||dS)z4Simple shortcut for start_write + write + end_write.N)rrEr)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) rrrTrErrrappendr)r'r s r4rEzCodeGenerator.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)newlinerE)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_keywordr8castrr)rdris r4rfz*CodeGenerator.signature..sH   afS!nn - -      r6c3$K|] }|jV dSr.)keyrdr s r4rfz*CodeGenerator.signature..s$77aAE777777r6rr>N=z, *z , **dict({z, **{: z}, **rA}z, **) anyrr,argsrEr2rydyn_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 rIr)id_mapr{ dependencyrRs r4pull_dependencieszCodeGenerator.pull_dependenciess*++  D MM$    \7?I 6   *    %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?rAzunknown load instruction = missing) rloadsryrrrget_resolve_funcrrr NotImplementedErrorjoin)r'r*undefstargetactionparams r4 enter_framezCodeGenerator.enter_frameHs$',}':'@'@'B'B F F #FOVU++++++&QQT-B-B-D-DQQuQQQRRRR>))&44U445555--- f%%%%)*DEEE  > NNejj00<<< = = = = = > >r6with_python_scopec|sUg}|jjD]}|||r/|d|ddSdSdS)Nr1r2)rr3r rr6)r'r*r<r7r8s r4 leave_framezCodeGenerator.leave_frameXs  BF-- & & f%%%% B%**V"4"4@@@AAAAA  B B B Br6async async_value sync_valuec"|jjr|n|Sr.)rBis_async)r'rArBs r4 choose_asynczCodeGenerator.choose_async`s".7G{{ZGr6c4|d|S)Nr))rE)r'rRs r4funczCodeGenerator.funccs"##%%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)rIr,rJzhWhen defining macros or call blocks the special "caller" argument must be omitted or be given a default.Tr,rJFmacror?r>):if is missing:r1z = undefined("parameter z was not provided", name=rA)rr<)%rr analyze_noderru enumeraterrRrr refrbodydefaultslen IndexErrorrrdeclare_parameterrrrrrrGr6rrr;push_parameter_definitionsr2mark_parameter_storedrpop_parameter_definitionsrrr>) r'r)r* macro_refexplicit_callerskip_special_paramsridxr"rrRdefaults r4 macro_bodyzCodeGenerator.macro_bodyfsM  ""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?"M2NNr[c 0dd|jjD}t|jdd}t |jjdkr|dz }|d|d|d |jd|jd|jd dS) zc3>K|]}t|jVdSr.)reprrRrs r4rfz*CodeGenerator.macro_def..s*HHqd16llHHHHHHr6rRNr ,zMacro(environment, macro, z, (z), z, context.eval_ctx.autoescape)) r6r)rgetattrrUrErrr)r'r[r* arg_tuplerRs 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 )rrR)r'r)rs r4positionzCodeGenerator.positions3 "T[ " " 9 ))DI))B r6cdd|jD}d|dS)Nr>c3*K|]\}}|d|VdSrNr)rdrRr8s r4rfz3CodeGenerator.dump_local_context..sH  f ! ! ! !      r6{r)r6r dump_storesry)r'r*items_kvs r4dump_local_contextz CodeGenerator.dump_local_contexts^99  % 9 9 ; ; A A C C     !H    r6c|d|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.undefinedzconcat = environment.concatzcond_expr_undefined = Undefinedzif 0: yield NoneNrrs r4 write_commonszCodeGenerator.write_commonssk =>>> :;;; 4555 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 r4rXz(CodeGenerator.push_parameter_definitionss/ $$U]%E%E%G%GHHHHHr6c8|jdS)z+Pops the current parameter definitions set.N)rpoprs r4rZz'CodeGenerator.pop_parameter_definitionss !!#####r6r8cX|jr"|jd|dSdS)zMarks a parameter in the current parameter definitions as stored. This will skip the enforced undefined checks. r*N)rrr'r8s r4rYz#CodeGenerator.mark_parameter_storeds;   6  !" % - -f 5 5 5 5 5 6 6r6c:|j|dSr.)rr rzs r4push_context_referencez$CodeGenerator.push_context_references %,,V44444r6c8|jdSr.)rrxrs r4pop_context_referencez#CodeGenerator.pop_context_references %))+++++r6c|jdS)Nr*rrs r4get_context_refzCodeGenerator.get_context_refs,R00r6c6|jd}|dkrdS|dS)Nr*rresolvez.resolverrzs r4r4zCodeGenerator.get_resolve_funcs..r2 Y  9""""r6c\|d||dS)Nz .derived(rA)rrqrs r4derive_contextzCodeGenerator.derive_contexts3&&((TT43J3J53Q3QTTTTr6c2|jsdS||jdvS)z4Checks if a given target is an undeclared parameter.Fr*)rrzs r4parameter_is_undeclaredz%CodeGenerator.parameter_is_undeclareds%$ 5.r222r6cR|jtdS)z+Pushes a new layer for assignment tracking.N)rr rurs r4push_assign_trackingz"CodeGenerator.push_assign_tracking s# !!#%%(((((r6c|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 tt|D]P\}}|r| d |j |}| |d |Q| d |js|js|rt |dkr!| d|dddSd tt t|}| 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<<<<r})context.exported_vars.add(rrAzcontext.exported_vars.update((r)rrxrrrrUnextiterrrRrrQr,rEr6maprc)r'r*vars public_namesrRrRr^ names_strs r4pop_assign_trackingz!CodeGenerator.pop_assign_trackings!%%''! $ N    F884888 t99>>T ##D-##D))C >T>>>>???  ?d??#??@@@ NN<4<r@z, environment=environmentzblock z defined twice.zfrom z import z as zimport zname = rootz(context, missing=missingrL)r r'rz = TemplateReference(context)Tzparent_template = NonerOif parent_template is not None:z4yield from parent_template.root_render_func(context)z0agen = parent_template.root_render_func(context)r&zasync for event in agen:z yield eventzfinally: await agen.aclose()block_)r'superrz = context.super(z, block_rAz_block_vars = {}c3$K|] }|d|V dS)z: block_Nrrs r4rfz/CodeGenerator.visit_Template..s0!K!K!Q"5"5!"5"5!K!K!K!K!K!Kr6z blocks = {r&c3*K|]\}}|d|VdS)rNrrhs r4rfz/CodeGenerator.visit_Template..s0GGtq!1 q GGGGGGr6z debug_info = ).rrBrRruntimerrrDr,rr6rUfindr Extendsfind_allrrrr ImportedName importnamerrrsplitrGrrtr+rrSrrWrPrrrrr;r/rr>rryrrr)r'r)r*r0rrexported_namesenvenv have_extendsrimport_impaliasmoduleobjrRrRrr blocks_kv_str debug_kv_strs r4visit_TemplatezCodeGenerator.visit_Template=s}}5}}}t/;;++++++%%%%%%   $ .#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#, ?UVVVVQRRRv&&& 9::: }---  =>>> 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|7788888r6cTd}|jrB|jrdS|jdkr.|d||dz }|jr||}n|}|jrf|d|j d|||d|j d|| |j j s*|j #|d |j d |d |n|d |j d |d |d |||d|||d|| | |d|dd| |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](rAzgen = context.blocks[r&for event in gen:event finally: await gen.aclose() gen.close())rrrrrscopedrrrequiredrRrrBrDrrEr)r'r)r*rrs r4rzCodeGenerator.visit_BlocksJ > % "Q&&<===   ; -))%00GG**,,G =  NNIDIIII4 P P P KKMMM NNWdiWWW    LLNNN( U\-A NNITYIIwIII4     NNO49OOWOOO P P P NN6 " " " KKMMM NN$$&&999    KKMMM   gu - - - LLNNN LLNNN NNTD--.BMRRTT    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>rAz9for name, parent_block in parent_template.blocks.items():z8context.blocks.setdefault(name, []).append(parent_block)Tr N)rrrrrrrrrr2templaterErRrr'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)dd}t|jt jrKt|jjtrd}nVt|jjttfrd}n-t|jt j t j frd}d|d| |jdjd|jrd d d dfd }|jrʉdddd|dddnAjjr d|nd|jrd Sd S)zHandles includes.r&get_or_select_template get_templateselect_templateztemplate = environment.r?r>rAzexcept TemplateNotFound:rrr%NcddS)Nr)rrr)r*r'sr4 loop_bodyz.CodeGenerator.visit_Include..loop_body-s7 KKMMM   gu - - - LLNNNNNr6zNgen = template.root_render_func(template.new_context(context.get_all(), True, rrrrrzGfor event in (await template._get_default_module_async())._body_stream:z6yield from template._get_default_module()._body_streamr)ignore_missingrrrXrr Constr_rrrsrtTupleListr2rErRr with_contextrqrErBrD)r'r)r* func_namers` ` 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          U NN7++E22777    NN6 " " " KKMMM NNd//11DDD E E E IKKK LLNNN NNTD--.BMRRTT      & U NN!    IKKKK NNS T T T    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, rA_get_default_modulez (context))rErEr2rrRrrq)r'r)r*f_names r4_import_commonzCodeGenerator._import_commonLs 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.r1rrrcontext.exported_vars.discard(rAN)rrrRr8rrEr startswithrs r4 visit_ImportzCodeGenerator.visit_Import[s %-++DK88===tDDD > < JJ:t{::: ; ; ; D%((( > N$+"8"8"="= N NNLDKLLL M M M M M N N N Nr6c |||d||g}g}|jD]m}t |t r|\}}n|}|j|d|d|dj|d| | | dd dd }d |d |}|j|d |d |d| j r?|||ds||o|rt!|dkr<|d}|d|dj|n:dfd|D} |d| d|rwt!|dkr!|d|dddSdt%t&|} |d| ddSdS)zVisit named imports.zincluded_template = z = getattr(included_template, z , missing)rMrNrnz{{rz}}z9the template {included_template.__name__!r} (imported on z%) does not export the requested name z = undefined(fz, name=rArr rrrr>c3VK|]#}|dj|V$dSrm)rrR)rdrRr*s r4rfz1CodeGenerator.visit_FromImport..sR%%?Ct::!2!24!8!8::%%%%%%r6rrrz)context.exported_vars.difference_update((rN)rrErr{rXrsrrrRrrjreplacerrr rrUr6rrc) r'r)r* var_namesdiscarded_namesrRrrjmessagenames_kvrs ` r4visit_FromImportzCodeGenerator.visit_FromImportfsD T )*** D%((( J 2 2D$&& " ee NN=$$U++BB/3BBB    NNG!2!25!9!9GGG H H H KKMMM }}T**223==EEc4PPH@!)@@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)rS)only)rc3$K|] }|jV dSr.)r)rdrs r4rfz*CodeGenerator.visit_For..s$HHE5<HHHHHHr6rS) for_branchelsetestz(fiter):z async for zfor rizauto_aiter(fiter)fiter:rMrrOz%(reciter, loop_render_func, depth=0):r2storez8Can't assign to special loop variable in for-loop targetz = 1r>Asyncz LoopContext(r?reciterz auto_aiter(rAz&, undefined, loop_render_func, depth):z , undefined):z_loop_vars = {}z = 0rzloop(z, loop)r*)*rr recursiveriter_child_nodesrrr rrrWrPelse_rrrrGrr;rEr2r8rErr>rrrrRrrrBrDrrrSrrrrdifference_updatestores) r'r)r*r test_frame else_frame extended_looploop_refloop_filter_funcrRiteration_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)NrMrzelif r) rrr2rrErrrSrelif_r)r'r)r*if_framers r4visit_IfzCodeGenerator.visit_If(sN::<< 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)NrrrArrr1) r`rrrRrrErrrRrg)r'r)r* macro_framer[s 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`rrgr visit_Callcallr)r'r)r* call_framer[s r4visit_CallBlockzCodeGenerator.visit_CallBlockGs $e < < I {### y*--- %%%  5>>> ur6c|}|j|||||||j||||||j || || |dSr.) rrrPr;rrrSrrfilterrr>)r'r)r* filter_frames r4visit_FilterBlockzCodeGenerator.visit_FilterBlockOs{{}} ))$/// &&& L!!!  <000 %%% $+|444 u &&&&&r6c|}|j|||t |j|jD]Z\}}||||| d|||[| |j || |dS)Nr1) rrrPr;ziptargetsvaluesrr2rErrSr>)r'r)r* with_framer8exprs r4 visit_WithzCodeGenerator.visit_WithZs[[]] ''--- $$$ dk:: $ $LFD LLNNN JJvz * * * JJu    JJtU # # # #  :... $$$$$r6cf||||j|dSr.)rr2r)rs r4visit_ExprStmtzCodeGenerator.visit_ExprStmtfs0 T 49e$$$$$r6cjeZdZUejejdefed<ejeed<dS)CodeGenerator._FinalizeInfo.constsrcN)rrrr8rCallablerr__annotations__rr6r4 _FinalizeInforjsBz!*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. )rrrzs r4_default_finalizezCodeGenerator._default_finalizens 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_ctxrBr_r%c,|Sr.r)r_r_ env_finalizes r4finalizez.CodeGenerator._make_finalize..finalizes"7<<#6#6777r6r>c8j|Sr.)rB)r_r_r$r's r4r%z.CodeGenerator._make_finalize..finalizes"&w||D4De'L'LMMMr6) r rrBr%rr eval_contextgetfrom_objr8r9r)r'r%rpass_argr_r$s` @@r4_make_finalizezCodeGenerator._make_finalizexsX > %> !"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. )rcr)r'r,s r4_output_const_reprz CodeGenerator._output_const_reprs F5MM"""r6r%c||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_constr0rrrXr TemplateDatarrr)r'r)r*r%rs 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)r0r1rErrr'r)r*r%s 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. rAN)rErr4s 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((rrdrAr)rrrrr+r rrXr1 Impossibler2 Exceptionr rtrrUr.rr5r2r7rEr) r'r)r*r%rSchildritemvals 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|t}|tjD]}|j|vr ||j|j|j}| d|d| | d| | || |j||d| |j|||dS)Nzif not isinstance(z , Namespace):zMraise TemplateRuntimeError("cannot assign attribute on non-namespace object")r1)rrurr NSRefrRrrrRrrrrr2r8rEr)r)r'r)r* seen_refsnsrefrRs r4 visit_AssignzCodeGenerator.visit_Assign.s; !!### !$ ]]5;//  EzY&& MM%* % % %-##EJ//C NNBBBB C C C KKMMM NNF    LLNNNN 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(rA)rrrrrPr;rrrSrr2r8rEr rrr>)r'r)r*rs r4visit_AssignBlockzCodeGenerator.visit_AssignBlockMs: !!###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 rA) rrrrrrrRrrR find_loadrrrE)r'r)r*rRrs r4rzCodeGenerator.visit_Namees 8w   N #. 272C ! 6"2&**49555m ** 8v  =**3//D G11144S992 UtyUUUUsUUU 3r6c|j|j}||d|jddS)Nr'r()rrRrRrattr)r'r)r*rRs r4 visit_NSRefzCodeGenerator.visit_NSRef~sF m ** #.. .../////r6c||j}t|tr$|t |dS|t |dSr.)r0r0rXrorErrrc)r'r)r*r=s r4 visit_ConstzCodeGenerator.visit_ConstscmmEN++ c5 ! ! " JJs3xx JJtCyy ! ! ! ! !r6c |t||jdS#tj$r"|d|jdYdSwxYwNz6(Markup if context.eval_ctx.autoescape else identity)(rA)rErcr0r0r r9datars r4visit_TemplateDataz CodeGenerator.visit_TemplateDatas  JJtDMM%.99:: ; ; ; ; ;    JJWWWW       s:>-A/.A/c|dd}t|jD]2\}}|r|d|||3||dkrdnddS)Nr?r*r>rz,)rArErQryr2r'r)r*r^r<s r4 visit_TuplezCodeGenerator.visit_Tuples 3"4:.. $ $IC ! 4   JJtU # # # # 3!8844-----r6c|dt|jD]2\}}|r|d|||3|ddS)Nr'r>r(rSrTs r4 visit_ListzCodeGenerator.visit_Listsr 3"4:.. $ $IC ! 4   JJtU # # # # 3r6cR|dt|jD]g\}}|r|d||j||d||j|h|ddS)Nrnr>rr)rErQryr2rr_rTs r4 visit_DictzCodeGenerator.visit_Dicts 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)r0r1rrEr r2)r'r)r*rr"s r4 visit_ConcatzCodeGenerator.visit_Concats > " #RII ^ & #%II"I i###$$$:  C JJsE " " " JJt     4r6c|d||j||jD]}||||ddS)Nr?rA)rEr2ropsrHs r4 visit_ComparezCodeGenerator.visit_Comparesb 3 49e$$$( " "B JJr5 ! ! ! ! 3r6c|dt|jd||j|dS)Nr@)rE operatorsr;r2rrs r4 visit_OperandzCodeGenerator.visit_OperandsC ,y),,,--- 49e$$$$$r6c*|jjr|d|d||j||d|jd|jjr|ddSdS)N(await auto_await(zenvironment.getattr(r>rAr)rBrDrEr2r)rJrs 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(rlzenvironment.getitem(r>rAr) rXr"r Slicer2r)rErBrDrs 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)startr2rEstoprrs 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)Nrlr?r rzNo r+rrr"rBr>rAr)rBrDrErrRr(rrrrrrr'r)r$)r'r)r*rurG 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_expr2Fsiz% 4:u--- JJ+MM$''+++     r6r?z if z else rAr)rrEr2expr1r)r'r)r*r~s``` r4visit_CondExprzCodeGenerator.visit_CondExprBs          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) Nrlzenvironment.call(context, z context.call(rI _loop_vars _block_varsrAr) rBrDrErCr2r)rrrrxr$)r'r)r*rr loop_kwargs block_kwargss r4rzCodeGenerator.visit_CallYsS   $ - 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(rArEr2rrs r4visit_MarkSafezCodeGenerator.visit_MarkSafevs= 9 49e$$$ 3r6c|d||j||ddSrOrrs r4visit_MarkSafeIfAutoescapez(CodeGenerator.visit_MarkSafeIfAutoescape{s@ KLLL 49e$$$ 3r6c@|d|jzdS)Nz environment.rErRrs r4visit_EnvironmentAttributez(CodeGenerator.visit_EnvironmentAttributes# >DI-.....r6cP|d|jd|jdS)Nzenvironment.extensions[z].)rE identifierrRrs r4visit_ExtensionAttributez&CodeGenerator.visit_ExtensionAttributes1 MT_MM$)MMNNNNNr6cP||j|jdSr.)rErrrs r4visit_ImportedNamez CodeGenerator.visit_ImportedNames$ 4&t788888r6c:||jdSr.rrs r4visit_InternalNamez CodeGenerator.visit_InternalNames 49r6c0|ddS)Nr)rErs r4visit_ContextReferencez$CodeGenerator.visit_ContextReferences 9r6cV|||dSr.)rErrs r4visit_DerivedContextReferencez+CodeGenerator.visit_DerivedContextReferences* 4&&u--.....r6c2|d|dS)Ncontinuersrs r4visit_ContinuezCodeGenerator.visit_Continues z4(((((r6c2|d|dS)Nbreakrsrs r4 visit_BreakzCodeGenerator.visit_Breaks w%%%%%r6c|}|j|||||j|||dSr.)rrrPr;rrSr>)r'r)r* scope_frames r4 visit_ScopezCodeGenerator.visit_Scopesjkkmm ((... %%%  ;/// %%%%%r6c*|}||d||||d||j||||d}|j|| || |j || || dS)Nr1z.vars = T)r)rrrr2rr|rrrPr;rrSr>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.r1T) optionsrrr2r_r0r0setattrr r9r1)r'r)r*keywordr=s 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(rA)rr0saverrrSr2revert)r'r)r* old_ctx_name saved_ctxr;s r4visit_ScopedEvalContextModifierz-CodeGenerator.visit_ScopedEvalContextModifiers0022 N''))  ,BBBCCC &&tU333Y % %E JJue $ $ $ $ i((( A,AAABBBBBr6NFTrr)r r.)Nr)r?r@)rrrr8rrrTextIOrmrpropertyrVrnrrr+rrrrr NoderrrrrrErrrCallrrMappingr9r$r/r;r>rErGrrrrr`rgrjrqrtrXrZrYr|r~rr4rrrrrYrrrrrIncluderImport FromImportrrrForrIfrrr  FilterBlockr WithrExprStmtr NamedTupler staticmethodrr rr+r.r7r2r5r7Outputr>AssignrC AssignBlockrFrrr@rKrrMr1rQrUrrWDictrYrL visit_Add visit_Sub visit_Mul visit_Divvisit_FloorDiv visit_Pow visit_Mod visit_Andvisit_OrrQ visit_Pos visit_Neg visit_Notr:ConcatrdComparergOperandrjGetattrrmGetitemrprortrIteratorrxrrCondExprrrKeywordrMarkSaferMarkSafeIfAutoescaperEnvironmentAttributerExtensionAttributerrr 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\@Dx9x9Nx9+,:e+<x9 x9x9x9x9t/ /E/d////b(!%-(!(!$(!(!(!(!T8%-88$8888t UGEL%*::; UDI U  U U U U N Ne N N N N N5U%55e55555nIPeiIPIP$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%D20 0E0d0000" "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          'Q '1 ' ' ' ' CAJ'PRV'VW* Z%/7;TAB0$( . *S/jo  Jqx   Z_04"  :ej ! *+*S/ U3Z    &&&&&&&&PPPPPPPPfJJJJJ,JJJ'''''k'''&&&&&&K&&&,9bCbCbCbCbCKbCbCbCbCbCr6