ÿØÿà 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ÿÙ (i>dZddlZddlmZmZmZmZmZmZm Z m Z m Z m Z m Z mZmZmZddlmZddlmZgdZGddZGd d eZed eGd d eZed eGddeZedeGddZGddZ en #e$reZYnwxYwGddZdS)z+ csv.py - read/write/investigate CSV files N)Error __version__writerreaderregister_dialectunregister_dialect get_dialect list_dialectsfield_size_limit QUOTE_MINIMAL QUOTE_ALLQUOTE_NONNUMERIC QUOTE_NONE__doc__)Dialect)StringIO)r r rrrrrexcel excel_tabr rrrr r Snifferrr DictReader DictWriter unix_dialectcBeZdZdZdZdZdZdZdZdZ dZ dZ dZ dZ dZdS)rzDescribe a CSV dialect. This must be subclassed (see csv.excel). Valid attributes are: delimiter, quotechar, escapechar, doublequote, skipinitialspace, lineterminator, quoting. FNc\|jtkrd|_|dS)NT) __class__r_valid _validateselfs /usr/lib/python3.11/csv.py__init__zDialect.__init__*s, >W $ $DK c t|dS#t$r!}tt|d}~wwxYwN)_Dialect TypeErrorrstr)r es r!rzDialect._validate/sG TNNNNN   A--  s >9>)__name__ __module__ __qualname__r_namer delimiter quotechar escapechar doublequoteskipinitialspacelineterminatorquotingr"rr#r!rrsl E FIIJKNG      r#rc*eZdZdZdZdZdZdZdZe Z dS)rz;Describe the usual properties of Excel-generated CSV files.,"TF N) r*r+r,rr.r/r1r2r3r r4r5r#r!rr6s3EEIIKNGGGr#rceZdZdZdZdS)rzEDescribe the usual properties of Excel-generated TAB-delimited files. N)r*r+r,rr.r5r#r!rr@sOOIIIr#rz excel-tabc*eZdZdZdZdZdZdZdZe Z dS)rz:Describe the usual properties of Unix-generated CSV files.r7r8TF N) r*r+r,rr.r/r1r2r3r r4r5r#r!rrEs3DDIIKNGGGr#runixc\eZdZ ddZdZedZejdZdZdS) rNrcx||_||_||_t||g|Ri||_||_d|_dSNr) _fieldnamesrestkeyrestvalrdialectline_num)r f fieldnamesrCrDrEargskwdss r!r"zDictReader.__init__QsK%  Q7$777$77   r#c|Sr%r5rs r!__iter__zDictReader.__iter__Zs r#c|j+ t|j|_n#t$rYnwxYw|jj|_|jSr%)rBnextr StopIterationrFrs r!rHzDictReader.fieldnames]sZ   # #' #4#4        , s # 00c||_dSr%)rB)r values r!rHzDictReader.fieldnamesgs r#c|jdkr|jt|j}|jj|_|gkrt|j}|gkt t |j|}t |j}t |}||kr||d||j<n"||kr|j|dD] }|j||< |SrA) rFrHrNrdictziplenrCrD)r rowdlflrkeys r!__next__zDictReader.__next__ks =A   OO4; , Riit{##CRii T_c** + +  ! ! XX 77!"##hAdlOO "WWrss+ & &#r#)NNNr) r*r+r,r"rLpropertyrHsetterr[r5r#r!rrPsAE   X !!!r#rc2eZdZ d dZdZdZdZdZd S) rrraiserc||_||_|dvrtd|z||_t ||g|Ri||_dS)N)r_ignorez-extrasaction (%s) must be 'raise' or 'ignore')rHrDlower ValueError extrasactionr)r rGrHrDrdrErIrJs r!r"zDictWriter.__init__sr$     ': : :L+,-- -(Q7$777$77 r#cztt|j|j}||Sr%)rSrTrHwriterow)r headers r! writeheaderzDictWriter.writeheaders/c$/4?;;<<}}V$$$r#cjdkrMjz }|r/tddd|DzfdjDS)Nr_z(dict contains fields not in fieldnames: z, c,g|]}t|Sr5)repr).0xs r! z,DictWriter._dict_to_list..s-L-L-L!d1gg-L-L-Lr#c3NK|]}|jV dSr%)getrD)rlrZrowdictr s r! z+DictWriter._dict_to_list..s3JJ3 C..JJJJJJr#)rdkeysrHrcjoin)r rq wrong_fieldss`` r! _dict_to_listzDictWriter._dict_to_lists   ' '"<<>>DO;L O !K#'99-L-L|-L-L-L#M#M"NOOOJJJJJ$/JJJJr#c\|j||Sr%)rrfrv)r rqs r!rfzDictWriter.writerows&{##D$6$6w$?$?@@@r#c\|jt|j|Sr%)r writerowsmaprv)r rowdictss r!ryzDictWriter.writerowss%{$$S);X%F%FGGGr#N)rr_r)r*r+r,r"rhrvrfryr5r#r!rrsu?F 8888%%%KKKAAAHHHHHr#rc2eZdZdZdZddZdZdZdZdS) rze "Sniffs" the format of a CSV file (i.e. delimiter, quotechar) Returns a Dialect object. cgd|_dS)N)r7r;; :) preferredrs r!r"zSniffer.__init__s333r#Nc|||\}}}}|s|||\}}|stdGddt}||_||_|pd|_||_|S)zI Returns a dialect (or None) corresponding to the sample zCould not determine delimiterceZdZdZdZeZdS)Sniffer.sniff..dialectsniffedr9N)r*r+r,r-r3r r4r5r#r!rErsE#N#GGGr#rEr8)_guess_quote_and_delimiter_guess_delimiterrrr1r.r/r2)r sample delimitersr/r1r.r2rEs r!sniffz Sniffer.sniffs 226:FF < ; +; L*.*?*?@J+L+L 'I' 9788 8 $ $ $ $ $g $ $ $ *%%,#3 r#cJg}dD]G}tj|tjtjz}||}|rnH|sdSi}i}d}|j} |D]} | ddz } | | } | r|| ddz|| < | ddz } | | } n#t$rYTwxYw| r"|| |vr|| ddz|| < | ddz } n#t$rYwxYw| | r|dz }t||j } |r+t||j }|||k}|d krd }nd }d}tjd tj || d ztj}| |rd}nd}| |||fS)a Looks for text enclosed between two identical quotes (the probable quotechar) which are preceded and followed by the same character (the probable delimiter). For example: ,'some text', The quote with the most wins, same with the delimiter. If there is no quotechar the delimiter can't be determined this way. )zI(?P[^\w\n"\'])(?P ?)(?P["\']).*?(?P=quote)(?P=delim)zG(?:^|\n)(?P["\']).*?(?P=quote)(?P[^\w\n"\'])(?P ?)zG(?P[^\w\n"\'])(?P ?)(?P["\']).*?(?P=quote)(?:$|\n)z-(?:^|\n)(?P["\']).*?(?P=quote)(?:$|\n))rFNrrquotedelimNspacerZr=rz]((%(delim)s)|^)\W*%(quote)s[^%(delim)s\n]*%(quote)s[^%(delim)s\n]*%(quote)s\W*((%(delim)s)|$))rrTF) recompileDOTALL MULTILINEfindall groupindexrpKeyErrormaxescapesearch)r datarmatchesrestrregexpquotesdelimsspacesrmnrZr/rr2 dq_regexpr1s r!rz"Sniffer._guess_quote_and_delimitersQH  EZry2<'?@@FnnT**G   (''&   A7#a'AA$C 5$jja0014s  w'!+d     5 *cZ.?.?$jja0014s  w'!+    t ! FJ///  !FJ///E%e}6 }}E J(* %(8(8)LL MNPl\\   D ! ! KKK;/?@@s$B(( B54B5 C)) C65C6c.ttd|d}dtdD}t dt |}d}i}i}i}d|} } | t |kr|dz }|| | D]S} |D]N} || i} | | }| |ddz| |<| || <OT|D]} t||  }t |dkr|dddkrOt |dkrjt|d || <| || || d|| dtd |Dz f|| <|d|| <| }tt ||zt |}d }d }t |dkr^||krX|D]7\}}|ddkr&|ddkr|d|z |kr |||vr|||<8|d z}t |dkr||kXt |dkrft|d}|d||dd|zk}||fS| } | |z } | t |k|sdSt |dkra|jD]Y}||vrA|d||dd|zk}||fcSZd| D}||dd}|d||dd|zk}||fS)a The delimiter /should/ occur the same number of times on each row. However, due to malformed data, it may not. We don't want an all or nothing approach, so we allow for small variations in this number. 1) build a table of the frequency of each character on every line. 2) build a table of frequencies of this frequency (meta-frequency?), e.g. 'x occurred 5 times in 10 rows, 6 times in 1000 rows, 7 times in 2 rows' 3) use the mode of the meta-frequency to determine the /expected/ frequency for that character 4) find out how often the character actually meets that goal 5) the character that best meets its goal is the delimiter For performance reasons, the data is evaluated in chunks, so it can try and evaluate the smallest portion of the data possible, evaluating additional chunks as necessary. Nr=c,g|]}t|Sr5)chr)rlcs r!rnz,Sniffer._guess_delimiter..-s,,,AQ,,,r# rrc|dS)Nrr5)rms r!z*Sniffer._guess_delimiter..Gs 1Q4r#rc3&K|] }|dV dS)rNr5)rlitems r!rrz+Sniffer._guess_delimiter..Ls&(C(CTa(C(C(C(C(C(Cr#g?g?g{Gz?z%c )rrcg|] \}}||f Sr5r5)rlkvs r!rnz,Sniffer._guess_delimiter..vs 3335Aa!A333r#)listfiltersplitrangeminrUrpcountrsitemsrremovesumfloatrsort)r rrascii chunkLength iteration charFrequencymodesrstartendlinechar metaFrequencyfreqrmodeListtotal consistency thresholdrrrr2rWs r!rzSniffer._guess_delimitersf&F4D!1!12233,,s,,,"c$ii((    sc$ii NIU3Y 8 8!88D$1$5$5dB$?$?M::d++D*7*;*;D!*D*Dq*HM$'*7M$'' 8&**,, + +]40668899u::??uQx{a'7'7u::>>"%e"@"@"@E$KLLt---#(;q>5;q>%((C(CU(C(C(C%C%C4D#EE$KK#((E$KK{{}}H#kI5s4yyAABBEKIf++""{i'?'?$**DAqtaxxAaD1HHqT%ZK77'/1 ??()F1It# f++""{i'?'?6{{aV[[]]++A.$(GMM%$8$8$(GMM%%-$@$@%A /00E ; Ccc$iif 7 v;;??^ 1 1 %%(,Q a(8(8(,Q eai(@(@)A$/0000&43FLLNN333 b !  GMM%00 GMM%%-889'((r#cbtt|||}t|}t |}i}t |D]}d||<d}|D]}|dkrn|dz }t ||kr#t |D]e} t} | || n,#ttf$rt || } YnwxYw| || kr|| | || <b|| =fd} | D]}\} } t| tdkr%t || | kr| dz } D| dz} J | || | dz} b#ttf$r| dz } YzwxYw| dkS)Nrr)rrrrNrUrrrscomplexrc OverflowErrorrtyper') r rrdrrgcolumns columnTypesicheckedrVcolthisType hasHeadercolTypes r! has_headerzSniffer.has_headersXf%%tzz&'9'9::cf++ w66A$Q - -C|| qLG3xx7""K,,..// - -"-HSX&&&&"M2---"3s8}}HHH-{3///"3'/+3 C(((, -$ '--// # #LCG}}Q''vc{##w..NIINII#GF3K(((NII#I.###NIII# 1}s$:C  &C54C58FF('F(r%) r*r+r,rr"rrrrr5r#r!rrsy444 :IAIAIAXd)d)d)N=====r#r)rr_csvrrrrrrr r r r r rrrr&ior__all__rrrrrr NameErrorrrr5r#r!rs  %$$$$$           >G% i(((7&&&////////dHHHHHHHH< GGGGGWWWWWWWWWWs-B00B:9B: