NL ibUdZddlmZddlmZmZmZddlmZm Z m Z m Z m Z m Z mZmZmZmZmZmZmZmZmZddlmZmZddlmZmZmZmZmZm Z m!Z!m"Z"ddl#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;mm?Z?dd l@mAZAmBZBmCZCmDZDdd lEmFZFmGZGmHZHmIZIdd lJmKZKmLZLdd lMmNZNmOZOmPZPmQZQmRZRdd lSmTZTddlUmVZVddlWmXZXmYZYddlZm[Z[ddl\m]Z]m^Z^ddl_m`Z`maZambZbmcZcmdZdmeZemfZfddlgmhZhmiZiede egee"fZjiZkdeld< db dcdZm dddZn db dedZo db dfdZpepddddZqepdepdepd epd!epd"epd#epd$epd% ddd&Zrepd'ddd(Zsepd)ddd*Ztepd) ddd+Zuepd, ddd-Zvepd. ddd/Zwepd0epd1ddd2Zxepd,epd3epd4epd0epd1epd5epd6epd7e<epd8e:epd9e+epd9e; ddd:Zyepd;ddd<Zzepd=ddd>Z{ dgd?Z|epd@dddAZ}epdBepdCepdDepdE dddFZ~epdGdddHZe[eKeLeReTe]eVeXe^ecehdI ZdJeldK<epdLdddMZepdNe+dddOZepdPe<dddQZepd7e<dddRZepdSe<dddTZepdUe)dddVZepd"dddWZepd#dddXZepd$dddYZepd%dddZZdhd[Zepdddd\Zepd]ddd^Zepd ddd_Zepd`dddaZy)ia0Special case IR generation of calls to specific builtin functions. Most special cases should be handled using the data driven "primitive ops" system, but certain operations require special handling that has access to the AST/IR directly and can make decisions/optimizations based on it. These special cases can be implemented here. For example, we use specializers to statically emit the length of a fixed length tuple and to emit optimized code for any()/all() calls with generator comprehensions as the argument. See comment below for more documentation. ) annotations)CallableFinalOptional) ARG_NAMEDARG_POS BytesExprCallExprDictExpr Expression GeneratorExprIntExprListExpr MemberExprNameExprRefExprStrExpr TupleExprVar)AnyType TypeOfAny) BasicBlockExtendIntegerRaiseStandardErrorRegisterTruncate UnreachableValue) RInstance RPrimitiveRTupleRTypebool_rprimitivebytes_rprimitivec_int_rprimitivedict_rprimitiveint16_rprimitiveint32_rprimitiveint64_rprimitiveint_rprimitiveis_bool_rprimitiveis_dict_rprimitiveis_fixed_width_rtypeis_float_rprimitiveis_int16_rprimitiveis_int32_rprimitiveis_int64_rprimitiveis_int_rprimitiveis_list_rprimitiveis_uint8_rprimitivelist_rprimitiveset_rprimitivestr_rprimitiveuint8_rprimitive) IRBuilder)comprehension_helper*sequence_from_generator_preallocate_helpertranslate_list_comprehensiontranslate_set_comprehension)FormatOpconvert_format_expr_to_strjoin_formatted_stringstokenizer_format_call)isinstance_bytearrayisinstance_bytes) dict_items_op dict_keys_opdict_setdefault_spec_init_opdict_values_opisinstance_dict)isinstance_float)isinstance_int)isinstance_listnew_list_set_item_op)isinstance_bool)isinstance_frozensetisinstance_set)bytes_decode_ascii_strictbytes_decode_latin1_strictbytes_decode_utf8_strictisinstance_strstr_encode_ascii_strictstr_encode_latin1_strictstr_encode_utf8_strict)isinstance_tuplenew_tuple_set_item_opr:z1dict[tuple[str, RType | None], list[Specializer]] specializersNc\|r*||ftvr t||fD]}||||}||cSyN)rZ)builderexprcalleenametyp specializervals ^/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/mypyc/irbuild/specialize.py_apply_specializationresG s |+'c 2 KgtV4C   c2t||||jS)zIInvoke the Specializer callback for a function if one has been registered)refullnamer]r^r_s rdapply_function_specializationrjs !$ HHrfcT| |jn |j}t|||||S)zGInvoke the Specializer callback for a method if one has been registered)rhr`re)r]r^r_rar`s rdapply_method_specializationrls*"k6??v{{D $c BBrfcdfd }|S)zDecorator to register a function as being a specializer. There may exist multiple specializers for one function. When translating method calls, the earlier appended specializer has higher priority. cVtjfgj||Sr\)rZ setdefaultappend)fr`ras rdwrapperz$specialize_function..wrappers's R077:rf)rq Specializerreturnrs)r`rarrs`` rdspecialize_functionrvs Nrfzbuiltins.globalscTt|jdk(r|jSy)Nr)lenargsload_globals_dictris rdtranslate_globalsr{s$ 499~((** rfz builtins.abs builtins.intbuiltins.floatzbuiltins.complexzmypy_extensions.i64zmypy_extensions.i32zmypy_extensions.i16zmypy_extensions.u8ct|jdk(r|jtgk(rt |t r|jd}|j |}|jjdd}|dvrd}nd|d}t |trK|jj|r0|j|}|j||gd|jSy)zSpecialize calls on native classes that implement the associated dunder. E.g. i64(x) gets specialized to x.__int__() if x is a native instance. r.)i64i32i16u8__int____N)rxry arg_kindsr isinstancer node_typerhsplitr class_ir has_methodacceptgen_method_callline)r]r^r_argarg_typ shortnamemethodobjs rd$translate_builtins_with_unary_dunderrs 499~t~~':z&RZ?[iil##C(OO))#.q1 3 3F)B'F gy )g.>.>.I.I&.Q..%C**3D$))L L rfz builtins.lenct|jdk(r|jtgk(r|jd}|j |}t |t r/|j|tt|jSt|j |rd}nd}|j||}|j||jSy)NrrTF can_borrow) rxryrrrrr"rrtypesr4 builtin_lenr)r]r^r_r expr_rtypeborrowrs rd translate_lenrs 499~t~~':iil&&s+ j& ) NN3 3z//01 1!'"3"3C"89...8C&&sDII6 6 rf builtins.listct|jdk(r|jtgk(sy|jd}t |t r&|jst |j tsy|j j}|j j}|j|}t|r|dvsy|j|}|dk(r"|jt|g|jS|dk(r"|jt |g|jS|jt"|g|jS)zSpecialize a common case when list() is called on a dictionary view method call. For example: foo = list(bar.keys()) rNr)keysvaluesitemsrr)rxryrrrr r_rr^r`rr-rcall_crFrrHrE)r]r^r_rbaseattrrtypers rddict_methods_fast_pathrs  Na DNNwi$? ))A,C sH %chh:cjjR\;] ::??D ::??D   d #E u %$2M*M .. C v~~~lSE499==  ~~nseTYY??~~mcUDII>>rfct|jdk(rg|jdtk(rQt |jdt r4t ||jd|jjtSy)zSpecial case for simplest list comprehension. For example: list(f(x) for x in some_list/some_tuple/some_str) 'translate_list_comprehension()' would take care of other cases if this fails. rrempty_op_llbuilder set_item_opN) rxryrrrr r<r]new_list_op_with_lengthrMris rd"translate_list_from_generator_callrsg DII! NN1  ( tyy|] 39  IIaL&FF,   rfbuiltins.tuplect|jdk(rg|jdtk(rQt |jdt r4t ||jd|jjtSy)zSpecial case for simplest tuple creation from a generator. For example: tuple(f(x) for x in some_list/some_tuple/some_str/some_bytes) 'translate_safe_generator_call()' would take care of other cases if this fails. rrrN) rxryrrrr r<r]new_tuple_with_lengthrYris rd#translate_tuple_from_generator_callr!sg DII! NN1  ( tyy|] 39  IIaL&DD-   rf builtins.setct|jdk(rL|jdtk(r6t |jdt rt ||jdSy)zSpecial case for set creation from a generator. For example: set(f(...) for ... in iterator/nested_generators...) rrN)rxryrrrr r>ris rd!translate_set_from_generator_callr:sO DII! NN1  ( tyy|] 3*7DIIaLAA rf builtins.minz builtins.maxc|jttgk(r|j|jd|j|jd}}t |j |}|j dk(r|j||d|j}n|j||d|j}ttt} }}|j||||j||j||j||j|j|j|j| |j||j||j||j|j|j|j| |j| |Sy)Nrrr<>)rrrryrrrh binary_oprradd_bool_branchactivate_blockassigncoercetypegoto) r]r^r_xyresult comparison true_block false_block next_blocks rdfaster_min_maxrLsV ~~'7++~~diil+W^^DIIaL-I1'++D12 ??n , **1adii@J **1adii@J.8lJL*,K  J Dz*vw~~adiiH$))T Z {+vw~~adiiH$))T Z z* rfbuiltins.frozenset builtins.dictzbuiltins.sortedzcollections.OrderedDictjoinextendupdatec t|jdkDrI|jdtk(r2t |jdt rt |t r|j|j|j|jt||jdg|jddDcgc]}|j|c}z|j||j|j|jS|j||t||jdg|jddDcgc]}|j|c}zSycc}wcc}w)zuSpecial cases for things that consume iterators where we know we can safely compile a generator into a list. rrN)rxryrrrr rrrr^r`r=rr arg_namescall_refexpr_with_argsr]r^r_rs rdtranslate_safe_generator_callrhs4$ DII NN1  ( tyy|] 3 fj )**v{{+ 1'499Q<HI6:iimDsw~~c*DE!!$'   111'499Q<HI6:iimDsw~~c*DE   !EEs 9E$E)z builtins.anyct|jdk(rb|jtgk(rNt |jdt r1t ||jd|jd|jSy)Nrrc|Sr\ru)rs rdz$translate_any_call..sarf) rxryrrrr any_all_helperfalsetrueris rdtranslate_any_callrs] DII! NNwi ' tyy|] 3gtyy|W]]KQXQ]Q]^^ rfz builtins.allctjdk(rejtgk(rQt jdt r4t jdjfdjSy)Nrrc>j|djS)Nnot)unary_opr)rr]r^s rdrz$translate_all_call..sg&&q%;rf) rxryrrrr rrrris`` rdtranslate_all_callrsf DII! NNwi ' tyy|] 3  IIaL LL ; MM    rfc  tt j |dtt j j jj}tttc d fd }t||jj S)Ncjj}j|jj dj jy)Nr)r left_exprrrrr) rr] exit_blockrgenmodify new_valueretvalrs rdgen_inner_stmtsz'any_all_helper..gen_inner_stmtssfGNN3==9:  J Dz*vy{B/ Z {+rfrtNone) rr$rlistzipindices sequences condlistsis_asyncrr;rgoto_and_activate) r]r initial_valuerr loop_paramsrrrrrs `` `` @@@@rdrrso &F NN6=?B/s3;; s}}cllSTK*4, jl'J Z,,+I j) Mrfz builtins.sumct|jdvr3|jdtk(rt |jdt syt|jdk(r,|jdtt fvry|jd}n td}|jdj|}t|jjj||dddfd }ttjj j"j$}t'||j(S)N)rrrrrc jj}jj|dddy)N+r)rrrr) call_exprr]gen_exprrs rdrz+translate_sum_call..gen_inner_stmtss8NN8#5#56 vw00CLbQrfr)rxryrrrr rrrrrrrrrrrrrr;r) r]r^r_ start_expr target_typerrrrs ` @@rdtranslate_sum_callrs DII& NN1  ( tyy|] 3 499~ >>! Wi$8 8YYq\ QZ yy|H##D)K k "F NN67>>'..*DkSUVXZ[R H  h00(2D2DhFWFWXK+ N Mrfzdataclasses.fieldzattr.ibz attr.attribz attr.FactorycPttj|j|<y)a,Special case for 'dataclasses.field', 'attr.attrib', and 'attr.Factory' function calls because the results of such calls are type-checked by mypy using the types of the arguments to their respective functions, resulting in attempted coercions by mypyc that throw a runtime error. N)rr from_errorrris rd translate_dataclasses_field_callrs ")"6"67GMM$ rfz builtins.nextcP|jtgttgfvrt|jdtsy|jdt j |t|jdkDrj|jdnd}tdfd }ttjjjj}t!||j"|r9j%|j&j"j)nMj+t-t,j.d|j"j+t1j3S)a6Special case for calling next() on a generator expression, an idiom that shows up some in mypy. For example, next(x for x in l if x.id == 12, None) will generate code that searches l for an element where x.id == 12 and produce the first such object, or None if no such element exists. rNrcjjjjjj yr\)rrrrr)r]rrrsrdrz,translate_next_call..gen_inner_stmtss8 vw~~cmmP>PQ Z rfr)rrrryr rrrxrrrrrrrrr;rrrraddrSTOP_ITERATIONrr) r]r^r_ default_valrrrrrs ` @@@rdtranslate_next_callrs5 G9w&899 tyy|] 3 ))A,C g''- .F25dii.12D'..1.$KJ!! s3;; s}}cllSTK+I v{CMM,>,>? Z  &'9'H'H$PTPYPYZ[ KM" :& Mrf) builtins.boolzbuiltins.bytearrayzbuiltins.bytesrr}rr|rrz builtins.strrrisinstance_primitiveszbuiltins.isinstancec0t|jdk(r|jttgk(syt |jdt t frttj|j|jd<|j|jd}|Ytd|D}|j|jd|}|jj|||j St |jdt rx|jdj"}|r]t$j'|j(}|r<|j|jd}|j+||g|j Sy)zSpecial case for builtins.isinstance. Prevent coercions on the thing we are checking the instance of - there is no need to coerce something to a new type before checking what type it is, and the coercion could lead to bugs. rNrrc3pK|].}|jxr|j xr |j 0ywr\) is_ext_classinherits_pythonallow_interpreted_subclasses).0irs rd z'translate_isinstance..Ps;b(:(:$:b2CbCb?bbs46r)rxryrrrrrrrrrflatten_classesallrr]isinstance_helperrnodergetrh primitive_op)r]r^r_irsrrrdescs rdtranslate_isinstancer@s?  Na DNNw6H$H$))A,) 45&-i.B.B&C diil#%%diil3 ?J..1*.EC??44S#tyyI I$))A,(yy|   (,,T]];DnnTYYq\2++D3%CC rfrocXt|jdk(r|jttgk(rwt |t rf|jd}t |t r2t|jrytdt|j}nt |tr2t|jrytdt|j}nvt |tret |jtrK|jjdk(r2t|jrytdt|j}ny|j!|j"}|j!|jd}|j%t&|||g|jSy)aSpecial case for 'dict.setdefault' which would only construct default empty collection when needed. The dict_setdefault_spec_init_op checks whether the dict contains the key and would construct the empty collection only once. For example, this specializer works for the following cases: d.setdefault(key, set()).add(value) d.setdefault(key, []).append(value) d.setdefault(key, {})[inner_key] = inner_val rrNrr)rxryrrrrrrrr&rr r r_rrhrr^rrG)r]r^r_r data_type callee_dictkey_vals rdtranslate_dict_setdefaultrbs0 DII! NNw0 0 vz *iil c8 $399~#3TYY?I X &399~#3TYY?I sH %3::x0 ##~5388}#3TYY?InnV[[1 ..1.~~ (;*KTYY   rfformatct|trt|jtr|jj t t|jk(rf|jj}t|}|y|\}}t|||j|j}|yt||||jSyr\)rrr^rrcountrrxvaluerBr@ryrrA)r]r^r_ format_strtokensliterals format_ops substitutionss rdtranslate_str_formatr's 6:& v{{G , NN  )S-@ @[[&& &z2 >%*27J SWS\S\]  %gx RR rfcLt|trt|jtr|jjdk(r|j t gk(rt|jdtr|jdjD]}t|trt|trt|jtr|jjdk7ryt|jjtr#|jjjdk7ryt|jdtr|jdjdk7syyg}g}|jdjD]}t|tr@|jdk7r1|jtj|j|St|tsd|jtj|j|jdd d}t!t#|dz D]}t#||dzk\s|||x}#|||dzx} 4g|d|t|| z||dzd}g|d|tj||dzd}t#||dzk\s|||x}|||dzx} mt%||||j&} | yt)|d| |j&Sy) zSpecial case for f-string, which is translated into str.join() in mypy AST. This specializer optimizes simplest f-strings which don't contain any format operation. rrNz{:{}}rct|tr |jSt|trSt|jt r9|jj r#|jj}| t|Syr\) rrr!rrris_final final_valuestr)r^r,s rdget_literal_strz*translate_fstring..get_literal_strs\$(zz!D'*z$))S/IdiiN`N`"ii33 *{++rfr)r^r rt str | None)rrr^rr!rrryrrr r_r`rpr?STRrangerxr@rrA) r]r^r_itemr%exprsr.ifirstsecondr&s rdtranslate_fstringr7s 6:& v{{G , KK   # NNwi ' tyy|X .IIaL&& D$(D(+!$++z:dkk>N>NRZ>Z"4;;#3#3W=AQAQAWAW[bAb!$))A,8DIIaLQR E a!e#-eAh77UD.uQU|<>Qz$))A,'H 4>>Qz$))A,'HH F 4>>Q:diilG#D >>!  )~~a J.99Q<--"h.1++ ^^A ' )yy|))H 4>>Q:diilG#D >>!  )~~a J.99Q<--"h.1++ ^^A ' )YYq\''F ~~''R088bAH33~~4w~~fkk7R6SUYU^U^__ 0 0~~5v{{8S7TVZV_V_`` K K~~6 9T8UW[W`W`aa rfdecodect|tsyt|jdkDrt|jdt syt|jdkDrt|jdt syd}d}t|jdkDrt|jdt r|jdt k(rX|jddk(r|jdj}n]|jddk(rK|jdj}n1|jdtk(r|jdj}nyt|jdkDrt|jdt r|jdt k(rX|jddk(r|jdj}n]|jddk(rK|jdj}n1|jdtk(r|jdj}ny|dk7ry|jjdd }|d vr;|jt|j|jg|j S|d vr;|jt"|j|jg|j S|d vr;|jt$|j|jg|j Sy) zPSpecialize common cases of obj.decode for most used encodings and strict errors.Nrrr:r;r<r=r?r>)rr@r:zutf-8rA)rBrCrDzus-ascii)z iso8859-1z iso-8859-1rFrGrHrIzlatin-1rJ)rrrxrryrrrr!rrKrLrrSrr^rrQrRrMs rdbytes_decode_fast_pathrQst fj ) 4>>Qz$))A,'H 4>>Qz$))A,'HH F 4>>Q:diilG#D >>!  )~~a J.99Q<--"h.1++ ^^A ' )yy|))H 4>>Q:diilG#D >>!  )~~a J.99Q<--"h.1++ ^^A ' )YYq\''F ~~''S1H<<~~6 9T8UW[W`W`aa < <~~7'..:U9VX\XaXabb   ~~87>>&++;V:WY]YbYbcc rfct|jdk7s|jdtk7ry|jd}|j |}t |r|j |St|s t|r=|j |}|jt|td|jSt|r=|j |}|jt|td|jSt|s t|r2|j |}|j!|t|jSy)NrrTsignedrF)rxryrrrr2rr1r0rrr*rr5r3r,rr]r^r_rarg_typercs rd translate_i64rWYs 499~dnnQ/7: ))A,C  %H8$~~c"" X &*=h*GnnS!{{6#'7499UVV X &nnS!{{6#'7DIIVWW 8 $(:8(DnnS!~~c#3TYY?? rfc8t|jdk7s|jdtk7ry|jd}|j |}t |r|j |St|r<|j |}|jt|t|jSt|r=|j |}|jt|td|jSt|r=|j |}|jt|td|jSt|s t!|rB|j |}t#|t}|j%|t|jSy)NrrrTrSF)rxryrrrr1rr2rrr)rr0rr5r3r,truncate_literalrrUs rd translate_i32r[ms< 499~dnnQ/7: ))A,C  %H8$~~c"" X &nnS!{{8C)9 JKK X &nnS!{{6#'7499UVV X &nnS!{{6#'7DIIVWW 8 $(:8(DnnS!s$45~~c#3TYY?? rfct|jdk7s|jdtk7ry|jd}|j |}t |r|j |St|s t|r<|j |}|jt|t|jSt|r=|j |}|jt|td|jSt|s t!|rB|j |}t#|t}|j%|t|jSy)NrrrYFrS)rxryrrrr0rr1r2rrr(rr5rr3r,rZrrUs rd translate_i16r]s 499~dnnQ/7: ))A,C  %H8$~~c"" X &*=h*GnnS!{{8C)9 JKK X &nnS!{{6#'7DIIVWW 8 $(:8(DnnS!s$45~~c#3TYY?? rfcDt|jdk7s|jdtk7ry|jd}|j |}t |r|j |St|st|s t|r<|j |}|jt|t|jSt|s t|rB|j |}t!|t}|j#|t|jSy)NrrrY)rxryrrrr5rr0r1r2rrr9rr3r,rZrrUs rd translate_u8r_s 499~dnnQ/7: ))A,C  %H8$~~c""H% x ( x (nnS!{{8C)9 JKK 8 $(:8(DnnS!s$45~~c#3TYY?? rfct|ts|S|j}d|jdzzdz }||z}|jr||dzdzk\r||dzz}t||S)zIf value is an integer literal value, truncate it to given native int rtype. For example, truncate 256 into 0 if rtype is u8. rr)rr numeric_valuesize is_signed)r!rr max_unsigneds rdrZrZsv eW %  A%**q.)Q.L LA 1!1a 77 \A  1e rfcHt|jdk7s|jdtk7ry|jd}|j |}t |st |s t|r2|j|}|j|t|jSyNrr) rxryrrrr,r3r.rrr+r)r]r^r_rrVsrcs rd translate_intris 499~dnnQ/7: ))A,C  %H8$ X &  )nnS!~~c>499== rfrct|jdk7s|jdtk7ry|jd}|j |}|j j |Srg)rxryrrrr] bool_value)r]r^r_rrhs rdtranslate_boolrlsU 499~dnnQ/7: ))A,C .. C ?? % %c **rfct|jdk7s|jdtk7ry|jd}|j |}t |r|j |Syrg)rxryrrrr/r)r]r^r_rrVs rdtranslate_floatrns\ 499~dnnQ/7: ))A,C  %H8$~~c"" rfz builtins.ordct|jdk7s|jdtk7ry|jd}t |t t fr6t|jdk(rtt|jSyrg) rxryrrrrr r!rordrs rd translate_ordrqsf 499~dnnQ/7: ))A,C#+,SYY11Ds399~&& rfr\) r]r:r^r r_rr`r/ra RType | Nonert Value | None)r]r:r^r r_rrtrs) r]r:r^r r_rrarrrtrs)r`r-rarrrtz$Callable[[Specializer], Specializer]) r]r:rr rCallable[[], Value]rzCallable[[Value], Value]rrtrtr)r!rrr!rtr)__doc__ __future__rtypingrrr mypy.nodesrrr r r r r rrrrrrrr mypy.typesrr mypyc.ir.opsrrrrrrrrmypyc.ir.rtypesr r!r"r#r$r%r&r'r(r)r*r+r,r-r.r/r0r1r2r3r4r5r6r7r8r9mypyc.irbuild.builderr:mypyc.irbuild.for_helpersr;r<r=r>"mypyc.irbuild.format_str_tokenizerr?r@rArBmypyc.primitives.bytes_opsrCrDmypyc.primitives.dict_opsrErFrGrHrImypyc.primitives.float_opsrJmypyc.primitives.int_opsrKmypyc.primitives.list_opsrLrMmypyc.primitives.misc_opsrNmypyc.primitives.set_opsrOrPmypyc.primitives.str_opsrQrRrSrTrUrVrWmypyc.primitives.tuple_opsrXrYrsrZ__annotations__rerjrlrvr{rrrrrrrrrrrrrrrrrr'r7rNrQrWr[r]r_rZrirlrnrqrurfrdrs #,,"*   8,  N83K5IO Xw7%HI CE ?D`d   & 07 ?I P\   I I&I07IIQUC C&C0:CAMCC$(  )"'() ^$^$%&'(*+*+*+)* &07+,,,)'%%,^$%&_%?&?<_% &07&0%& &07'0^$ &07%"^$^$%%4%&)*_%^$^$&'./V^,X/X/X~.! !&!07!!/00-0(%%&+'!H^$%^$ %    ' %  #   4^$#%#L()Y]#^$   & 07  %$ * _%(&(X%.&$&."$""& u *+,B\?3*4*ZX~./&V^,@-@FX~.0/0fX/0919x*+,&*+,.*+,()*+*  ^$ % _%+&+%&'^$%rf