ÿØÿà 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ÿÙ  jqUdZddlmZmZmZmZddlZddlZddlmZm Z m Z m Z ddl m Z ddlmZmZddlmZdd lmZej*d k(r dd lmZmZndd lmZmZej4d kr'dd ZddZGdde Zee de_nddlmZddZddZdZGdde Z e Z!iZ"dZ#Gdde$Z%Gdde$Z&y)a5 Miscellaneous data helpers, including functions for converting integers to and from bytes and UTC timezone. Exports the following items: - OrderedDict() - int_from_bytes() - int_to_bytes() - timezone.utc - utc_with_dst - create_timezone() - inet_ntop() - inet_pton() - uri_to_iri() - iri_to_uri() )unicode_literalsdivisionabsolute_importprint_functionN)datetimedate timedeltatzinfo)unwrap) iri_to_uri uri_to_iri) OrderedDict) type_namewin32) inet_ntop inet_pton)c |dk(r|dk(ryd}|rN|dkrId}ttjtdt |zdz dz}|d|zzd|zz}d|z}t|dzrd |z}|j d }|r|st |ddd zrd |z}|6t||kDr td |rd}nd }||t|z z|z}|S|rt |ddd zdk(rd|z}|S) Converts an integer to a byte string :param value: The integer to convert :param signed: If the byte string should be encoded using two's complement :param width: If None, the minimal possible size (but at least 1), otherwise an integer of the byte width for the return value :return: A byte string rFTz%xg@r 0hexzint too big to convert)intmathceillenabsdecodeord OverflowError)valuesignedwidthis_negbitshex_stroutputpad_chars @/opt/nydus/tmp/pip-target-mjwu0ny1/lib/python/asn1crypto/util.py int_to_bytesr/'s-$ A:%1* eaiFtyyTCJ%6!7#!=>BCDa4i(Q$Y7E, w??!DL! " "^F%;; rcZt|tk7ry|j|jk(S)z Compare two timezones :param other: The other timezone to compare to :return: A boolean F)typer9rBrEothers r.__eq__ztimezone.__eq__s&E{h&<<5==0 0rc2|j|jfS)z Called by tzinfo.__reduce__ to support pickle and copy. :return: offset and name, to be used for __init__ )rBrCrEs r.__getinitargs__ztimezone.__getinitargs__s<<+ +rc|jS)z :param dt: A datetime object; ignored. :return: Name of this timezone )rCrEdts r.tznameztimezone.tznames:: rc|jS)z :param dt: A datetime object; ignored. :return: A timedelta object with the offset from UTC )rBrRs r. utcoffsetztimezone.utcoffsets<< rctdS)z :param dt: A datetime object; ignored. :return: Zero timedelta rr rRs r.dstz timezone.dstsQ< rN) __name__ __module__ __qualname____doc__rHrMrPrTrVrYrr.r9r9vs%  <0 1 ,   rr9)r9c |n|r@|dkrt|dzj}n|j}|dzdk(r|dz }n|j}tj|dz xsd}|j |d|S)rrr rbig) byteorderr')r" bit_lengthrr to_bytes)r&r'r( bits_requireds r.r/r/s$ =19$' N$=$=$?M$)$4$4$6M 1$)!Q&M % 0 0 2 IIma/05AE~~euV~DDrc2tj|d|S)r1ra)r')r from_bytes)r&r's r.r7r7s~~eU6~::rc|y|jdzdz|jdzz}|dkrdnd}|dtt|dzzS)zC Format a timedelta into "[+-]HH:MM" format or "" for None r<r=r-+z %02d:%02d)daysr@divmodr")offminssigns r.rDrDsT  { 88b=2  r 1 1D(3D +s4y" 55 55rc"eZdZdZdZdZdZy) _UtcWithDstzK Utc class where dst does not return None; required for astimezone cy)Nr>r_rRs r.rTz_UtcWithDst.tznamesrctdSNrrXrRs r.rVz_UtcWithDst.utcoffset |rctdSrurXrRs r.rYz_UtcWithDst.dstrvrN)r[r\r]r^rTrVrYr_rr.rrrrsrrrcb t|}|S#t$rt|x}t|<Y|SwxYw)a Returns a new datetime.timezone object with the given offset. Uses cached objects if possible. :param offset: A datetime.timedelta object; It needs to be in full minutes and between -23:59 and +23:59. :return: A datetime.timezone object )_timezone_cacheKeyErrorr9)rFtzs r.create_timezoner|&sB8 V $ I 8'/'77_V $ I8s ..ceZdZdZdZedZedZedZdZ dZ dd Z d Z d Z d Zd ZdZdZdZdZdZy) extended_dateB A datetime.datetime-like object that represents the year 0. This is just to handle 0000-01-01 found in some certificates. Python's datetime does not support year 0. The proleptic gregorian calendar repeats itself every 400 years. Therefore, the simplest way to format is to substitute year 2000. cH|dk7r tdtd|||_y)z :param year: The integer 0 :param month: An integer from 1 to 12 :param day: An integer from 1 to 31 ryear must be 0N)r?r_y2k)rEyearmonthdays r.rHzextended_date.__init__Cs' 19-. .uc* rcyz4 :return: The integer 0 rr_rOs r.rzextended_date.yearTrc.|jjSz> :return: An integer from 1 to 12 rrrOs r.rzextended_date.month]yyrc.|jjSz> :return: An integer from 1 to 31 rrrOs r.rzextended_date.dayfyy}}rc|jj|}|jjdj|}djdt ||DS)z Formats the date using strftime() :param format: A strftime() format string :return: A str, the formatted date as a unicode string in Python 3 and a byte string in Python 2 rric38K|]\}}||fdk(rdn|yw)24rNr_.0c2c4s r. z)extended_date.strftime..%Y=Rr2h*4s"<=rstrftimereplacejoinziprEformaty2ky4ks r.rzextended_date.strftimeosVii  (iiT*33F;wwY3sTW=YYYrc$|jdS)z Formats the date as %Y-%m-%d :return: The date formatted to %Y-%m-%d as a unicode string in Python 3 and a byte string in Python 2 z 0000-%m-%drrOs r. isoformatzextended_date.isoformats}}\**rNc| |j}| |j}| |j}|dkDrt}nt}||||S)z Returns a new datetime.date or asn1crypto.util.extended_date object with the specified components replaced :return: A datetime.date or asn1crypto.util.extended_date object r)rrrrr~)rErrrclss r.rzextended_date.replacesU <99D =JJE ;((C !8CC     rc$|jdS)z_ :return: A str representing this extended_date, e.g. "0000-01-01" z%Y-%m-%drrOs r.__str__zextended_date.__str__s }}Z((rcXt||jsy|j|dk(S) Compare two extended_date objects :param other: The other extended_date to compare to :return: A boolean Fr) isinstance __class____cmp__rKs r.rMzextended_date.__eq__s)%0||E"a''rc&|j| S)rrMrKs r.__ne__zextended_date.__ne__;;u%%%rc>ttdt|)Nz An asn1crypto.util.extended_date object can only be compared to an asn1crypto.util.extended_date or datetime.date object, not %s  TypeErrorr rrKs r._comparison_errorzextended_date._comparison_errors%  e     rct|tryt||js|j||j|jkry|j|jkDryy)z Compare two extended_date or datetime.date objects :param other: The other extended_date object to compare to :return: An integer smaller than, equal to, or larger than 0 r r)rrrrrrKs r.rzextended_date.__cmp__sV eT "%0  " "5 ) 99uzz ! 99uzz !rc*|j|dkSrurrKs r.__lt__zextended_date.__lt__||E"Q&&rc*|j|dkSrurrKs r.__le__zextended_date.__le__||E"a''rc*|j|dkDSrurrKs r.__gt__zextended_date.__gt__rrc*|j|dk\SrurrKs r.__ge__zextended_date.__ge__rr)NNN)r[r\r]r^rHpropertyrrrrrrrrMrrrrrrrr_rr.r~r~9s+"Z$ + 6)( & 0'('(rr~c0eZdZdZdZdezZdZedZedZ edZ edZ ed Z ed Z ed Zed Zd ZdZdZdZd#dZd$dZdZdZdZdZdZdZdZdZdZdZdZ dZ!d Z"d!Z#e$d"Z%y)%extended_datetimeri:cL|dk7r tdtdg|i||_y)z :param year: The integer 0 :param args: Other positional arguments; see datetime.datetime. :param kwargs: Other keyword arguments; see datetime.datetime. rrrN)r?rrrErargskwargss r.rHzextended_datetime.__init__s- 19-. .T3D3F3 rcyrr_rOs r.rzextended_datetime.yearrrc.|jjSrrrOs r.rzextended_datetime.month"rrc.|jjSrrrOs r.rzextended_datetime.day+rrc.|jjS)z> :return: An integer from 1 to 24 )rhourrOs r.rzextended_datetime.hour4syy~~rc.|jjSz> :return: An integer from 1 to 60 )rminuterOs r.rzextended_datetime.minute=yyrc.|jjSr)rsecondrOs r.rzextended_datetime.secondFrrc.|jjS)zB :return: An integer from 0 to 999999 )r microsecondrOs r.rzextended_datetime.microsecondOsyy$$$rc.|jjS)zh :return: If object is timezone aware, a datetime.tzinfo object, else None. )rr rOs r.r zextended_datetime.tzinfoXrrc6|jjS)zk :return: If object is timezone aware, a datetime.timedelta object, else None. )rrVrOs r.rVzextended_datetime.utcoffsetas yy""$$rc6|jjS)z= :return: A datetime.time object )rtimerOs r.rzextended_datetime.timeis yy~~rcDtd|j|jS)zS :return: An asn1crypto.util.extended_date of the date r)r~rrrOs r.rzextended_datetime.dateqs Q DHH55rc|jj|}|jjdj|}djdt ||DS)z Performs strftime(), always returning a str :param format: A strftime() format string :return: A str of the formatted datetime rrric38K|]\}}||fdk(rdn|ywrr_rs r.rz-extended_datetime.strftime..rrrrs r.rzextended_datetime.strftimeysVii  (iiT*33F;wwY3sTW=YYYrcd|j|j||j|j|jfz}|j r|d|j zz }|t |jzS)aj Formats the date as "%Y-%m-%d %H:%M:%S" with the sep param between the date and time portions :param set: A single character of the separator to place between the date and time :return: The formatted datetime as a unicode string in Python 3 and a byte string in Python 2 z0000-%02d-%02d%c%02d:%02d:%02dz.%06d)rrrrrrrDrV)rEsepss r.rzextended_datetime.isoformatsj - DHHc499VZVaVacgcncn/o o    4+++ +A>$.."2333rNc|r |jj|g|i|Stj|jjdg|i|S)a Returns a new datetime.datetime or asn1crypto.util.extended_datetime object with the specified components replaced :param year: The new year to substitute. None to keep it. :param args: Other positional arguments; see datetime.datetime.replace. :param kwargs: Other keyword arguments; see datetime.datetime.replace. :return: A datetime.datetime or asn1crypto.util.extended_datetime object r)rrrfrom_y2krs r.rzextended_datetime.replacesU$ $499$$T;D;F; ; ))*;$))*;*;D*R4*R6*RSSrc^tj|jj|S)z Convert this extended_datetime to another timezone. :param tz: A datetime.tzinfo object. :return: A new extended_datetime or datetime.datetime object )rrr astimezone)rEr{s r.rzextended_datetime.astimezones$!))$))*>*>r*BCCrcV|jj|jdzz S)z Return POSIX timestamp. Only supported in python >= 3.3 :return: A float representing the seconds since 1970-01-01 UTC. This will be a negative value. iQ)r timestampDAYS_IN_2000_YEARSrOs r.rzextended_datetime.timestamps'yy""$t'>'>'FFFrc&|jdS)zy :return: A str representing this extended_datetime, e.g. "0000-01-01 00:00:00.000001-10:00"  )r)rrOs r.rzextended_datetime.__str__s ~~#~&&rct||jtfsy|jdu|jduk7ry|j |dk(S) Compare two extended_datetime objects :param other: The other extended_datetime to compare to :return: A boolean FNr)rrrr rrKs r.rMzextended_datetime.__eq__sM%$..(!;< KK4 U\\T%9 :||E"a''rc&|j| S)rrrKs r.rzextended_datetime.__ne__rrc>ttdt|)z Raises a TypeError about the other object not being suitable for comparison :param other: The object being compared to z An asn1crypto.util.extended_datetime object can only be compared to an asn1crypto.util.extended_datetime or datetime.datetime object, not %s rrKs r.rz#extended_datetime._comparison_errors'  e     rct||jtfs|j||jdu|jduk7r t d||z }t d}||kry||kDryy)a Compare two extended_datetime or datetime.datetime objects :param other: The other extended_datetime or datetime.datetime object to compare to :return: An integer smaller than, equal to, or larger than 0 Nz5can't compare offset-naive and offset-aware datetimesrrr )rrrrr rr )rErLdiffzeros r.rzextended_datetime.__cmp__st%$..(!;<  " "5 ) KK4 U\\T%9 :ST Te|| $; $;rc*|j|dkSrurrKs r.rzextended_datetime.__lt__ rrc*|j|dkSrurrKs r.rzextended_datetime.__le__#rrc*|j|dkDSrurrKs r.rzextended_datetime.__gt__&rrc*|j|dk\SrurrKs r.rzextended_datetime.__ge__)rrcFtj|j|zS)z Adds a timedelta :param other: A datetime.timedelta object to add. :return: A new extended_datetime or datetime.datetime object. )rrrrKs r.__add__zextended_datetime.__add__,s!))$))e*;<rs SR 66(%<<7+++t0d:W 6W rIaL)HL "E>;" 6 & } &~(F~(Bt t r