ÿØÿà JFIF    ÿÛ „ !.%+&8&+/1555$;@;4?.451 4,$,44444444444414444444444444444444444444444444444444ÿÀ  á á" ÿÄ     ÿÄ ?    !1AQaq"2‘¡±ÁðBRbrÑá#‚’¢²3S CñÿÄ   ÿÄ !    !1QAa‘2ÿÚ   ? 5˜Z¯V¦cø)›t/? z¨±>Õ5€¶‹Á¤·¼z¼Ü¬+ñ®v¤¨_ˆR­BFn©—˜ý®ç̝P8gýt·ÉSTŦˆìät?þé¼íìN/Þa)ì–í6ô… Ï¿øÃj´¿KÇü]ÿ ªô¹-eKànëÕHTx}ýSÜ›ÿ ”7Ø×&µ<¦  ¥ÑO¶[Ù¯ä¨ÞÃÿ PZ-¬;#õ|•oaÿ ©CìÞz3˜öː/¤­ñTûIØ}š^ mÓ%ªxˆ¥ÉŸu=Z+ISe¿45™¼u;ú&WØ÷€æßQ™®{|íx*TC“#ZŠìZ§²‹ 6pv…³¿¡äª*áZÐ%ÒOáˆo"x«OHk w±æ+¬V(kMúŸ5Vö«$ ÁrÏbàb57/luR ¸ÑÛj Òµì`Мq­û žICÀÊ•©4€Âcà¨Ï€O´<èÐ:›ù(Ë^L8þ‘ÍÌ#¸Ð_Ì©ÙK(Öz 4¬û+¸;ü’V’84‘¬ÃŽ:[â‡ÔÌáõp¢~§ªlæ£ö{®G>J¼"°‡7¯ÆÉèßû ‹É‹§ÁòÃýâßî ^ƾÙõ‹×óH#«LP½ïX=xÑÍ$|W?•~• îëÔ©ª‹ {ÝT…Kÿ ”hûâá)J*ö˜–ÔU;iÇ€/ ÆþjóZ\ýwØ=Ìm ºèËL9 ýèÆð/¨’¥öo=nË.%Îì ŽÕ¯È|{Oj²ƒE6e/ßdÄõ²Ìâ1O®ò×TsəԸhOMýíMˆ¿¼H˜l²,7Â¥#MF/Úf°Ö½± ¸–dr‹NýÊ íjqx{œÉ ä-È ¦ øÄër¨q°ð †nцýÑÄÆ’mä…n<0È™;ÁÝá¯ÁZƒ7FÀmì­ É&9ˆîéi¶ùN§Y• ÃZãAâ?•‡©‰ , ó¾IŸŠc1 4â&y­&pŠ­6;M À 0¹qç»p.á …ŸÅáK@%6·y6ƒ‰3?”úºŽ‰éX5ªPT §µ!=Mž«Ú½‹ÅgÂSâÉaþÓoö–¯ÁÔìR>5éÿ üs¶ÆUcÌ kÇR ]ÿ ù¬¼«VŽ;Â|‡~¢¦”ÏŰæ {L™Õ°Óv¹ò¸írޡעCÃ!íVÕ {¶»sŒNPg/ "uÕbkm²“$ďå¿é¹§°½æz¯6 †s¿!s–wÚÝ“™Œ °.ûj>·+™Òa…©Œ&rÝÎtÛë긪Ît’LAVp%c Úý[ÄzJ¾ÇàXXç@˜ó<êL]·T˜¾¥1Ó©V‡g´æ½¦Ý@¹óø!_@´ÞâSÁ —S3™•& ]@JHÚý©ZŽ €×æÔr»Áf!‡yÞ4Mv*èÓã_{‘åóUuљØ«Oïé*®EvÑ Œ÷‡U \"㪒ÍK+À 4“M¡ï:0¥5í!'<@î´”>Ç»&Z–ïCCV˜Ì5Šo&îhè.žû |ÓK©h$s6KìŒëã)¹hI¦GïOåóI;ììü#É$Š0…Ææ¥TØ.5­¾gn´ “ÂÖ\:hœ89G)J@„}œ:’Ò{/Š"¦_Æ×7Æ3VÇŠÊa]ÚŒÙ€Ä–=®uÁßâACZƒ§§£ Qnâ:«,×{tyø¬iÛcœÜÄ€H½ÄÍCk´÷šß .W'b¤Íåh]÷€=,Žv×cÚEÚHXJX¶îo¨FÒtèöŸ>ªª6[J®Fµ£sGÁeqõfe\íjÒÐïÄÐGˆe1Ø‹.Ø”‘Ëuø Y­ˆÜ ŽG|zùªüMpDnQWÄ”%JŠ™)â*p@Örš«ÕT2Ð%ˆG#ª„ ·¤!°ŸOTÂT¸aÚ%4&h™LµšØüÐ.F¿²ÐÞ_Ç‚¾ÅÃaÜ÷09Æ q€öy˜v‡85õN÷]¬äѼóS{°_MެúÔ#°Ç¸0åÞè2ëôPcvÆw9®ií1Ä8F™˜à‰´+‰Ik1òÝ7“Ñ×ÒsÝ\x‚h`ÞÑ`ó"|µEcý£n˜h`}GÞ !±ù²Ápü²ß6 0ïi󜵩SÈÇ7˜-ÕURO˜¦´f$ªž-Í6(œ}<„ éc øs]ŽŽ„*—¾ ìdŽ„)méª\¿êÎIg¾ØÞ~I#C/¼¼´EÁÈŽi8“©õådô·>euä ƒ'Ê×लR1ÉJE1ÐAát`t;ÇР%Ý<‡¥„ÍÆ`×Oyó)õiI€ñQaŸ4Ûù\áàaÃÔ¹HÃu¹*k€¦<„e S‡&õÏ B!ŽhüÞ`yj}mªf×\¿ Ç~æ­9‡û\՞Ǖg²1Žû5V7 !àöšm° c`ܬøÇìµÒ'P"?…´Ö,"§^•õލsÔ)6˜sæéÍR¼ ò|Sl”‹7 nPW Gòú÷½§O¯‡„l¡kSÞŒr½PÊ@æ¢pŽ-mÿ #Ÿ˜Àº¶Áä¦;ïÔæ$1££`“Õ>„—·ž)ßð³ñ#Ï Ô$¶œ‰ÊE‹À;÷º ¯«P:Ñ”8–IÊtpÞ3ª“>ê“þës4ò2OÏÕ­±zô†Õ§‰.÷ä¸;¿˜“'œ›žª}«Œ{ª±Ì 9ÔóÞÕ‡0 $íWV3Üì¬ —@kÝ4@¿r¼±½¬™›?øØæ´'Áé®CË3-g$˜ö‡×auÚi´Žp/êÛ æF›Ú2v‹ã¿¿,nB1̨ƃqÞa5͝@&Æû“él÷ \C²½UÍc ¯k×¢U ÖéQå™—-r wô ÞÏ<Ò=&=ÿ Ôê Òêˈt,i—;LîÜ á¸*ÚÃ1$êL•LÍ <É)ýÐà’ ;F™{ƒ™˜€&'}‚ãÄK`¡ÞT@I;®žZóè‚s’7®°›+§O­Åq©é»²9<Ô J ¼9O’HL»Ùïì¸rk¼Ž_ý‘TŸu[²ßÚŒ·ü÷B%¯E ŸÔX5êO´ Ç•€’I0 ÉJX` ñ¹õ%;µŸD‘«´€àwÒ™U ûئžÖö\×®×´8 ½‡ºÐÆÓ§?Àkmœ=;d5*@-ì0F Rªýš[Ü6âö̃ڸr*KA9· u*µæ£?U¸Âêí†8@¦X4 e-ò„0s{ HâUpU?¼mñRa°®a%Ð'tÉ×’\¾ÊÉ]t›h>·(Ë@R¼¡Ãt h}’O÷au<+nT…Ö…MӐ??Óe95 q>í/;&JSû °¯ÊéÞ øƒ*Ã2½Ài&:nôUl=¾¿5eˆ3”ñc|Ú2V”>„»&eE;«ÚäC p¢Û úy 9š[ŒÌx¼擼A&DåÒ¯ˆ¤ÀÌ;"˜ ÏQä¸åhÊ}Ûq«Û0WžÒ|»€ø®öCm5•\ÇÀ§Pe3£]0ÃàLDÉ‰1øªxjgwT‚÷¿LΨK‹›ùs—xˆÜ±µ kæ¸f‰‰ÜGk/LÛØ6d9ò¶ùA{ƒA3š/¬D¬khÓk‰`˜"㯒r¿±Óã jx‡°e}<Ñø\3y:'À•/h½Í€Ç4~g ?Û(¼]v‘ªlKÎâ~?O‚W%{Ì:“'©úNq¾›úo(X’¥¯ˆ nFê{Ç€ü?º'ë ø‹ì Þ09ŒÌç9Æ —ËC`j@ÓÄ(+a‹un¸#ÂꟋ{K`‘ÑÍÍ'à´»/Û,KW;Þ4²þð ï Nm|~fGÏ(…³Ã)«1ö­Õ ¥‡¨©ƒÃ™ü-s=à=U66Ï«Ýc蓦W¹íž®›nÔ%êÇìŒ<#Ü×84ån®Ð ÒåOC` ñânÑs‡¢ç 1õ%Îhì½Ã½® e:ݼUZo™`  ÅZŸŒÊ«ê1ÏÄo$q¹Þ€©ˆhÐÉä¯ñ[!…Ú˜àJ:x2$Íß&PåT£6ç— ‡Í*4Ýšçjÿ ‰É nófÐ ó(L5C•åÆ\rMÒ@ò }y-W}™üýVù—ú¢=Ù”c®‘< M ž ´Phr ¦©TD ‘ù.$´÷O‡‘V2Æò.=IUŒ=ž‡â¬i™aþÓåÙ?òUø'ØÖ•.~* šTŒ!•-×áºTâ®ä#õü'´ eýlYÅÓeÕKÂrT"CÚ@u!Óxƒ{š3€}1¿(r}%«nËamjÑ%ÑNEò v ˜à  σöK³,*º.àzù¨™Ó ÚçâU¦*¿ 9{%Ö¹ njûdaXöb) kÛÆ±ûÓ\°M7ˆÂ=û›ç¿Ã‚­V»Cg–8ÙêE- j)k$º`Ã-ùEýeBÆÇ]c¡°ñty&Òd0nõ'¡W+ƒ*|–øµFa\GQªEAÔp5\Ǽ·¼Ç8·õ -â§Ú[ ‡ uZeÖ 3}×d'+¹:ð+K†Û®s!Ï$úe€<Û”x)1»a­¡LC]¸µík…ÚàA»AYº{†ªS[¦5HÒ7ù --,ísòDØ€èk ÞÀîÜ ò@â( ËNˆë›4ô½•/¦o‡€Û7 ê•ÆêòðÜy'Án½µ á˜ݦ ndeo…[ì¶Ê,¥R³Ä=À±—–ß;£™´ñSâ*g§”ïaið‘Jå~™ÓÞ ß³Õ¢»8x埒²52>AÊb&-÷\7´éÄù€T˜,w;3{ï˜k…à¹ÄqÀ«œ{€\ ˆ¾[´¨јr &Úé„Ívˆ±8†¿]|¬ņ4I×pÞS1ÈÖz‰#Ìv‡G!YNògñ:màTz¢Ý1ô©^O=~ë|5Bã™ç•¼µõ•bÆ@úÕS¬ÈŒ#¬zünrŸ û” Z²•èðV"ÁHÚý©wÝ €7¼Ìu1hÑa3Éä û f$o¿É ™Ú›ÝçnpÒ3äÌ3†Í§,Äï]$‰/pê †«À¼¸e9­Æê_C]žƒ·ý·frÁN«, E=›Çq -‰öŒ:aÏ¿±í&£Í:-} 84‘ÿ eƒQÑeëSsuiA ³g㟥ú£?ÿ ʼn*”“÷aühe:ÊWa@ÒÞk±eØ] F Ô—r.åä˜ @ö¥ªZoÐýYL·¥S²G/‡ñ <~*ZÆ´è>JlòàÛÆ½ÿ 窘ìGN¢:I®KšJp/`íIÁÀõ#Ä-€ö­šµŒoF4|ÆQØÆ@Ì|£Ô…¢À{9˜è½Üó›€ôYÒÎYsið;ís¤€à²ˆ‚4qÉVŒI$ ‰"° æµ8cXGjœˏ¡Aâý•ËÜ¢ûï e·çLx']á"oÅÎê3¯Ç—¹”ó0nå‚âg{Œñ> S´˜îè°g238‚ãköÝfÚd´6Ò€;ò÷±¢™¼›º ¢Æ'¥Ðx'e¬ç ]bÈÆV¢ó‹kýBO ðÊâ$Ÿ!×T 3Mýמ žìٍàÌü‘8÷€àæØ8æ©6‰©L´«…oãpð„~Çk‰!ñ;‹”ÛžÍ àž±z Ÿôû øŸÝužÏ;ÿ #|u6™Þ¬ÚˆÐõA4¶â|ôl|Ê2ŽÇ¤ÝÅÇY.<#Aí.k§hóF‚”Y; M½Ö4hŸ4&›­¿tès´%FìL¥£Ãk‰ÇT¤haÁ¤ÚxfÉ`ÑìË›>i 3t‚:,–+^÷´–{Û–Nxi"x‘Ûg î¨>¥Õ܁ùZH,2Û“:8xÊ¢Çí9.É-Ìâã-=çjwµS˜dütžçwýGòú®®ûº_ˆýx$–¡ãøO EÚÛÏ÷R„×w+3£Á£öUMyR²¹âŒ°š›¸Ñãò9§Ó_Dl+Ùßc›úšGÅÌc†Ž!Ko=¶.‘Îÿ c²(2®V mª.ÿ ¹B›¹å ù„öŸSV>™ü¯$y:G¢Z×àøúdî¹û­·ýÇ´:•c LÍõi_‹ö+ÎæGÊè>OŠ•äž´§Þ{X}¨1ÚTc›»Qþ•êô°t¿OP?eæ~É{5]•ÙR£r5†nZ\ã@ &îJõ ¾àC°þV>fé¥/ü5ñÊIº_é5 ;e­h<@ Ä&æÃëE%;X,ÒãÆÞ`Oò¦kŸm#˜!ÀyÄ¢| óLšò¥Ä` ¶R=|ÈCâh5ò3DˆïF†ðÒ#ÅìÛœ?¸yhBãœí ZxßÎÄhºRK„`Þödvײ™ÀÈÑÒgŒuY w³%†ƒÓzõ ÖÏp‚dH®¦A´ù§»ÓÇMæ~)ˆð‡û:ù&Ä •vGD´À n ݇¼Ö8Fö óáà£~Ë¥x`oK|Ä?fxiØü%pìR>éò+Û±éÎ>núlFŤ'tq8LZÏvÃ?„¡ß±È⽆¯³íü@x|PöUäèØã¡ð‚ŒAìÏ"vÍwóŸÍ{ ý0.z È•Ö{,N¡£¡ŸKÕÙž>Ýœþ ÍÀ°<×EA!Å‚D™IúOÍ¡>ôG}Â` ÍßkÜL™Ž Þð™ {IøF²¹òQ3&!ÃÂÞz.d&Ï-sH¸,Ôõ˜ŽP€ 77ˆÝ¼ÊëÜw =cÕ Ú,ØÐ5ÎYÐ)ì´öœgŒ[¤ßv㙑8心>h]§µháYš£²ºÑ.{Ï7Sð•?´~×SÃKýJÛ˜ ™Íäiúu<µX¶1õ^kâçIÑ£sZ4h>j*ÔšD:4­¿_ ÷¸ Õxæÿ ¸?Mù _•­ÊÐ ä ÷ý ÑwL œ­ïnTkÛUÍN©ë:¦fV ¶ÜÔÜMªÅâA½–¿R×TXš-%iTÊT•‡Ù‚JôϐZxWÑè‰f‰òG º ×Õû2aZ7OU3[“×AT–ÞŒ…-‘¤”Ì ì&(ˆ¿­•ƒkï’:ðY¦W‘ Å)“†‘˜³Åtcø˜ñTÂwÚÇ4|üLÇªí–v- qˆèU qPE.†â‘˜µ Æ,ÐÅs]8¾„oúÑ i>ÜxxÈó)ƒ ´æÁâØ$À‰vžŸf$Ž |ãw;ÀÁIJ»b` {¦Ó¤Ú$©YÀ‘n@Óïž«9J¼êG m¤ ܯ¹ÌW4€ÐÒÅÛ‡#褕Ÿn-?í|с¥÷Ú¹¬'´ÞÜ9ÓK `hê£SÄSà?7—Wí_´…óB›»:=Ãïq`<8ñÓŒÑlú2d¬ê³£hÖ[l|$vÝro~'R®‰§°ñmY ͧäP |PUª¹·:3Œ[Û{Xÿ ºâ@‚W–Äé u‚ ¯´*=íή.pûÒdt @G‰¬ s¸ ëÉücr ÞæÑ¨Ê@>¤¢Ö±. Þ'¯°ÌME[YéïĵÂCå½ Ué©Áû'Ê9%eÔðNU”ë‘ÌsD3/®+UI˜9h.WC”빓$#:pz:YÓ ¿xž* ³$Í +$kñAŠ‹†¢ Uê>¸)_š¬÷©ßAÂÔb9ÇU ¯¾á•9¯ÏÏ÷O÷¼¼Fähal1‰3Ì[Ïr•´UCksNÐ] R‘¸¥H+§Šé†c©vÖÞ0iÓ76s†î!§=ß ¼~Ô'°Ãmäoäš³ªøi1úÉ)³yV8 CLÄØÁ‘WYïi€H6ÖÑiámø^ÈY´°Ñ7¥Û*—Ñ©L«Qƒï—Ùrÿ ›£Ð*š¸ˆL©ˆ$ˆ ÷¾D§9È®«qbqC)–ˆïv´çñsÑVT­Ø, <àïºÀO«Jý·õ àfPìð .wFšir´þ’2_Y *Æ€x\« ì€9š@ Ž|F⇥ˆkZ@hÖÄ0t¿-<“‹qµ¾*ZL¤Ú)&BJpÓF5=$„at*Zš$’ÑtdûÝRI1 2މ$€$I$#‰SÞ’Hë¬ï;Á$¡t$’`<(ñÇt)$‡Ð.Êf¢X’Kt=Éé$‚ˆªè¢oÝëòI%Rgcª÷ŠyI%¡‰ÿ !ñ)´õ $¤ Ô’IIGÿÙ cfpUddlZddlmZmZddlmZddlmZddlm Z m Z m Z m Z m Z mZmZmZmZmZddlmZddlmZdd lmZdd lmZdd lmZmZdd lmZdd l m!Z!ddl"m#Z#ddl$m%Z%ddl&m'Z'ddl(m)Z)ddl*m+Z+m,Z,e r ddl-m.Z.m/Z/m0Z0m1Z1dZ2de3d<dZ4de3d<ej5dZ6ee7dfZ8e e7gee,fZ9GddeZ:Gdde%Z;ee>?d"gd#e>?d$gd%e.Z-e-@d&e-Ae>d'(e-Ae-@d)e-Ae>d*d+,e-Ae-@d-e-Ae>d.d/,e-Ae-@d0e-Ae>d1d2,e-AdSdS)3N)partialreduce)gcd) itemgetter) TYPE_CHECKINGAnyCallableDictIterableList NamedTupleOptionalTupleUnion) loop_last) pick_bool) divide_line) AlignMethod)cell_len set_cell_size)Lines)strip_control_codes) EmojiVariant) JupyterMixin) Measurement)Segment)Style StyleType)ConsoleConsoleOptions JustifyMethodOverflowMethoddefaultr"DEFAULT_JUSTIFYfoldr#DEFAULT_OVERFLOWz\s+$TextceZdZUdZeed< eed< eeefed< defdZ de fdZ dede de dffd Zdeddfd Zdeddfd Zd S) Spanz A marked up region in some text.startendstylereturnct|jtr'|jjrd|jd|jd|jdnd|jd|jd|jdS)NzSpan(z, )) isinstancer-r_metar+r,selfs +/usr/lib/python3/dist-packages/rich/text.py__repr__z Span.__repr__7sw4:u-- C26*2B C =DJ = =$( = =dj = = = =BBBtxBB4:BBB c"|j|jkSN)r,r+r3s r5__bool__z Span.__bool__>sx$*$$r7offsetc||jkr|dfS||jkr|dfS|\}}}t|t|||}t|j||}||fS)z)Split a span in to 2 from a given offset.N)r+r,r*min)r4r;r+r,r-span1span2s r5splitz Span.splitAsv DJ  :  TX  :  sEUCV,,e44UYU++e|r7c<|\}}}t||z||z|S)zMove start and end by a given offset. Args: offset (int): Number of characters to add to start and end. Returns: TextSpan: A new TextSpan with adjusted position. )r*r4r;r+r,r-s r5movez Span.moveNs*!sEEFNC&L%888r7c\|\}}}||kr|St|t|||S)zCrop the span at the given offset. Args: offset (int): A value between start and end. Returns: Span: A new (possibly smaller) span. )r*r=rBs r5 right_cropzSpan.right_cropZs:!sE S==KE3vs++U333r7N)__name__ __module__ __qualname____doc__int__annotations__rstrrr6boolr:rrr@rCrEr7r5r*r*-s** JJJ HHH e ) #    %$%%%% C E&(62B*B$C     93 96 9 9 9 9 4 4 4 4 4 4 4 4r7r*c~eZdZdZgdZ ddddddddded eeefd ed d ed dee dedee dee e ddfdZ de fdZde fdZdefdZdefdZdeddfdZdede fdZdede fdZdee efddfdZede fdZedefdZedd ddddd!ded eeefd"e d#eed ed d ed deddfd$Zeddddddd%ded eeefd ed d ed dee dedee ddfd&Ze dddd'ded e d ed d ed ddf d(Z!edddddddd)d*eede"ee ffd eeefd ed d ed dee dede d+ee#eefddfd,Z$edefd-Z%e%j&d.eddfd/Z%ede e fd0Z'e'j&de e ddfd1Z'dd2eddfd3Z(dd4Z) dd eeefd6e dee ddfd7Z* dd eeefd6e dee ddfd8Z+ dd+e#eefd6e dee ddfd9Z,dd+ee#eefd:eddfd;Z-dd?d@e defdAZ/ dddBdCed eee0e fdDede fdEZ1d dFdGe2ed eeefdHe de fdIZ3ddJZ4dKe ddfdLZ5dMe ddfdNZ6d>d?dOdPde2e7fdQZ8d>d?dOdPde9fdRZ:dd>d?dede2dSfdTZ;dUe2dddfdVZdd]Z?dd_e d`eddfdaZ@dd_e d`eddfdbZAdd_e d`eddfdcZBdddeCdee d`eddfdfZD ddedefd eeedgfddfdhZEddiZFdje2e"eee fddfdkZGddlZH ddXdXdmdnedoe dpe deIfdqZJdre2e deIfdsZKddue ddfdvZLdddddwd>d?dee d ed d ed de dee deIfdxZMdee deIfdyZNde fdzZO dd{d|d}d~ee d`ed e ddfdZPdS)r(aText with color / style. Args: text (str, optional): Default unstyled text. Defaults to "". style (Union[str, Style], optional): Base style for text. Defaults to "". justify (str, optional): Justify method: "left", "center", "full", "right". Defaults to None. overflow (str, optional): Overflow method: "crop", "fold", "ellipsis". Defaults to None. no_wrap (bool, optional): Disable text wrapping, or None for default. Defaults to None. end (str, optional): Character to end text with. Defaults to "\\n". tab_size (int): Number of spaces per tab, or ``None`` to use ``console.tab_size``. Defaults to 8. spans (List[Span], optional). A list of predefined style spans. Defaults to None. ) _textr-justifyoverflowno_wrapr,tab_size_spans_lengthN )rQrRrSr,rTspanstextr-rQr"rRr#rSr,rTrZr.ct|} | g|_||_||_||_||_||_||_|pg|_t| |_ dSr9) rrPr-rQrRrSr,rTrUlenrV) r4r[r-rQrRrSr,rTrZsanitized_texts r5__init__z Text.__init__sc-T22$%  29 4<    "'+2 // r7c|jSr9)rVr3s r5__len__z Text.__len__s |r7c*t|jSr9)rMrVr3s r5r:z Text.__bool__sDL!!!r7c|jSr9plainr3s r5__str__z Text.__str__s zr7c(d|jd|jdS)Nz)rerUr3s r5r6z Text.__repr__s7 77t{7777r7otherct|ttfr+|}|||St Sr9)r1rLr(copyappendNotImplemented)r4rjresults r5__add__z Text.__add__sB ec4[ ) ) YY[[F MM% Mr7czt|tstS|j|jko|j|jkSr9)r1r(rnrerUr4rjs r5__eq__z Text.__eq__s7%&& "! !zU[(HT[EL-HHr7ct|tr ||jvSt|tr|j|jvSdS)NF)r1rLrer(rrs r5 __contains__zText.__contains__sG eS ! ! -DJ& & t $ $ -;$*, ,ur7slicec dtddffd }t|tr ||S|tj\}}}|dkr||g}|dSt d)Nr;r.r(cxttjfdjDd}|S)NcRg|]#\}}}|cxkr|knn dd|$S)rrrN.0r+r,r-_Spanr;s r5 z9Text.__getitem__..get_text_at..sY)sEV,,,,u,,,,,E!Q&&,,,r7rW)rZr,)r*r(rerU)r;r[r|r4s` @r5 get_text_atz%Text.__getitem__..get_text_atsaE 6"-1[ DKr7rz%slices with step!=1 are not supported)rJr1indicesr]redivide TypeError)r4rvr~r+stopstepliness` r5 __getitem__zText.__getitem__s         eS ! ! I;u%% % % c$*oo > > E4qyy UDM22Qx GHHHr7c*t|jS)z5Get the number of cells required to render this text.)rrer3s r5rz Text.cell_lens ###r7cddlm}g}|j}dd|jfgd|jDd|jDt |d|jf}|tddd}|j}|D]C\}}} ||kr||||||}| r||rd | d nd | d Dd |} | S) z~Get console markup to render this Text. Returns: str: A string potentially creating markup tags. r)escaperFc34K|]}|jd|jfVdSFN)r+r-r{spans r5 zText.markup..s- F F$tz5$*- F F F F F Fr7c34K|]}|jd|jfVdSTN)r,r-rs r5rzText.markup..s- C Cttxtz* C C C C C Cr7Tkeyz[/][rW) markuprrer-rUr]sortrrmjoin) r4routputre markup_spanspositionrmr;closingr-rs r5rz Text.markupsB #"""""  tz " F F$+ F F F D Ct{ C C C ZZtz *  jA..///&2 C C "FGU  vveHVO455666! CA}E}}}}\\\\BBB r7T)r-emoji emoji_variantrQrRr,rrcZddlm}|||||} || _|| _|| _| S)a,Create Text instance from markup. Args: text (str): A string containing console markup. emoji (bool, optional): Also render emoji code. Defaults to True. justify (str, optional): Justify method: "left", "center", "full", "right". Defaults to None. overflow (str, optional): Overflow method: "crop", "fold", "ellipsis". Defaults to None. end (str, optional): Character to end text with. Defaults to "\\n". Returns: Text: A Text instance with markup rendered. r)render)rr)rrrQrRr,) clsr[r-rrrQrRr,r rendered_texts r5 from_markupzText.from_markupsL0 #"""""tU%}UUU ' !)  r7r-rQrRrSr,rTc ddlm}td||||||} |} | d| |D} | S)aCreate a Text object from a string containing ANSI escape codes. Args: text (str): A string containing escape codes. style (Union[str, Style], optional): Base style for text. Defaults to "". justify (str, optional): Justify method: "left", "center", "full", "right". Defaults to None. overflow (str, optional): Overflow method: "crop", "fold", "ellipsis". Defaults to None. no_wrap (bool, optional): Disable text wrapping, or None for default. Defaults to None. end (str, optional): Character to end text with. Defaults to "\\n". tab_size (int): Number of spaces per tab, or ``None`` to use ``console.tab_size``. Defaults to 8. r) AnsiDecoderrX)rQrRrSr,rTr-c3K|]}|VdSr9rNr{lines r5rz!Text.from_ansi..9s"CCdTCCCCCCr7)ansirr(rdecode) rr[r-rQrRrSr,rTrjoinerdecoderros r5 from_ansizText.from_ansis}. &%%%%%    +--CCgnnT.B.BCCCCC r7rQrRcL||||}|||S)aaConstruct a Text instance with a pre-applied styled. A style applied in this way won't be used to pad the text when it is justified. Args: text (str): A string containing console markup. style (Union[str, Style]): Style to apply to the text. Defaults to "". justify (str, optional): Justify method: "left", "center", "full", "right". Defaults to None. overflow (str, optional): Overflow method: "crop", "fold", "ellipsis". Defaults to None. Returns: Text: A text instance with a style applied to the entire string. r)stylize)rr[r-rQrR styled_texts r5styledz Text.styled<s4*c$(CCC E"""r7)r-rQrRrSr,rTmetapartsrc|||||||} | j} t} |D]*} t| | tfr | | %| | +|r| || S)aRConstruct a text instance by combining a sequence of strings with optional styles. The positional arguments should be either strings, or a tuple of string + style. Args: style (Union[str, Style], optional): Base style for text. Defaults to "". justify (str, optional): Justify method: "left", "center", "full", "right". Defaults to None. overflow (str, optional): Overflow method: "crop", "fold", "ellipsis". Defaults to None. end (str, optional): Character to end text with. Defaults to "\\n". tab_size (int): Number of spaces per tab, or ``None`` to use ``console.tab_size``. Defaults to 8. meta (Dict[str, Any], optional). Meta data to apply to text, or None for no meta data. Default to None Returns: Text: A new text instance. r)rmr(r1rL apply_meta) rr-rQrRrSr,rTrrr[rm_Textparts r5assemblez Text.assembleUs4s      D$ -- t   " OOD ! ! ! r7ct|jdkr%d|jg|jdd<|jdS)z Get the text as a single string.rrWNr)r]rPrr3s r5rez Text.plainsC tz??a  WWTZ001DJqqqMz!}r7new_textc||jkrXt|}|g|jdd<|j}t ||_||jkr|dSdSdS)zSet the text to a new value.N)rerrPrVr] _trim_spans)r4rr^ old_lengths r5rez Text.plains{ tz ! !0::N+,DJqqqMJ~..DLDL((  """"" " ! )(r7c|jS)z.Get a reference to the internal list of spans.rUr3s r5rZz Text.spanss {r7c$|dd|_dS)z Set spans.Nr)r4rZs r5rZz Text.spanssAAAh r7rec nt||j|j|j|j|j|j}|S)zOReturn a new Text instance with copied meta data (but not the string or spans).r)r(r-rQrRrSr,rT)r4re copy_selfs r5 blank_copyzText.blank_copys? *L]L]   r7c t|j|j|j|j|j|j|j}|j|jdd<|S)zReturn a copy of this instance.rN) r(rer-rQrRrSr,rTrU)r4rs r5rlz Text.copysT J*L]L]   #k r7rr+c |rpt|}|dkr||z}||}|dkr||z}||ks||krdS|jt|t |||dSdS)azApply a style to the text, or a portion of the text. Args: style (Union[str, Style]): Style instance or style definition to apply. start (int): Start offset (negative indexing is supported). Defaults to 0. end (Optional[int], optional): End offset (negative indexing is supported), or None for end of text. Defaults to None. rN)r]rUrmr*r=r4r-r+r,lengths r5rz Text.stylizes  EYYFqyy{Qwwsl#,, K  tE3vs+;+;UCC D D D D D E Er7c |rqt|}|dkr||z}||}|dkr||z}||ks||krdS|jdt|t |||dSdS)aApply a style to the text, or a portion of the text. Styles will be applied before other styles already present. Args: style (Union[str, Style]): Style instance or style definition to apply. start (int): Start offset (negative indexing is supported). Defaults to 0. end (Optional[int], optional): End offset (negative indexing is supported), or None for end of text. Defaults to None. rN)r]rUinsertr*r=rs r5stylize_beforezText.stylize_befores  HYYFqyy{Qwwsl#,, K  q$uc&#.>.>"F"F G G G G G H Hr7c^tj|}||||dS)ahApply meta data to the text, or a portion of the text. Args: meta (Dict[str, Any]): A dict of meta information. start (int): Start offset (negative indexing is supported). Defaults to 0. end (Optional[int], optional): End offset (negative indexing is supported), or None for end of text. Defaults to None. )r+r,N)r from_metar)r4rr+r,r-s r5rzText.apply_metas1%% U%S 11111r7handlersc |in|}|d|D|tj||S)aApply event handlers (used by Textual project). Example: >>> from rich.text import Text >>> text = Text("hello world") >>> text.on(click="view.toggle('world')") Args: meta (Dict[str, Any]): Mapping of meta information. **handlers: Keyword args are prefixed with "@" to defined handlers. Returns: Text: Self is returned to method may be chained. Nc i|] \}}d|| S)@rN)r{rvalues r5 zText.on.. s$III*#uYYYIIIr7)updateitemsrrr)r4rrs r5onzText.ons]\rrt II8H8HIIIJJJ U_T**+++ r7suffixc|j|r$|t|dSdS)zaRemove a suffix if it exists. Args: suffix (str): Suffix to remove. N)reendswithrEr])r4rs r5 remove_suffixzText.remove_suffixsD :  v & & ) OOCKK ( ( ( ( ( ) )r7consoler r;c|dkrt||z}|j}||j}|jD]&\}}}||cxkr|krn|||dz }'|S)a Get the style of a character at give offset. Args: console (~Console): Console where text will be rendered. offset (int): Offset in to text (negative indexing supported) Returns: Style: A Style instance. rrWr$)r] get_styler-rlrU)r4rr;rr-r+r, span_styles r5get_style_at_offsetzText.get_style_at_offsets A::YY'F%  $*%%**,,&*k ; ; "E3 V$$$$u$$$$$:r:::: r7) style_prefix re_highlightrc d}|jj}t}|j}t j||D]}|j} |rO| \} } t|r||| | n|} | | | kr||| | | |dz }| D]6} | | \} } | dkr | | kr||| | || 7|S)aHighlight text with a regular expression, where group names are translated to styles. Args: re_highlight (str): A regular expression. style (Union[GetStyleCallable, StyleType]): Optional style to apply to whole match, or a callable which accepts the matched text and returns a style. Defaults to None. style_prefix (str, optional): Optional prefix to add to style group names. Returns: int: Number of regex matches rNr) rUrmr*rerefinditerrcallable groupdictkeys)r4rr-rcount append_spanr|rematchget_spanr+r, match_stylenames r5highlight_regexzText.highlight_regex,s8&k(  [u55 L LEzH @%XZZ s9A%SeeE%)$4555e *sU{{KeS+ > >??? QJE))..00 L L%Xd^^ sB;;3;;KeS\2I42I2I J JKKK L r7)case_sensitivewordsrc.dd|D}|jj}d}t}t j||j|rdn tjD]5}|d\} } ||| | ||dz }6|S)aDHighlight words with a style. Args: words (Iterable[str]): Worlds to highlight. style (Union[str, Style]): Style to apply. case_sensitive (bool, optional): Enable case sensitive matchings. Defaults to True. Returns: int: Number of words highlighted. |c3>K|]}tj|VdSr9)rrr{words r5rz'Text.highlight_words..cs*>>BIdOO>>>>>>r7rflagsr) rrUrmr*rrre IGNORECASEr) r4rr-rre_wordsadd_spanrr|rr+r,s r5highlight_wordszText.highlight_wordsRs"88>>>>>>>;%[ dj^(N     EAJE3 HUU5#u-- . . . QJEE r7cB|j|_dS)z"Strip whitespace from end of text.N)rerstripr3s r5rz Text.rstriposZ&&(( r7sizect|}||krm||z }t|j}|It|d}|t ||dSdSdS)zRemove whitespace beyond a certain width at the end of the text. Args: size (int): The desired size of the text. Nr)r]_re_whitespacesearchregrouprEr=)r4r text_lengthexcesswhitespace_matchwhitespace_counts r5 rstrip_endzText.rstrip_endss $ii    4'F-44TZ@@ +#&'7'='=a'@'@#A#A $4f = =>>>>>  ,+r7 new_lengthct|}||kr:||kr|||z dS|||z dSdS)zDM>Q,D'/D_=HG$4H8H   ]dlGOUCC   JJOOE** ##G#:::::::::::r7c|j}|}|rtd|Dnd}|}|rtd|Dn|}t ||S)Nc34K|]}t|VdSr9rrs r5rz(Text.__rich_measure__..s(>>Xd^^>>>>>>r7rc34K|]}t|VdSr9rrs r5rz(Text.__rich_measure__..s(114111111r7)re splitlinesmaxr@r)r4rr r[rmax_text_widthrmin_text_widths r5__rich_measure__zText.__rich_measure__sz!!BGN>>>>>>>>Q 5: NC115111 1 1 1 >>:::r7rc#NKt}|j}|js"t|V|r ||VdSt|jt jtt|jd}fd|D|j d<dgd|Dd|Dt|d df}| tdd gj }j}ijt jd t ffd } t#||ddD]J\\} } } \} }}| r || n || | | kr||| | | VK|r||VdSdS) aRender the text as Segments. Args: console (Console): Console instance. end (Optional[str], optional): Optional end character. Returns: Iterable[Segment]: Result of render that may be written to the console. Nrrc8i|]\}}||jSrNr-)r{indexrrs r5rzText.render..s+VVVkeTUIIdj11VVVr7r)rFrc30K|]\}}|jd|fVdSr)r+r{r!rs r5rzText.render..s/ M M[UDtz5%( M M M M M Mr7c30K|]\}}|jd|fVdSrrr#s r5rzText.render..s/ J J+%txu% J J J J J Jr7Trr.ctfdtD}|}||S|}||<|S)z#Construct current style from stack.c3(K|] }|V dSr9rN)r{ _style_id style_maps r5rz9Text.render..get_current_style..s(OOI9Y/OOOOOOr7)tuplesorted)styles cached_style current_stylecombinestack style_cachestyle_cache_getr(s r5get_current_stylez&Text.render..get_current_stylescOOOOOOOOOF*?622L'###GFOOM"/K  r7)rrerUrrrnulllist enumerater-r]rrrmremovegetr.zip)r4rr,_Segmentr[enumerated_spansrZ stack_append stack_popr2r;leavingstyle_id next_offset_r.rr/r0r1r(s @@@@@@r5rz Text.rendersZz{ $--    $hsmm### FG-uz||DDD  $+q 9 9::VVVVEUVVV  y,, !   M M.iter_textsqz !"+E"2"2##JD$JJJ#" ## !         r7rc3FK|]\}}}|z|z|VdSr9rNrzs r5rzText.join..sS%E3funfslE::r7) rr rPextendrUrmr*r-r]rV) r4rrrD extend_textr extend_spansr[r|r;s `` @@r5rz Text.joins/??$$ !8F+ ! ! ! ! ! ! !n+ o, - IKK  D K # # #z K EE&&3t99*BF&sV|V444v F4LLLL !l^ 4:  AAAr7F)rRpadrrPch|p |jpt}|dkrt|j}||krA|dkr!t |j|dz dz|_nt |j||_|r<||kr8||z }|jd|zg|_t |j|_dSdSdSdS)auTruncate text if it is longer that a given width. Args: max_width (int): Maximum number of characters in text. overflow (str, optional): Overflow method: "crop", "fold", or "ellipsis". Defaults to None, to use self.overflow. pad (bool, optional): Pad with spaces if the length is less than max_width. Defaults to False. ignoreellipsisru…rhN)rRr'rrerrPr]rV)r4rrRrP _overflowrrNs r5truncatez Text.truncate-sA A1A  dj))F !! **!.tz9q=!I!IE!QDJJ!.tz9!E!EDJ /v ))"V+!%;S6\;;< "4:  !  / /))r7c|t|jtfd|jD|jdd<dS)z=Remove or modify any spans that are over the end of the text.c g|]D}|jk |jkr|n)|jt|j|jESrNr+r,r=r-r{rr| max_offsets r5r}z$Text._trim_spans..Lf   zJ&& 8j((U4:s:tx'@'@$*MM'&&r7Nr]rer*rU)r4r|rZs @@r5rzText._trim_spansHsU__           AAAr7rhr characterct|dks Jdr>|z}||j||_tfd|jD|jdd<dSdS)zxPad left and right with a given number of characters. Args: count (int): Width of padding. r&Character must be a string of length 1c>g|]\}}}|z|z|SrNrNr{r+r,r-r|rs r5r}zText.pad..aE%E3eemS5[%88r7Nr\)r4rr]pad_charactersr|s ` @r5rPzText.padVs 9~~"""$L"""  &.N*HDJHHHDJE)-DKNNN   r7ct|dks Jdr:|z|j|_tfd|jD|jdd<dSdS)zPad the left with a given character. Args: count (int): Number of characters to pad. character (str, optional): Character to pad with. Defaults to " ". rr_c>g|]\}}}|z|z|SrNrNras r5r}z!Text.pad_left..qrbr7Nr\)r4rr]r|s ` @r5pad_leftz Text.pad_leftfs9~~"""$L"""  %-;tz;;DJE)-DKNNN  r7cnt|dks Jd|r|j||z|_dSdS)zPad the right with a given character. Args: count (int): Number of characters to pad. character (str, optional): Character to pad with. Defaults to " ". rr_N)r]re)r4rr]s r5r zText.pad_rightvsS9~~"""$L"""  < J; E(9;;DJJJ < >>>> lI66666 7 7r7rc pt|ttfstdt |rxt|trt |}|j|t |}t ||,|jt||z||xj z c_ nt|trt|td|j |j :|jt |z|j |j|j |jfd|jD|xj t |z c_ |S)zAdd text with an optional style. Args: text (Union[Text, str]): A str or Text to append. style (str, optional): A style name. Defaults to None. Returns: Text: Returns self for chaining. z(Only str or Text can be appended to TextNz2style must not be set when appending Text instancec3FK|]\}}}|z|z|VdSr9rNr{r+r,r-r|rs r5rzText.append..sU##)sEE%+-s[/@%HH######r7)r1rLr(rr]rrPrmrUr*rV ValueErrorr-rerF)r4r[r-r^r;r|rs @@r5rmz Text.appends$d ,, HFGG G t99 *$$$ *!4T!:!: !!.111T!.11 $K&&tFF[4H%'P'PQQQ + D$'' *$$L#l :)K&&k;T+BDJOO !!$*--- ""#####-1[### D )  r7c xt|j|j:|jt |z|j|j|j|jfd|jD|xjt |z c_|S)zAppend another Text instance. This method is more performant that Text.append, but only works for Text. Returns: Text: Returns self for chaining. Nc3FK|]\}}}|z|z|VdSr9rNrqs r5rz#Text.append_text..sU  !sE E%+%s['8% @ @      r7) r*rVr-rUrmr]rPrerF)r4r[r|rs @@r5 append_textzText.append_textsl : ! K  uu[+D 2I4:VV W W W $*%%%      %)[       D !  r7tokensc  |jj}|jj}t}t |}|D]J\}}|||&||||t |z||t |z }K||_|S)a(Append iterable of str and style. Style may be a Style instance or a str style definition. Args: pairs (Iterable[Tuple[str, Optional[StyleType]]]): An iterable of tuples containing str content and style. Returns: Text: Returns self for chaining. )rPrmrUr*r]rV)r4rvrurr|r;contentr-s r5 append_tokenszText.append_tokenssj' k( T$ # #NGU K   EE&&3w<<*?GGHHH c'll "FF  r7cD|j|jdS)zCopy styles from another Text instance. Args: text (Text): A Text instance to copy styles from, must be the same length. N)rUrF)r4r[s r5 copy_styleszText.copy_styless" 4;'''''r7)rK allow_blank separatorrKr|cs Jd|jvr"t|gS|rE|dt jt jD}nOdttffd }tfd||D}|s) r| |S)aSplit rich text in to lines, preserving styles. Args: separator (str, optional): String to split on. Defaults to "\\n". include_separator (bool, optional): Include the separator in the lines. Defaults to False. allow_blank (bool, optional): Return a blank line if the text ends with a separator. Defaults to False. Returns: List[RichText]: A list of rich text, one per line of the original. zseparator must not be emptyc3>K|]}|VdSr9rr{rs r5rzText.split.. s;   %       r7r.c3KtjtjD]!}|\}}|V|V"dSr9)rrrr)rr+r,r}r[s r5 flatten_spansz!Text.split..flatten_spanss[[9)=)=tDDE!&JE3KKKIIIIr7c32K|]}|jk |VdSr9rd)r{rr}s r5rzText.split..s8yAXAXAXAXAXAXr7) rerrlrrrrr rJrpop)r4r}rKr|rrr[s ` @r5r@z Text.splits:"777777z D $))++'' '  KK  )+RYy5I5I4)P)P   EE  8C=        !%]]__!=!=E t}}Y77  IIKKK r7offsetsc t|}|s"t|gS|jt }dg||}tt ||dd}|j|j|jttfd|D}|j s|Sd|j D}t |}t} |j D]\} } d} |} | | zdz} ||\}}| |kr|dz } n | |kr|dz} nn | | zdz}-| |kr|}n4|x}} |} ||\}}| |kr|dz } n | |kr|dz} nn | | zdz}-t||dzD]X}||\}}td| |z }t| |z ||z }||kr||| ||Y|S)zDivide text in to a number of lines at given offsets. Args: offsets (Iterable[int]): Offsets used to divide text. Returns: Lines: New RichText instances between offsets. rrNc3LK|]\}}||VdS))r-rQrRNrN)r{r+r,rrQrRr-r[s r5rzText.divide..6sb  s EU3Y!          r7c&g|]}|jjSrN)rUrmrs r5r}zText.divide..BsIII+IIIr7rm)r4rrlrer]r8r-rQrRr(rU_linesr*rangerr=)r4r_offsetsrdivide_offsets line_ranges new_lines _line_appends line_countr| span_startspan_end lower_bound upper_bound start_line_no line_startline_end end_line_noline_no new_startnew_endrrQrRr-r[s @@@@@r5rz Text.divides== ($))++'' 'z$ii 4h4 43~~abb/ABBCC  ,=        *     {  II 8HIII %% +/;% M% M 'J%K$K(;61.sr[r7N)r]rer*rUrPrV)r4rr|rZs @@r5rEzText.right_cropos__v-           AAAj6'*+   r7rc`|p |jpt}|p |jpt}t ||jdp|dk}t } |dD]} d| vr| ||rt | g} n8tt| ||dk} | | } | D]} | ||r| ||||| D]} | || | | | S) aWord wrap the text. Args: console (Console): Console instance. width (int): Number of characters per line. emoji (bool, optional): Also render emoji code. Defaults to True. justify (str, optional): Justify method: "default", "left", "center", "full", "right". Defaults to "default". overflow (str, optional): Overflow method: "crop", "fold", or "ellipsis". Defaults to None. tab_size (int, optional): Default tab size. Defaults to 8. no_wrap (bool, optional): Disable wrapping, Defaults to False. Returns: Lines: Number of lines. FrRTr|rJr&)r&r)rR)rQr%rRr'rrSrr@rOrrLrrrUrF) r4rrirQrRrTrS wrap_justify wrap_overflowrrrrs r5rz Text.wrapsd0A$,A/  EDME5E GT\599QX=QJJ4J00 $ $Dt||  *** 1!4&MM %c$ii]f=TUUU KK00 ! ' '&&&& !!UL="" = = em <<<< LL # # # # r7ct}|j}|D]"}||||#|S)zFit the text in to given width by chopping in to lines. Args: width (int): Maximum characters in a line. Returns: Lines: List of lines. )rrmr@r )r4rirrmrs r5fitzText.fitsQwwJJLL  D OOE " " " F4LLLL r7cdtjd|jtjD} t t d|Dpd}n#t $rd}YnwxYw|S)zrAuto-detect indentation of code. Returns: int: Number of spaces used to indent code. cRh|]$}t|d%Sr)r]rrs r5 z*Text.detect_indentation..s:     A     r7 ^( *)(.*)$rcg|] }|dz| S)rmrN)r{indents r5r}z+Text.detect_indentation..s"RRRvPQzRVRRRr7r)rrre MULTILINErrr)r4 _indentations indentations r5detect_indentationzText.detect_indentations  ]DJblSSS    sRR-RRRSSXWX K   KKK s!A A#"A#u│z dim green)r]r- indent_sizec||n|}|}||d|dz z}tjd}g}|j} d} |dD]} || j} | r| ds| dz } 9| d} tt| |\}}||zd|z}|| jt|dz| _| |dt|| r*| t|| g| zd} | | | r(| td | g| z|d |}|S) uAdds indent guide lines to text. Args: indent_size (Optional[int]): Size of indentation, or None to auto detect. Defaults to None. character (str, optional): Character to use for indentation. Defaults to "│". style (Union[Style, str], optional): Style of indent guides. Returns: Text: New text with indentation guides. NrhrrrTrrmr rWrX)rrlrOrcompilermr@rrerdivmodr]rrFr(rr)r4rr]r- _indent_sizer[ indent_line re_indentradd_line blank_linesrrr full_indentsremaining_space new_indentrs r5with_indent_guideszText.with_indent_guidess$5@4Gt..000[ yy{{ ">C> J}-- " # JJ4J00  DOODJ//E  A q [[^^F,23v;; ,M,M )L/',6Oo8MOOJ#djZ1B1B&CCDJ LL3z?? 3 3 3   $z"?"?"?!@;!NOOO HTNNNN  D   d2U3334{B C C C??4((--i88r7)rWrW)rW)r.r()rNr9)r.N)rh)r[r(r.r()r[r(r.N)rXr)QrFrGrHrI __slots__rLrrrrMrJr r*r_rar:rfr6rrpobjectrsrurvrpropertyrr classmethodrrrrrrr rresetterrZrrlrrrrrrGetStyleCallablerr rrrr rrrrrrrOrUrrPrfr rrhrmruryr{rr@rrErrrrrNr7r5r(r(is      I#%0 .2/3"&"#&*0000S%Z 0 /* 0 +, 0$003-0T #0 0000."$""""8#8888SVIFItIIII &TIsEz!2IvIIII4$#$$$X$X: $&04-1/3S%Z     - /*+, [> $&-1/3"&"#####S%Z # /* # +, #$##3-# ###[#J .2/3  /*  +,  [0$&-1/3"&)-***c65i#889*S%Z */* * +, * $ ***tCH~&* ***[*XsX  \#c#d###\#tDzX \4:$\   V        "! EES%Z EEc] E  EEEE:! HHS%Z HHc] H  HHHH6JN 2 2cN 2+. 29A# 2  2 2 2 2xS#X/CF()C)D))))9ce.?C$  $$$$. 9:;$  $ $$$$V $ }S%Z    :)))) ?s ?t ? ? ? ?5S5T5555; ;+;; ' ;;;;& ;  ;+; ;  ; ; ; ;9 9 i9 c9 8I;N9 9 9 9 v%(6*%v%%%%N ' 'HSM 'T ' ' ' 'L04 ////+, /  /  ////6     t ccD < ? .((((*#(! **** *  *  ****XNhsmNNNNN`T*.2/3"&///// /* / +, //$/ ////b C.&*.& ...c]. .  .  ......r7__main__)r a Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Loremboldipsumitaliczjustify='left'redr zjustify='center'greenrl)r-rQzjustify='right'bluerightzjustify='full'magentafull)Br functoolsrrmathroperatorrtypingrrr r r r r rrr_loopr_pickr_wraprrhrcellsrr containersrcontrolrrrjupyterrmeasurersegmentrr-rrrr r!r"r#r%rKr'rrrLTextTyperr*r(rF rich.consoler[rruleprintrNr7r5rs %%%%%%%%                        ********((((((!!!!!! ########POOOOOOOOOOOO#,,,,%+"+++G$$ f SE8I#6679494949494:949494xZZZZZ<ZZZz$ z$$$$$$ 4 P  D 'F+++'H---giiG LL!""" MM$eM$$$ MMOOO LL#$$$ MM$gxM888 MMOOO LL"### MM$fgM666 MMOOO LL!""" MM$iM888 MMOOOOO3r7