Index: waf
===================================================================
--- waf	(revision ac67de78638ac96266ad7c5bffc44f1ef4fa1c46)
+++ waf	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -163,1924 +163,2 @@
 	Scripting.waf_entry_point(cwd, VERSION, wafdir)
 
-#==>
-#BZh91AY&SY»i¯Ùã$ÿÿÿ¼¾tÿÿÿÿÿÿÿÿÿÿÿ(2DÐ@EH HaÌ<û½O½
-À§{9N°iK÷¥¨«UNö|Ö¯¡ªQ§Ñ×£AR»Ï½ÞkC»I$ª©ëÏ}Îqcwt¦â¶ÌQËqÄWZ(PSÑ	ë× z+_T8»k¯²ð»ÎûÜ÷f}p
-}Ý»_;wÇsS·µöªÚú×Þø
-ï¹÷]^÷½æó¼
-@<ØÓ!O 8û¾÷xezzu{{ª!
-@tèhÊîuå¹ @O`jEthÖ:`¢P%{f¥*¢¢¶î ÷Þêúmf\>¬ÞÄZö·Op1^Û;b­úÍöø|Ýoç¸íÙ×¾{Þøî¶Þê7oo{ÞÞºÕë$û=æe÷ß.	ìõÆùíí}o{×:¾áï}±vs4¥>N
-½Þ÷QB©Av4ÐV
-:r:ßoº÷-ñÎ­(¤ÎöôèbIØ
-ÝÚ³*TEïE^Ø^îtv×¹½.÷zqhô¡{íï}ëÞì5T¢.½îtHëºmGKj®¥÷}\õ ¼»ÞéWÜ÷wÞpu¶¯¸ç¦ù{}=ÝÓÓ	'Ë!õ¾ûç9î½¢â}tøß/Wo¾íºî¶ÄË[V\îç»µÞµ
-nÒZºïy¸×6ú;Â÷LúíOyØrö½ÎówmTTñkµ¶Û>÷»Ð>Íá¶·[îR­"ëv3çß;¶¹ëÞõJ{[·
-îJU®Iy½ôÕîå
-:Ñ{gVæyf/{Vç¼öè&
-»¸5(*("ÐÈ
-cT{]Õ7s=µï5#+Þs7vÞç¾î/¾;ª)¹6ë³ª¡2ûAGuíÛÛîúûÜø
-×pÝ÷¹9¹^o/z{ÊöÔûz½ÍÛî|i7RîjîîÉ«ë¨|û9ó6îîPûc!ïsÚÄ×lïV
-ûíß7ÞäÝÊð¶È¥:×»½ëx]»Ü=Ù®õZ9îóµÞ]S·n³ÞPîZ÷ºãwÝÎ¦/|GÜ{ëzºû{½Æö
-0PÂÙÛÝot]ÏÑÜ-c¸y+¹xë³Nô.äû{­ð
-åõÝÓh²Ï(uÒNÝnÞõfÂ×;­ÛÛJ{è ½<½çWÞØ}ï³×=Sè(P{s:»«c6ws
-¹](Ö
-.¶{ÝÞç}óJ(»#=Ne÷!P½
-ìîîk»sßVõÝzZ§[nÍÖ{¨
-o[ÞnáW1¹O:»Ü÷Zóz÷­í¸]¶ÙTní»­´]j
-½ÏTofnÜO]ÚÚÍ/{Âó½ÍÝ¼ÖÜ<Þò®ÈUÙ÷Ã66ÌÏgstã¶Nî¶ªU¯[æú·{w<+ìÝí:×q¼î¯=[ÈòÍ¯ïxi¢h@&M`AÒ1'jhõ5SA @!©
-3@©úe?TÙO$4ÚjõC@4#+ A4Ð&I
-=jz$iêfjCÊi£Ô4õ4Ð	=R i!4LOE
-zA@¡é
- ""@Ôöª~¦hLS4SÉxT~M5'é<'êzSÁLjiè@h#+#+ $ i F4ÐM2OR?E<	©åG{Tÿûæ$·VÕÝ2/÷ò[r*¹j¹·~õm^v¤	_ÚÑ¤P$Ä@@=cøüþ¯¤¯Ý¯Ü?ï¨»Å¯W½­ÅÑg¹5QwI®ZfoÞj^-%²Y÷
-OíIâß1ytHl qFèáÍÇI;qR
-tZ(NÂ½ºãMÝA½eÔÍGdç88Þç
-5½É§¬ß3OfB]îo[²¹ÆÞ<Ö·d¬Vu»Ä0¢O½Æ¦
-¢b¹¾¹Õµ-j-UkEª¤`DEÁ¨#=#=H"È¤@S PjAQqC1-#+A!ëDh#+,H!Dâª",!PA& dMÌ
-Ñ¥KLÙZPÔÁ¨K&Ô¨¬A I(V	-!c
-#+1)I±¤±#+#=T¤µ`ËI¨$±±ªT,Ë¨Í£dbSbÐTVmµ-k)bi2L¢Ô¶mi13L¥M¨¤ZÍfÔfÊ¤ÌÓ
-FLÙ²4Ö(¥4Q%),c%¢¨Ù!610BÁbfL%F%I°!#=1¡C$È2a¤µ$ 	J
-Èh2JIi!$¤ÑXM°CY±!EÈ	
-±1a4Ì¦¢ÉHEE$b%LS26¤*i¡Sba$#=lEMA²#=I%%E ÒP¥$# I#4ÌhÖe3@1hÒlÄ1°bLe)f¢)¡ED)J&BLÕ,ÔÍ3d¤£2£±I3$[ÊHlI¥44Ê#hÊ%3fÔÐPLÆÌ¤ÉHL¢e4h¦T²HFL¤¦	424I	¤¦¨Ím¥¤Y0RDÒÒLm-#$LdÃHÛ@R,eHU¦Ã	4ÈXlÌÆÍ$ii±I¦jLIe(2,ARH+2dd#+B+1Y#+AdØ ÈD2ÈFi L¤eÒ5*6,Ä&A2%%TchÒI¬4£2CBÀKÄE¥#dÓL$1I	(aBÂDI¨Òd2
-K!²µKZÒRl ²HDÉHb6Ñe¤Jfi3(ª©¶&¡³fL¤fÓWñº4
-¤$%BV5RV-Q¡3*)¤jMLjkdLlXYHHÖT`¢MC6¡-Fm&5²£MF&1©iSbÃ$)¶¡fDÖT¶kÙL
-D¥¶5RTmie)0ÛHÉ	H£MeDYchÙ5EFÔ-©-Z²mQ¨¨4¡ ¢#+A£Z6ÅjCm%jl2% 1aJmMcQ²IVH²[--m¦­M¢Â#=[FË	5"Ll³L2LÕ³j2¤Ù&Öj3k4&Z¦DÚT,(ØAk-	¶X¢Á©*Ëf¢RÈÓ#J0£Ba#!CPYÔX³)´)4±Q2R(EI¢ZYR E1H¦e)¦$ÂP¶!©©,$i4¥$jCPQ4
-ÈÍ¢fT`
-4ÌmÔÐ¤Ö4Ê,2V&Ù£"e)ShÉ³6*61`mI´ÂFÂV)JT 1´IHÓ6c34¦ÌTÔ£&¶4ªdÆ¥É²6¢Ëc
-C$ÔM&TÊF¦¦XØ5e$QXhl¦ÚE%²)¨,&F25bbcDÙ$H´XªÅEF5SIFhH¶"± ÖlI5!±YL!²V4l%la2Â´$`-&±`a
-E¥(j5LÍX©$©
-ID!¢2ËmM¨¤¨$¢4IÉDEhÛb
-d)4i5Ll*I£lÌS)6RÔUCI2¦FM#=BÅLÉDÊ"Òb¥%ZI2(Ñª5c
-421 "ÚlPÉÉµJ#R¨¨­j6Ó1i6Ò mFÙ*J(ÂP24 6Je#+lAEEhÑ¤Õ£%
-Ú-5DÍfÍhÔZ,jÆMªfÒËClcQJ[f¤¦Ò£E(Y56XÖBÑ¬IÚ1l[E%ÌÊ,F
-#EImlÛjXÊ
-DIL£cEDÔ6Q-DME­E¬VTZ-¶ªµ±©©YlMaXØj)âé4¨	ØÈPZQ5IZeTÇÇú¬öíç[ò5âÞ¹b.AäKCðÃ9y¸ÆëÝz¼O¤²òî^õWû½ÞÝýOêuëàn§!·ûó£ë/
-mòÏøéôë?âÂV&röídd`iõ`«Lv©ÿ<×ñz®ç`bª?åþßçÌ]lH
-:8:F#+ÈC!å°¦åþ±¤>`ÑÕùXcþyZ±Ç>Z8(ÑéV
-<¼¬câj(ä\:mÊã&¥aÎ¯¥^^dºWÁs{rï]ßZôÛénSÚëg}¯4¡$¼{5àÓüórÖÝÆÿ¶­#+i¡¨ÄÄÕfÅ¾ñyi6»ß·yìò=5qW¦ÞeËÎdþå{ªÒS[é¶ÝGöoõDÌ\C0)j¼¢
-'ÅÒüî½»¬i#=GìuÂö¼j\B	c-`ÙîdaàÀ~¶OõkA¶
-¬á¶
-ZvÁÜþ1÷ÄF¾3)A ÏsG/qÎZÓ?ädÊè£òÿ?ð»ßYÚúÚØÆ'
-B3Î»½Ñ.û»\ôÞÅ}n)-I%Egãºû%½ÛoLÉí³ÕÙ¡¾#+É#+ð
-Bãg9Dí½.ß]af§
-­ròÅkÓÅì¶é^ 6ìQ£$ÆJÆdïâ*Ñ¶ÈÎb-fÝ"n
-
-jB&ÜìjMo½yßñ_â_ÓóÔJ¯È»ß¤ÁêçWü¸Ò£ÛJ4Ûü$cý0õòlñÐ±ÿÙgmf16ÂJ°¹tÛ©¹QÊ»ùséñ~?j½Þ2*Z¥$ÈLtÜEÿG/ôã3=o#+ïFörÈÐ´ÿß«Pé°ã¢²þòðÉ´/4Öç¦nZðoÃe[Â'K	 e#=¶d]µ\æØ;þj¹.(	­j\=pKF(Ï<|2#+mÉàëLuÀññ	
-£'Ùá7cj¶ÑÕØ/e Ø6¯)CéF#+xn^dacpÜôº³ÛÍæ~}ïÔ,®×?Ó"<¤=#ca$
-Éîº
-¯Äï´û
-bøÝ½yu´ù³´Ìhí¥ßþô$giºÜ2Q±¦wã0jxH·"i#+
-¯Nd±½7Wíù]¬ü
-Ä@:âW
-Tùiå/}Ú\n(t
-[UX2h$*ON\
-yÀd¢
-Ê"ÈtáCsº5#=º±;óCmTEîÍY!##GÞAkl )sÙ0Ý[.Ék"½+ñùÆ¯ÀìJô·¿ýNü0<s_áME*
-õÒó×6F'ÍIÒyójé¤5}]õ<úu7Î]£C}Îpâ:xÚ6Q Ôg#+Q¶ä^wIé®
-®ü=µî½»fçÁ¥Yi¦µìµ'®iYÇÎgÅrwWH±wqcáß_îóÛ¸YòjÞÄ|0Dkm,qI¸CQGÄ!ÕÃl:R4Æ>²#+µíaîdLëìqîÁ3ÒAßX¯¬!öYðï¿.>oÝ
-¼Ö²
-A/r¹Qa5YÜÃcÞÁDI"g]aÃÍÚ
-=!
-`ú2!6é46ÕôÇJiû:É
-ØwæÎÛ¬B§î«iKáIp?¿á]ñ×)Q:e¸×¿£ìå3ÆÄ×
-;=<®b6Ä@ØËçì±àÈÈÛz"8¹HÌx×nYÇ¤°Æ¼g1B#+s»¯Ê]ìéð»ñí*á÷BBG+Çü)ÚZy,)áÉ!ãøÛ¿kõÙ²÷[EC¾·¾gÅY^ÕÛ3RcÉSD&ÊÈ?^º±i!ã¬*(¤CâDç#=£ ó!iCa
-eH}¶DR¥1
-Ë¨¿ ÝrtÒÑq¶JÛú\v893U/tB;>¶Æ%0£"GwEÑ9N§iY$ÀüßJlspûÍi4TÑ«hÕq¦yÈÂÏù{ÇætÒ½¸Q¿ôý
-ç×äõg-{÷»óSgY{¿®åSÇÎ^}w#=þÂ¨ØÐÆ{ßjN4¸ùJÙ÷µå­ùí»Ãúi×#+1ZAÈFXA½ô«
-oígÑ|Ú¾¬ùñoR£´zÎGÆMÂ'dm´ÇÛãF¯'²ç
-&I AîÂ²]Û»K¶Qã+_·ôbþæµÙÇÚZ½G'­löÊïV¢õNJQ¸ ¤qýº»íP¼/³iTòpX5# ×±Üß(ëI¯î=ß×½6q¾d<Þ~±¨6ykÁg÷Þ6æOÌP¯ãòñ¦?§0xiØ¿¹Øê¡+&ó4þ$*çBPèÍé
-æG[M­ÅÕÐrurÏPoóùÙö³ßË9¬;§õ¿ÂÃDPDlm÷ë5Ýºdì Á1Ã®­8bË<î°ú;u-IW·y=}íÑ¿B
-ç}
-m¶`¼Üíþ	¬ÿ_¶ÓÅÁ?Å£ø³É¥FÆ¾6
-ßJëJXF¾yðSzÌ°$@¤ê"#=æOcØj©èÛªQk»Ù uã£Ñ¯GÙ¼nEâ1Èm·YÔfßÙðÙ]ùëx`Ú¸G§>{¡[ú³)
-?'Àýßl4L{@ûP­ò»Æ¨ó¯¬É½û½Ñ
-ãÆÈ|þIÅ¼Oã=²¸Ïek>
-y`i¼ HIò×uó»¢ÔÌÝ{]cEhÛ;æ*AçiòÔÖ'aGHà6ã
-ÞrvÁ®ÑF5µð×Ô>1~ð¯Ó3èøosR`Ù.ÎiTLóÆA°HL¼'!.N4íûÔfµ`¦T~aà²`}éÒ­hû=ÑcaÇE`1
-ûiðk#+1¶Æ6¤6Õ~/¼3®)lrO
-ËîaÝÓÇÊSÁ¨.gíÖYó)9Â{³{²u[èDeÊA°ãi¶#+ñã|ñ#=
-åÄõûíÚ÷ÍýQg^xÆv"í¹o"=Ënä=KÚlTëêùÝËðãï¨#Ïë
-W>W®Z£M¯h6Ó­lD
-­í<âøB´E`{HîóúæýµLèA;h¿?èÌ^í¿²¸ac/iô*E©©ûöNY§ñ1ûµ
-7¹Ó¬Ø©Iðî;
-è<ÕöK²¹g,À6tX4=b"
-M®'ÈUQRH¤å×zÁóí]L×xùwªòW©2Þ;¾-soMzÚe|{n¤%ÐÉÈõBÙ6ka~TtdÖ~Ô(ë"ú#»ë0SxÜº ØØîæÉ×w0X(£$~¥µIµ"(ªÄÖESQ#Õ¡CåÇWØ>b£iv×Áú¢u
-;Êkûß-MëøÚ|¬<*8Úeø>!ÚËeÇ³å®$Û~iö'L]²gx¸lÜl×ÛÁ÷ù[~õîY"
-ãÇ5A=%	#=`º¡û¼×;ÝÔ×=¤÷óRjUö(SyjfïÊ,=©®ÍE4èjVÉ(ø{#5p§B%Ì(o_b@BD|9*¿¯÷ÛÐ:ö8d°Hôqì®ÝbeÃ¶%A7£Ìz]¿¼ðâ¶»ÉäÊ´ÔÞCäK¦HXIî¡Å·Ôåúy»ÚK
-¨iA²ý=<°3îô¡ÒuV©1*H³ÙâocKØÃÍíÂ7È2mÇÎA½9«ü&©õ
-ïçd¦Ó¡Ó»Nåmb×fz÷!Ó\Øý®4DksÆÑÕúºßÂAF6Å»i|þÊ®	¹øñx<Só`¥´¿	Kãîâ'Löz]j)ÌÀèH¡vMü|Ö/E/¹Þ
-Ä
-STS=8ÚEÞ5¢Ø4Ã;ÌÜ kòÍ¬M¤ÙÞrÍäQ¨0r'eþH~M|Z6càdÍÃîAJ@S07~Éßô«$EàÄa5H5bÉy¸=t¶Êöp²iÄ?§
-¬Ì#=+FgFÔþ|!¾Vï0ÍíõE±âäe/ÊU}1µ3Hé#
-ðT
-îODïF©u8ðÖ&Èâ}Æ×ÝÍ£È4ÈïYZ?$Ïwø¾bO#=ëõN_ñ¾¨Ru)ü'þÊÍ¶1¶1±;E°|å«Øç|¿"ºÉ6@ÐI¦pîê^ÈÊ/üÎ~~®y¦î³¿2§m­µXâzû|WÏ¤[ä<å
-îÞÖ
-Í£Kð½Ìiü#õÓ·Á7(6O#!ÇÙ»»ØSOf¹ñv&nM¼?J×Øª#=ññ^7Ú»{KÙ]HÉQÞ/>?SIªH	(Gä¹M«»e`P#íNJú0¼t¯ÑÇc~LmOdQ®@k£þ\­¶ðüÝLÇ#9q¬ÅO§¦c×¼+ÙÇ0XúKF=×0±OeV¹ÓúªÇ¶Û$Sé×:ãaÓ0mØb*M=hv¼w%È/8
-$óÙ{F>ÕÈmÅÕÞ@V<¼òºÝ~mðùxÖ(F´:
-­JÅMh#+U(iâ
-Ìi¢Å{2iLkQ(6H(661ÜÈÀ
-ªJ«Ç'k
-
-çVãêëÃ
-ôü&bO¯«éþorú?rsB;ììÓÈ|7Ûû~ÌêX0z9þÞÛ²CÏ}ÿ·ü Ì`×p~âN6ûÏcøõ{S)P ¢9fÝ_êõËù®ÑÐ§Zù³aÛ½vÜÆ^ÚÉ.'yÐ:ùÌ°¡Ê wÀãßL#+3*mcu
-çqæöÍë*:5
-ÊF!óÒc Ö¶¹±IÄl?M:G¦
-hþwN}òà	·ÛMyÂ«Ä"ïºøpö§Êµf
-&[§8FkÉ~þÒÑ»ã³Ô¹<ñ¦
-tr
-ü_Kýkwz¦<°SãU¼ÐUØÏ
-±pîU·4m/Or_¶Çkø Üh=Ü+ñZEÕüúôJbÓ*:·eÁ¡|µ[z¢®a'®øÚå9ÛÒÿõæêm8fÙ3Óú'\S|ÔidõpNiÜ²Ú-#+V#ÏìÌÐôÓÐÙ} |þ1x½ØO
-åã¶³ÒºÅÕÞ­A©
-#â/¬=|AZKÁ#+ê#+o¤QpÃ¿}ok¹f·
-Ü*dd§â¬ª&¥¢¬
-q¤k)¨"µnÛ¶"ÞÎn3Â¼«^WÆ%âÃò¤q¥>PèEµïxê3÷¾þç£ûîíÕ'p¬ý÷×8tI±W4×ÅÇrÎ~3CkO~¤
-²ÇI	L%uÙ$ùØ)¬¥¼³#=oÖfòYÈ>òñììõ?Ø¬FËdþï\Lõr:LG>å)ä×µü´{\¢:3"í!eô<:95uwyRÚ´,¯w-Ý²VA)dái1TÇmvé^W~ôìí	Ýsqm´x¦èí4Cc&MWÆ5ihÝnÇréÆ3ßj¼ÑëÈ^Üjg+¦îG?Cà3µZKNÒ3VQ±Ý½ùK§n¡b«`Û·åÄ?2xî¹låhµZÃ@xh{:09Ém­ub²Ðåu3RPó ûA(A]9í?.t<ñ2Õ ¬àbFµÐj»Q(5{-æÐðÃü·²¾!Õó±WðçìþúM;¦èïjÑáíáªÄ
-°D`yÒ
-¿Ò^]2M4«÷Ò¦ÙI,"©	
-ü¿èíÇ}\»sfA°ØÒumGª¡Q9®SÉèèH²e,XÀ#+Y{[é­_ç.vßëUv} ·ô§tw/+½n]Ìlï#ì¢- çuÊç))½øø
-1|Wvùf:·EBØ\l&n#+ñÇ1:;úW°;é-Ð
-mí1fíc(ÃíÊ©ÇýEâ3½âòwx¨½O.kB¥#=!ï#À¤ëöO~X?I{|¶6º±JÍEÎÖÜÜ©»äsßW¬½ñ#+±ÚîJ×Ø}øó÷ëªÉ·_#=vcþïÎ1Êkß¼5kEL^»´ØØEP%uêÑ¡Ð@rO$Ñ­23ifßR¾IFÁ¼°!Ê=Ñs%×Þ
-=/VéÕ,_RJçYTë®úê¨	#+£Â'}0Õë·Ü{ä4Dà(?ÁÎÑCYÏýñhwKuÅùx$
-¸
-;ÜÞÖV$ó$Q$
- CÊö
-ÿ¾mß[ëÞCÁÄðöðò#+¿h7z#+ÉHð÷þ<He;?Á¿§|z·ÜÍxü´URC²Â÷ðæB
-QÛCp4Ã¿hÎ©¶ì/'Óñ¨rùF­!GKùðµÌÞ(ALö¼k
-¡6ëÌÚB
-&#(ÛìKüN¡kã®I#Xÿ#=éîçË#ûxÛeþ<ôìn=PCtÊî³¯#='øú~íðÝ¼¿ÍáÀÊu °ÁÙ¿¿ìúMú!
-­n¹!*Ag£ê 8fD&ò¤Kß¥ýj@Þ¾4&¡a²$újß_d"â=>ÚøBâTIBåïg²A9À!#+(
-¨¦ÒPPS³D6Gü²ojxE
-6åÈÅPbÚ
-
-¿µÏ05cp(Sóm¨³}ÿlW>¾'êé«þÿßY ¶µZÿø¬Áù	
-£6Äu<6
-¼á÷ø3#=ÖkfÑJYÞéê#=q¿ç?Ä `ßüo¬¦å¦?
-[ê!·¶)æNfaø¸-rg³6]>ÇFüìAû»ì¢å4[NCªÆýE¿ÈôµW¦Ï>wÂüKàEzÚiÇóë`ô$
-¸Ôðç}w	^« Áâ½\eg1d` ª#+£ËÖKæþÕ³#=,Éµø}1zÙI H@wWÇô(¶wçILÙÏ}21j»+ÑÕ¾âwÒð:¹Wþ'õéº
-IÖ±ýrÜs!ÉD$ÈêÞÑ.pF!I¨Ú"cÇ¾~ñT)÷ÁÉÈ¶âIPf¥¶I$K­iæ]?ã¶±xäþÜ,ë>ÿÙÔiÈLHç·n´Ï%ªÏ©ÎdÛ½­oÖvúúÐZVñØYu*3o½(A"p¤BØ°KÐß'Ý¼-v´ÎÐ6å7k|lÂ,ÈÄ½î¨oìy2¯Ór¹õ×Ü¥¨YwWNB@â
-ØåpÅ§í±ÝÂô_´Ö ¹ªkÉônh=
-,´`÷4ÃÛ
-æ©#
-Q`wXÁ]ìíÖÓÖ,'Â´Xµ(sÞáD&ëål
-¹r´vÿGÏFÖq]a	Rmê7ÅË°ÿu)©Ïê
-vjÅ<	SÞ,»¯½0=¶÷Ìå *y>Q£Ý´ûîöë±ÑDÔVaV´Õ:ôM£m#+
-BylQ\ßÞá}+cPð·^Å»óàÖOàÖU¬P#+ù§@Ì}¦Óï¹üàÌ~Óq|vªee®>õRÕW
-DÐ^ÈN;Ûßþ~m&Âø#nfÛÍÚÿÊ¨!
-9ã#+ºu¿ß6=ßÕÕ,ñFt&pt;,é&tÄ¨gìççìÁGQÊ -¥¢¸êr$ ´p¹H¸pQlz©3O¶ùÚÏxLÙW-w«ZPÓv
-p
-¡fö:wÃT¥Þ8÷trì^ÂVF4AðIâ<èF%b Ï~ßÀC/wôÃ®hVG*×dp²
-xeí,tÌ¶þvÒo;Qò°9]_Ü60Á>çßèÓoÓÞùÝY­ÉçdÒ|òý$ÅÑC½#=ïî·¶qtíÊõéÚëÆ¤|PìøçÑDÅæX-ôlUé9ÏÓùÍkÞm¤Ì"å:Ã«Õh4È85âçL£`md Ø¦M&c¤@c$q#2Û¢Öhq²0ùÞ?Ûº8{û­Qßbß²@ ]¯×BI
-d$	GÜ{EJÐòÚ°Â¹Ù¿çßøACÛ»UMÄÛ¸ ÜïíÅ¡¢DÚñ{¨¯eô»m½Y¾
-ÔËÌ`^ØÒ-SK)ãôÈôKØ
-ï¾«Úµîô)Xð·Ü½«­ó¼÷½³ÚhR\c+¦àãÑí°_¢¶(Îû1Ù*II*£8HÔ¢ðý5K±MðAöpG
-Ù</
-ce5¯^¶"¹sçÌi½§½YE±Û*í{Ç©j{"Ñ]ºiµÅ;/5Û¡r0¹EÓû¿#+¤Ê§Xqi9á'¤Ç~½ÇåÎò-C:æ
-(ð«Ò¼õf4 ït½^1ÁË%´mÜñ´Â
-¤sÛ¼6aîhÄéÝÑdKiÜ¼N?c±§f>UÞ´CÉÖ¼ÆÜ(òsdUª»±RïÕål©üÔûM#+êç'«¤«Ö·cCÚ~±½óÔ­yÌÏ9ÜÕúÇ_Ä´·#=ðì
-
-õÓm¯ë}~Fº¾úËB>üi}[ø
-
-ÇôLz_] iF>ïÝî+	"Ì`Ñ®âCàÀøWKR°°NéîYÒN¹¹;êÜS /ðdVÖP­¯RÖ®H]Áv{@RL!!Ð×u^væ$hwnÃåC	´/6
-{'¿Êñ_fËãR»[ç¶È-(
-êkÐgy\
-³Íz½I^/Jé,MX
-(¥õ|	¡
-|oV¬7]ÐC´&ÊtFÐ×+1FzNI?Ó3Ã±Ô¶¦ÐQð»±gÒ»
-Ïrg!_ÊH
-
-+bîÖ.J«mGtckí±¥å5ý6rÑàÑx´aBEºµ}ÐK GÑ	1¼LÄÔm¦&Û`zhÇuãÛ¢ÛJº|6=øÌ
-èM3×Ë#+í¶4Ç\nI¯ÙúôÀ
-E·ñ&÷H£®ß´[úyæ±c5	,W*÷ÄFXhipºÈ_TdàÒ~aÍZ®þzðXä9ØçåsDGJZÓþþJ#+àÄZnRbeårC,Psc1méª4x5­26h9xEÉÚHâ#=ººï^5ô7-7«ºjþbê0H¥B±¸Z*Ï{Sâön]$VûùdÎ9Fý+9×yT8CGÎn¦¯H­}oE2ÅJoDÚæ±¯¯XôÞw%Õé-
-ÅÌ&%TE%#+)§|E$êÁº2ÆönÒÎxSKùËëQçQå²YØ#^àñ(ZÑç5N¸
-¶gø¿JÙFö×z½
-¢Ñ#+½zÅê·¿?Ù×Ï4Ó1k*0#+ 3Óòl»ÏÞ D
-²¡W¿¡®#Ñûü^¯
-]êqöüÞ»ËQøµÛÃ 	Àô¬ÍXÁÁ¡Ç4cDs1ûr6¿>ÛN¼]
-=¹
-K(Y
- >H#=LÌJitÜÇ61D¥t¿
-³ùT4Ú®MÔ`³Wäû+åü\
-?lÝJû±´r­Ð²I	¨ZÌP³çA^Ú
- 
-EàJ#ba)64pÓ{)ÑÆÒc
-ö^eGÝÊÃJ4ùùÕòMV·À3}ÛÉº¤yklçh¼àNéJ´P&µ;Rp
-ý¹{Xb÷(@$ååÓK²L%ØÈ>¥ÔFýaÆ²ðþ>¸ÏK¿:õ2MÝ)
-¬Ù±I7D,Å-|Îãø1áª³+cÁçÏçâGP÷ÑÉ+á#1²Ý$ü8b¶²ÛßÍfE¦&ßc°p}_lYð½(Tÿ±ca-=4#+2qwEZtr¼Ô1k¦ªÀÚ¢r±íf4f¥
-Lk§`×¿l]Tòíêgàî°cFÈTV¨lÜ¤Ø´hefÙA@ÃIQ2&hFÕË#=ÂA`	æÎ0ãêÞ½4­¢âIØ&ü
-	5"Ê@p¹u
-§Þë
-½|÷×
-îü1¼ïPÜ#)¼§4KÃ³vA=ïd^MÞH_PÎ"rõnRKkl§"ázb7i[jÑÓ­µL·Ïèåo`
-­­ì
-§C"­é}n#+C=Ù¢ãÅKÕM¹8!vñ¦'Á0.ûì£§ó/©räp$éj(b¯(èT¢²ÃfõOqÊr×-Çov®&E¦ÖÙÖ ~¥sw-bÐ}YbpùJ#¨¹Ç(ÙuÇ
-ÞÅntNÖ>Jå¼Ý·Ô¯³I¬CF?8²EÖ=×©°Å¾AøKCÔ%K v
-é7¨wLêq8i²Ã~ýë1{Q.Ñ~Bg[FJ|·&&í.ã·§©EJ,D
-"þèù¬
-¦ÇúÐ(»*ïC*Ö¢BfQ ËºmÈsÃXñvìdÝg
-ûÙ£7-µÌ Â29`²DÆÛçZ÷EÏ«!g(C¤C¸ÛH
-¾{
-Xùù/¥jV»?Ó{|*kÿF
-ÔA»"Zä¬y×}h¹ï`Ód D
-hÂÁ(Ñå&]çÙy§«ÍÚÏYï{$ºG^[x®S^°Ðà§7v#=ó¸Ú6#+c¹k\´j5E·*Ý-¦k»>%ºõëtmã:ÊT4ÛJ,ô m¾??maÛÀûqjvÙ2[rUÙ_ÁÕ6PLðáé#=}G¤ôË°?$P Pãéý5ÝÝÑÅýFñßævíÿ£xB
-lý>r¾B®¨#¬ÔºÑZ<b9£ÊåL·§ä?n¡÷Ëv_ï6<ÖþãÔdj ø½G)N^TòóÂgiáÆ§½}?ïúçÃÇ£áÐån»åÔü¿àè¿Òxò£Ë:EIévCÏ;æ7¾&1N'uþ"_ÑV©Ëâç¹¼{hJÑæ×ùdÜÑ\ôÓ|
-¹M(v¸å9éÓ«ÉÆÏ°UÖG=ÎÁBDßßËc¼sV§
-+ú/sDm
-ù÷ç°4#w'mrslêÜ
-& ?»¥_'²àç½§RCm9gú¶ÒÉvÝDr<7ÍËCõaNò0vêÇMb¾±wj'ã@8ú.­\Oï¹ÝÝêwèå×Äçüú¿¯gÕ
-£ÑàÑ_»Tb9Ï£ñÊÕNàfç\èd<èoMcO§°i©â±Q7lîÆé{0	CYA?R5Â0Ói±6iõJ
-óî_øùíà¨>Óñùû7Npf)Ä1#=¨RQp*ÈRº¹Í*ògÌQ¶j#=í¸êýr¥ÙaYÉd`á	Y,?ä?¯·ôvûABö»úíXF¤?æþB(c§@$/ Tíã¡wñø,½iÕ½ÁG0®â|ÅAØà?V¨°ØQ¬FzZ¦Zoes©RÄ¤ýg65)6[²½»,ÄéY/öÿw¶íè#=?U©![
-X1P¸¦@­ÉPgîh£mc_
-ñ«mµZh»nî¶é½ñUù«×ccñ¼h¬×ü?øxFÏØÿB×F7Nï?BF
-½ó÷¹:±L`7DØ~XÒ½_Ð»[öÞ-DeÕö¹û°Äÿv!@Õj< §qÓWJ½Jºô+ojûÛjÁre¡  `FCòü¸nm<hð%ã¾Wvoµüæ½Õ¼Qznêa¶,1O÷
-õçµ>7«ùûß fÞ¼¨m]ô%è~Y}±¿ üÔýv¬¼`øOó4»fÜ» p
-a´²¬Üì×þAµáé>Ê
-ûYô
-ü/?jè$LE1ø'}D®ð·ü³ïäBwÀe°z
-oäÚÂÓ*Mp´éïÅ³í£A?3AD B'1ÿ
-Y°MPò
-ÎyäKóÛì
-Ñ8FÛË-ê±²BkÊI#=~|¾zþGÑß5ñîôÑuLOÆäÚ(õ¤JO»ÿ*#=
-ÎÊIoJ#+>äº>|¿FÑâôðÀz{¿¦×3
-»ÜädßG	ÕÉ,=o¬}òü¾k9nMÝËqÚ½ø³¡ðè~ïpó´¿æQí¯ïáë/èçÉÆU n }(Úºíñ½Þ5k}®ÉÁ×)âY¥¶¾ìÿWåÍã¢J8êÑu%À]ÇÒ'>»$?¸î:gw÷?¿¶;¢º«ÈtÔì6Os»òÐç÷oÇ#+p¬P¤¤¾Õë5åèÍ	»[ã \]#LÝMU¡ÜÆí|¬µÇ&£·óÊÀHÄ2 p,ãÆï2@û» aMzöï^Nÿ?äÖXÂ¦éç\cÀ¹Fd¶ýbÍï÷^,qj"Þ0Zû$®Þè0K
-ÿ*§ð±FHê
-1òÃÐ½ØÅûBe?¯pgÍ÷ûÿO&ÖÖ}8DYÐ_Àñß
-Úd#W©]ypÃ=ñâA#+ÄnZ1åÛÉ;æÎt¸ìa¼{eíh _ûêZ¬ðnL#¼1óLû®\õèeOõÈÆôÔ#+ùÜ¹$Lfüp#tÎõóïJ_ÿ±ø¹zi@"è¨ÇqY É	
-ÊòdCû¾kw}Éø±Ã;cÊ=
-2Û#+Aïz\©" û
-F§÷ü!!5
-AZÆmbõ½
-ØaåïË
-<ãD*ª1ØJö%
-¸t×çf@hÂE±öæ}ïL{ñÒá
-8¸sæ¹]µé§8þÿH6GíóN
-äQ%ßÆÕÞw;~
-¤·v7L$.à"0£U"´LIÝÕ½.¶»æ8æsêÞYÊÅfØâüû;BA5®Ë¨¥Ëq,ØÅ<à3
-DM(ÅÉuêsyrÅ40?Üúy5ýwòû5øyW^Ì~NÏøôÕÙøÞú|>:xáÏÓÖOO¯Hî
-ÝßWôöÛ=vh±±Ã?ïÆ:×+åä#+_Ú]Ýúôëã4Î[lË£|#w
-RÐÂ¢¾Ãã°k¶bÿ:·¾î*¯§sùéÓ®ì°WÐßúe¸0ù_Àø·¡O$Ö¸#+ÝFíz<Wù~:.ðïúãÇ?#=rÜ9cÃFwêjýQ~Ív÷ðÑõùù-ð|qJz¯5Ò=÷~ 
-í
-¾ý~_*0EÝ²¾ßuÕ¸J¬Þ8ÖÝv×ä­<ÑL¾O/[§­:{va¬.?&`r
-¾¥2ÖÞ#=î#+âHö¹ËÑ]9±ð]ªÔ_ãûê£âñÃ0Î{a¦«4j×
-Er[ÄuZ7r;áÝàíªßIÆ\üvðRÁ´VÇw¾Õ5þj©jòÞ©º¾·D·_ºJ<ÙÍHè¿w ã¢ÊªÇjÆn¾#+V%ÌD¹ÕÍõú4{¸rYÝMú<°ºKE$Yóvyô]×Ñf~>
-ÚèÛ#+Y+ýj
-%ï³#â7ð4ùj´,ÊºRØUýU
-]þNª:6{FÐç¤C²ØD9üÏùzë}±>?½ÃO¼&bïöoæûÌý¿#+Úíì­qÉßZ³vróþF++~«ïºÊ¢í×|ÃÀÏêÞÁÄhæ
-¨üz*þÿU/Xr´ÀÉé¶?N0¨}·Û
-ôú[â:Åz²¡øø¶B(³ø0b<IoÝ»Oì®n
-ò÷ÿoHnÉZ
-#¡îþ »ª88[îòßºLï=Û|ÕßAª^¦¿pw?Ï:UWqôz
-5Ì¾|ôç[l
-WkÉ¬°Ï/g#ÃRÌJá&NñÂwl>ú]¦Ý4wºÿí«~Æ[Cùz¼ÿ¿¿×êûL¡øjãï¯l=üß0òsõuTãÏûy¬a
-*}nñÞÌ^}üT¿n¬ÆT%Û,^$d%SÓ$²i>
-/?¦8¼©æKzäÑkÊ¹âQÛo(þóï±Äýøcäa¥@ÓE ?SÅïpfú>OhîDüW°ssåòÏXô}^/W7£GOÈ{gïv®aÐý5IÖòµ@"Q9ëÊü¾?GÞBîÿO?@O	AËÏû¯ä
-Ly¿_#+ kö}ýóÞ9~#ÑûB[§ë¢/@õþ
-{GÕ÷~
-ûªº?
-/rä¯Ù?<³ðÏ#=ÿeÝl·.kG
-Aðäd´è
-2pT#ô
-Ë·Ä&°?øR¤çêÚÀI0gó9÷e_`Ï÷8ZäýÞG®úôDÈ1ìøÌS¹ëÌÅA
-1[¿kí
-.üéÑÇ #=ô
-_îì×¯ìús±Ç_VÊý3ÕI%÷
-ÉÙTï#³÷~Ë©4
-¼gé»+w#=üzG¼?/$ªÙïßîä¦nÊ¼¥¹UZaT>pÁ«²¾Z±À^
-¡YpR0­ÄÛ LJo§`)Èb¿Í'QXIZ·®ù.ñhápôé_gÿ­×UÉ¢<@ÞØm
-%AM.²à¼>µ#+½74ïN,ÆÙ¹·>Â+Íä¢§¯;ô jûwgà2>L¾Í\9Þó3E©§1ÒÕ5òã=eZ>éV×_.êì|2§¨NÜ½CÚìì¼«
-yÂÑ^G"ù<=Ké®
-{}îm3qDâ'ûmýU¯+SÇH®y}Úu`ôoÐýdÓG¦¹×WìÅ¡egw4Ì©Dv[¨W¨XGïÜº7¥åx³KóÓÂÉÀj¾ûõxnýßÙÎ4gO
-»æl
-dKÄUhäÙÎí fÔÕÕ7DCÁ¤6!]£Ù§I~»ýö;énçéRà&9zóÂ:oé'¸àÚ_¬n!MQ
-Þ{#òe
-@[r(Ã)?>Yèûs«¿¥½wGå0¢éÝétÍÇY_ßEp=[U}_s¹rïýoC_woJ#=ÅÇ´fOKkaà:ÝÓ±qæWõû¼·@Õº®_­Þ¡ÛÕÁéÕAÏ³ßHÛz#+ÿS¼¶Ñ
-<c[«n(áoi$»]cøø$*"!hüOWj¯¢îKxAáÃ1¤£ì"(|1¨p]¿,iþ
-ð
-F!¦¯æ
-
-'ûgûÆ²äl­¹ø´FCíÊÃ ÓÍ,A´´G6ô(­*¦­Ù
-¦1U ¨D+æDÖ5qJ%@Æd&,TA¸ÒlO0À²¦Iº¤-ÄVÜ
-ØoI£×h_>bêÎ#+%ÀÍBFuDCøÕháiÖ/§¬îoYÛ ÿü<ô~
-GèQ<¦c#Vâ}ÿÏjÖ£ËÚÈv;Ft,<Ûk!ªi
-
-tàTå·×³ü\÷¯ý[`°9³;0$`KIJÌ
-¶È¨Ä<©+µ8<b¡Ì
-0þò¨BP>ÍSù±OFÚj²¾xß
-½Yý/ôGê
-ÀÉü.ªÜ^W
-rÒsÍÔ}2Àgû¥
-qÄËÅÛM~å?«æðaÞ-Íyþ\¿Ï$Ór/³+R¡eüòûêªªóõR±å±«­óBB
- ~ø)ÈÈ¨âM >ÁÛËöþ_zÇÅÞ%hAy_`ýz34U¯íàÉeFJ°úa»Õ¿ÛN¿L(ü¡Î#=ç9 Ã0Ã³Áû¿o[»úûÿG`yGç¦áÝíïØG#ÏÄ~^g×*;õÕÍ1ççüíäçëæªa:_¶v.B#ÄÙ¨ùÅa×íDä
-þÕa-%ú{@À¯Z·
-+?Ég60ÿeÌc\Ä0<
-2#=MãB1±BÃsÌH=«RwLÔÍ¯OKÉ®o^
-S­
-ªõ½sÑs*eUêíx×)
-M&4Ø1¨¥¬)k¦ÜPµIRcq¨Ð£@ ÁBÄJ4BÁJM
-JÄÆQÒ²ÖéìÄi'BWµ&÷#=olÁc®;¼y©·ó,¼%åy9H£eíò£xMQÈ@¢CCAA6"äYc¦1YbYmMqI®J²(JH3L5¨ÖQÅÅÇ9 CDS\0Ym¸ªÎ$%º	B¨¬Ê&D°Õm[#+7¢¡36AXÅArÒ¨<C¨TFìÅ5#=«&#+Ò%ÖÖ#+©ÈËCÄ*<iÜ(¸§
-#+è7Mgáå7ÄãqºÔ+âÖÙ¤äp"àöKÕÉËìlz}f|>´¨qä®Á)¸83LÇ¦é[ÝôþÏL>P iê´j^{¼)ýõêõº´Õò|Í¯]T­
-§?0³6Öxð&¿B6ËéñÑ}â°hÍoÐá¯;<Ïr-I§iN"bÄõ0ýÙ®ÂIÉÖï4ÝÓ° ç³Æ«ºw%|<ãUüpQÄÊÈìM±¥¿-²ð¥§¯\p
-JÃÐh:#+Ú­P.Ë,
-´Tü^ñß!HêïÇtÆ
-mËNx
-#=_).@@Ôc
-ä´ áÖ¢ÿUÍ¶Ás³­
-#=ÃÜûÚèr;ñÛhÞÃZdÞ½EIÒAU$UUoìaJ·U2	¥,
-£äÖÂ~R-äþØw»S`2ø7 ¬
-Û[é
-#+±ts?K¿ðæ^Á0¿F+¢å]BÉ?FËû9j#=Òé²I×ÏVÜÎ }²AhCHc0J
-Bä'sô|dçU&æQmÉ
-L÷hgfÆ*ÁÁò©ira7ChÏòÏÎ~ßy3*W÷Àc4
-gsÅ#ÓI*nhÐ mÓÃ
-ÕU­+ÑËn Í$2§UM¥Ì¬ª«eB
-!/å¥ÄmKõ*ÕZ
-»FÁ[µkmÑ
-+¥îL¡x#|þ£¯XÒ©ZÉ
-þaªL|ZvJh&Ç*ó¹ä·I²Ä¨#+oÖ£G
-Ë?RÄêJ§J'Â§n»àèZ
-aU¶JµÚÚ
-/#+ß
-ÖÔe`°3AýúY+U6Õ2B8H[i_÷sX÷ ØÊÌâÔ<08©@µýÑòzóöygïëcü-(vt|]ðxÁ3PQ´61¤ÏSy)ë¡A·}ÌØÌ3`ÉóÑ.1Fs%ã7Ù*'
-¾-ÌA·§»uªk##+	æ¥fäq{h|hµ#H¨£C(­EÝF/£ÓN/lØ®®Ýêà¸Ðj¼*Ùn (íÞ°YÛx|	¤¤u
-V®
-úáF¹hµ´ôÃ\cÚ#igç²X2&¹
-³Äx,zÐÍq¼#&§XE¬¬eÁ°cªébv4Ø°£¬9¢#+(pÊjt¥6
-ÎpêÁrÍÅÂc²#="W\+bl{ªb¬BN¸pÒU×ýÏèÿjI°qÓ{Z dAIè@èmÊLÊ¬i@ >
-©Ó;êÐ80eØoÁÓ²eN!³¥
-Q#qrAæ¾7³ôõ¤ëFî«mMúe¡EyTÈ$ !RÐ4}6^Ç°ýV}qáVF~îHXl¸íóhòy*â~¼n`¸SÅMI©ËÖ¤Èyü¤ù×¿M~JÏ7ÈÖÏaÙrºml.JgÂ¤$->·TÇ§YðÓ_F.$Òkä\az8h$¥¨ahíu"84ä	$l¬'ÆG¦ôtN¸þ]©ÆSÖÆN\Ò
-f·T(©[ÃeÌ@wBÕF#+*1Ä¦å	#oNÔ`èÉ9vDúséðÎìÛ¼x5¦ÊÎÀM+(Í\ 
-P_óü0ïÝ[7½Þî¨|³¶óBÿ¯¤YÑßü:e«Ùò'xb>4eãg¶È7¦ºÕd*(©
-MI=
-fÐ¯É':0n0m6cÓVÔ64ú2ÈZ«m¾l1ôeÑ¸SIÈDB<
-*üÄ âåE+
-8¼#+ºöT²ÀÒz±wÝ½4pBñ«ÆÜ¡nclE20ÒÚJÌÔ#X¢TËÓJ¨#=%ÕPUým#*âV÷^'WyÙ`àÑá´X}maè't9ÍÖS
-Ð¡²ÆõcvVã­ìÑ£Z£qªÐÓ}NØ~·°ØÿÐ\ÌWÇ¹
-:§ØÇ£ ¢V²F2±Ô£yoö}ùËÏà_ÉÏ®µíG¯
-Üy¿ÿÍøÿ¾º}q¦êFõS¹5ý&5kâôÓS1h[KbpÅGÊwa#+MtÓj7	RPí%'cá@âÿ/ëñ³¸Ø`êþùp4½ÞSñ¦rî;>þC¬³Ñì)ÁÝy'üMIY°Yã ÆûÏßKÛÜ¹ÚíýkH;¯`/<
-ë£ÈQ£³Ï:ãÒ²èm°Ç¡qÆó}aÛLÚÜÞ¹1ZW¹ei§dh¥ªÀ¶8e5HÅ%§«52µ&/N%ðÌÎ}ÎýÚïU§ù;o¬XQ]nð´ãêº-\²E£RAHIÝµ=µ'Ì:2Î?Ä)1A²à¹k 5±á$iö5¼khMBbÈcA)ØÜ»ë|é2Ù±#=¯B¾!fËçÜDÊJLe½Û;)¼)]w´ráÂo LÐ"8LàI.Lêaþ¦L83¾BÈI$$J8âÅ
-å¾¾×¾u6
-Y t$Ö³øÕæRUc:wk3Ô$%vl&I`
-3S-
-vâÅl¦í¦AEm½Ë\¹ú#+Ú#=Ô%1PîÜ6q5¼wv1 Øw³n&ô¨é¬ÌÝ59áY<$Vxd¬ó¶7·,_	³´Ü(¬MÍö
-±°Ò
-XÆK+^¡£îªÅÂÝ$Ø¢ài3dAlË{^l=Ù;Z´^äU"öáÉ3x¤¹íW°=ÕÔZ°Q±Èó4.#=äDHô³z¶§Óu¾½ÿçÎH>ÁÓöLs×î¨&D{ìÒIÅQ3(«JUàjâæj! ¬tUS÷·Í<æÍx#Þ·¨zÜµ°å¥ô]W°õ-
-E
-]ºâÙ
-aðFñÕ±DÛXÍiOûðY¯oeÎGªu4Jdó¶-td8ô¹ã5Â~Â%Ú°¦Ï1?ªõ:|
-2Îð'¸<ÌujíßSsâÂHD!Ð
-*,YJÐ÷WâLHêÊ n"åqÞñå©Ë³BI
-á6%¸6évëÕÝ%{!2CÑJ<.ßÈá52³îsÎ&ãÕ$¢ÖÐk²ÅâdKN2[¤¬g9©ËÄ¹
-eáZ©kÞÂé§Õ#úµ=´Þý±61,¢U'zo­]Ç,«-òQJÛ$é-&-Ã±ÖJêêS?ÍáTÉe¡¦¸w'­1á!®¥Û3¹íë¼^¼j7¤±Ó§ÑLÓò¸4~tCKlÆ$É1»¾¸÷]*Î3£M2ÃÏgÂI	ñåUmn%c~~³Ñ¯sè÷Á¿Ó}âÍ]ý\3ø9:Kè\o¤[S¸8\M8é`íö	ªÄ¹EÍnÌº'8ZÂ2ªæT)[ò40evìc+*Ûà:¿?¿øú&j ©HCÜ
-q
-T MMÛ¼gÂQ?°ÎET\p¿b
-âí¦w·´(Ä7?ni1úfiáó}ÕþØ
-Ñ-ï¥äÐW¬·UáÚ^È@±T÷WÙbÞ75÷#¶f]2ó«8/Ëý^±Äùoºê½S¥¿®Öt>
-N¢Ð·«X¡ï
-V3âÍªröx[n-\<ß
-ÃÜöZ+ô][~0ïñ§|X~2ª[Çíàñü®×:9wSµoêÅ*¸è¶ÉP£1özªøÎ?-Cî}_¿ví¤qG"Ê²ÆËqjKp4DG®5Ëö­u,3Å,`¡B§¹wìp|PQÀHÞ 4	AjsºuHw#âR©aJ
-¯öÜãhéP¢·ÿNzek0Ï.C
-aí'tÌ[QBRmÈ&¤s½yôcì5|'Ô$;¼³z;Ê!¤ ãòFÔQvë$»8AÚ_Ýgùª¯'\êÐ5°¦ó¨hû=ip$@à
-iDF)Y#+/xÑ#+¶bé+@æd$A¯2ÔÐÙÅÇbìò ±B$¤
- ¼'usÌÿoñì×;||£m?Ã¾)àP¥Øàs¶üôÎ=ëRø ú9Æï(âÞ÷©Õ
-QQðÄ
-ÓVé¯¢}Åc¤½®ÇºMºZ=
-¹×
-ø.¬å þ¢x*]é¿ªÈ×¦¹§Â,ð³ÞJLªðñÙÅ÷}´T|
-Ò×k³ÐÒûVÆSµ¼§j#äN×µ'ßÓÖ'(É|ñªVE3£¦/2[Ì¡1L{MA h·P#+ÛjÆ·ëÞBRO^åz ±°êì®¶í	:H¢Ì¨~äÒO
-$À%+ò,.#+eaånÓyïTÒ=³>tø~ïtYèvl
-·ðØa¨üÓÎ°Y¢Y,¸§}î·ÖA7ÊËò
-7Ô0¡³ýØ=Ý9¬{©`u¡#
-ÐRÒåúÅä~fðÉ5³üptöõU¾4>ì.¦aÇgFÞð¦Ù'eê¶
-ûìÂóÛ&|ødDX¿Pv Q,=4áÙ!ÏW¦äe£ãF¨ÉdÃ¡Ó×U²Ûv[ÛÝöÍ°'mMÏ¢J!ù#|ÒCJ	¸¾FRW#Y&H÷!Ã^±XÁó÷³&¢ôLlfÈWôxlmutN¬X20ÕGÈüý6w>ïë{Yl/ÂÇààÙ#j#t±ìy¹ÚÎ²¦ÎK~
-ÒÆ¹¶I?£OÌï0Sµ¬º´búNäm
-¯Â¨¯lüLðFÃÂ8]sdïszÅ-¥E÷£u9HtÃqQB!2è¹ùt¦;#¦, WPv¹6ýæ½¬}å¿à6×DÓÐcmEW:´þ¹«M»¼¢OBÞb#=k¿{#+q3±yÕï¿b Sè#Q©ë¤Û§x*ý¥"ªÙ*@¢$wÏ«â¯£»Z
-ÖÓî
-øæÝú`ÒÕ¬ºt<ñ|#[ØêZÃèDH£ÊS§Wt
-J
-£¢Æµ¬1#=m®Uèh;ÉØ¯ÍZ#=	 ¾#+®Ft1°Beñ9%"îø´CËÅûa+ßO¶Õ
-
-%e³ÄYÚÒRìö9í6±wÌvz7[\¤×úYñýtFU=É¨|Q&Ê
-»Ým}¯6ÝÉÚ´aG7CªIjØçM²[ê£y
-Öføï©³Æ>îXltò!ÅÖ®$·O¤Wn,InÊfÄ¨#=ê@î]J;a}[¯{§BÌëY¥´w[UQ#v×x;rÆf¬i$ðÝçÍTËëF­¬¡ß³¤_%5OÇ±kV´\+HS»FuÕ Í5Ðø=q%Ï#=ÚiFîhxÿLö^
-×
-L
-Ùa£NBza0me
-}Qd©nPÛ;-$öÇç¯8Öä1O]·=5kcü.Ñzê6áìdÔ¡
-º­½áyÞqèÎäi-fJ6.$eP×ºv[9r­âL4iÂ¦ØJ
-³sN(¤Û|å2òÚ_«§ë:ßìèsYÖ}dµ)ð^cªM§N"l;'[ø©VóÊ3±&u(®Ö!@$,	¸9§ÝÇî-Bsô¹ü=ñçªòì§§JºîOÂ%K
-#+yoå.¯¸D&Ì­¹®¸óõËâàRzM
-.\q>!çÞÃ¾ö#+Ófø³,ëÑ·ð²n>æò;:e´ØµFQ0ê÷¹4×6½#¦vy,Óyk¶=Zô,
-éÆ¤¶îbzÃ<õhIï3#`_cm8ð
-w~f
-'ß¥A/¯ v»'ÐvªÓBÅQEè(;#=ÔYC5º¥ícÖ
-gÛí,½¾òa@DÀÙ5
-´ÂáDHd¾qÁ^É²x&ñõÐî¹ÀÆx¸©w½3Cììi7t>R:©
-Ðè²tÑ9ÊjMH÷zæ_8Ûrº¾YÔM©Qj:ßîÄD½zÈlg7$oX÷~E¼bjáf¡75dWW¸4YËö&:Cil~øxì>Ä	ÝÄU_¹Î-
-ÓR&E
-¥>¼º*pü½ øvÄdá}©æ°ØXK¶ÙètÊÉW8(¼ÏuÓõR0Ñ
-áA[+1¢×¿uu#+§[9|9Ñï!¡gàìôpª6*ÌDÔ2±ëE$S·@ÁÇSîÂÒå[L ±qWêAÙ¨G
-l«µTFt½Áñþÿó2Xa¨,§.¦»¬ps$vÝJ¬Ñ¡frà.åê¥O¬¶£R_)ZÌ£#µÒ.Ü­0õô6û¢Ïn=£ÝoEbÁå}kú#
-Û{w'Jù·¯R¸ð÷©ÕëbÔ8/¾ºÆx&1»]ÚyõÆ#+wæ^¯s
-+`~x$u»íÊTÚýÀeP°Õ|«zÃ¶ü#{Mn`"4V¸­ïÚñ\?8ÕQñZ]ßQGé[-åÆ÷ôÐø§
-cd.×
-6úöÿ'~ËW¦#§ãU7Éý4ëWÕõ½ºíS¸ä	ý6¾1W¿r
-Æê;{~0'SàÛdR/\UÁÎ
-Û`8Qvíòc#+ö.+Që8íUµ@i¾U2X¼¥Îë
- ]aWy ÅÈó½ÑÖÂ6.4	?Ë½Ñ
-Ò=W
-â!O1D$ß®'î\T²ãß>>Ã>{Í³¢Ö¾ò·uNUßÝEÒô½CýéøíísXÞóº+`¶
-ur1ÖÓëKý×öâ#+¶Änèïöï¹IH¨ûQ+iò³Áß³o|C,ÅK£½ñÅR¶Ýø½¸5Í±g±© Ç¿íß[qm®å´oS¤Ù,
-\ÎøÂ!EÓ.Húô¿qü98sbqõÃÑÄ
-m\.:-·ÞÏc}¿ZÑ½F]Ã¤Oáá>©.u­Þ"°=§¶ÅRÎ/dl!_|?NµÐx¼)­c×MYeGGÔ}j/¨º{ìtkãá{Ýæ
-;ÄcÜ¢
-Ä!«\âùße2±|xù|gwTYæû¹Ãþ?¤\ÛçÙê}$t©Âë*Þ·§:3w-}|sùêýç¶GßYöA ª
-ü.dpØVta'@nÆ¤d
-¥&ÅïÓd'¦§9&I5ÍÉs5l}ULÈf7[që³¬1õ.¤ÙÓC²«
-j«]#+ÐøÂÄ®Ûí]´¢
-RÉªÖ£I´®ÑÆªà JEª4j©®QÂ&ÞBÀöNïzÎÖ©âÁOç±¶ÖçílæPlºÑ¨ÕQÐ£îº4Z-­&çâ¤8~Oqö(l }CÃ;våËlªçÜ÷9èHVó¶#=QVöÈU
-pþÔ.×A½Ø#HÀ¥±FÆµ{U
-{#mê&².wÚZÊã{èSc+ñ>L@Êªã`±KÍ,
-8Æz'5ÀL}õçob+{ý*odïÏI¼Ùo±Çiù·
-sÅ$APh°ñÅÎ-ÕZCÛ¢fÛìÑ]¯c9ª\ÑÕµá`Ø8e)ÀÅ£&a±Á0­°sF¸ë@É#+gf¯Áxv¡ÓNÏ²$	BkX×#=ª¿nîßmÞTmÕ¸/¶QÉØ¹í;jÙeoXát+=Kp+5w=ü¹Ï0ð¸+>¥vÃf*á6]¹°°A£L²W_Äi|²5È¬Kè«x©¹a;Ý})7<áMÖcÃ®³ËÕuû7ç¦)}5x·¤É±Û$«ô¿iþ{3¢"²7	i¾w]meÀµz®±áÜ!Õµ¡°½éï|Úo]aøùÆzYÏpþÅÂ²¯8,û®pÉ:Dlyfÿ^qìø©Juj¹ÅÌÂ
-=lÌýnÙßKùXÛú3®}ñìÀèGç
-d«{¾û[àq¦
-èüæË¹Ï"Ùk£;Ô¤$½líªâwMÎ!°Æ},UO¿s<9óX¨Rý3ã|ô÷qùg¶è~"	Çâ«\½d~
-ü4®8ñ×wâø¤áaÄLbmUOIëZò_zcô,þÿ9iò¬Æ`®²jyxÞ:à¼ÈB-=¾0ùÖ~Üû7¾rtÕ5|ùæfÿ5KÃa#=ï/+Ò>OëVvk	×ú&?_mÎY]77Q¼rG×ÎNq|UËV#+nã·u·g
-+µäsÓZ]8	Ûx«è;G;5¨eânfª+È»KF-<u<8
-¤Ý,Ãà#]
-¢7 >VãµSrÅ°Ûë½l^
-%"×*%Ò^TË^Â:'7JwFúÓÀùI
-ÄR¨Õ'H³Ì
-,
-Æõ
-NÑ*Ò3`èf¹GC£!ªUþÚî
-s1#=E§[ô#=ï4V.>8V
-ì99"ÂË$éÙCÔõ|6s¨$¥oÇs¬Ó"ÅE
-L&IÑRT1ýä^yH~3lx*+RPð p)Øo;È	îÖôx(H³!Ï¯TÞõÁPlì¥gCöX PÍAYÆêé
-®#6ãe·¢õ«rá~þrjË·±;F-VôÈG}bß:ª#+Kà
-£¸Ûb9¥ÉÆ¬Xý[¡ü4ZR¼ÚYÝ¸V+1EÖE0mrQbâÜÅT9QÝït«sÇ7Xçßãù8Wé£óÏEßÓ^ v5|ö¸8
-*.ójAwKøëw
-CÀhøº4SÂÂ$ÄÉwð^[\û)6s¢ùÕXBô©]ÑS5Íw[³øQãÁ§ÖF/¾4¹Ð|ÈÍ%#=Ã9ãkðsPí/pëª×º7¥÷U
-)]6
-ñ4u^×
-1AU"çÞ|rÊ©T«
-¬xÝïJ]
-þöd6ïëzO®½]ÿ²¯@½Ss®zµ
-²²3uË(ÝÖEr,5ÑO­VomÑ\7­<Ê
-u;ÌÒ
-N®O{T¡Lndvn$Ëm´W÷/#û×<^ã>rç«¿òÝËObÓ}U,«Y°²Ú[VËr]×uAçz¬WÞêÞ]ß?|
-Æ+DY£os¹×PNHõ^Â¼"Ìh	À5Jí­ã#=%
-¤âÊ¬¬Á]¤qMa!Ksõe_~ÝQ¡JBAN«ÇkþÛÇ8$ÁÕF`¿&Gkè[»Tü^~U¤Gòòß[èb9ÓÌçÒä#DûòëoâX29Bê#=·¶.Ú×3ßÚ#qÖ%C©t¾yG´ÇU-À
-4²!DÁ0ST#=ôÏKÝBeEEt§"Nª¡°BÝ¥Ø_)/Õ8uæ<b¯ê#=,zL¨¹Èî$0Áé®`ES	+'N¸ùÍé0^mªÕ;º>]ÄÇ6¶~ËÏÏÓ
-tîæ
-
-þ8N¾§)$/ÒÎuUîxg\^Rçáx²UÒ¥µÎk_ý
-FÙ·kò»_¼ÚÓ~õQø{z;^òD@\Ó.8¹Q V+An/Jéé{üó®°ì±ÒÉ~
- J\#ÒC|ÑÙ¢Åuµ±{æ-Åó
-ìâ#+±hü»û¼ík
-FòN¤Í.¼{ß5ú`ÌhVV.uQ}¼KÔAóUÌÁ»¿eô³©òSæ` ·hvÁp$èï[T@kà	¹£V\AÛ·¬àéolèn=)¤ÍÓ?õ®_áAdÉ@¦SQîù:^ÆÎ,
-È+,	3P
-(Ç'Æ!ô7==AÂñÁÍY¦·2!Ü"16¥ìñL5Ùfª)Öll´Vç
-09MqÒdhþ+yv¢«X¸
-½+;ð"ðFêËè¯ï¢É¼XYÓìÞ=yl5_û"O
-L*>&l¯ÚÜ)í¬Èî%*|Êýf×³#ÛPÆT«£Þã¥?nbsî±ÜÙÕº
-vGÛSÕÄúaÚÈéÇj¡1¡ñrDaÜç]Â,©ÁÐèÑõyY^²â8O4£w
-H
-ÞO½o½î²6à¹=XÐHYþH,tå	>­çãiRÞÒäÊ<PÍt#+@ÁÒ\²´Äíå:KNÿMø|^û
-ö³6·]Â k¤ÒyóP¿ÈöÌJ¢mô2UuYÅjÌ®
-ÑcEäP´Æ¡¶Íj­y"÷¿Tf´ÜZ{Ñ©â]o8ì).1 Òz¯
-_Ë)é-ÄÑÖÃî­ºúaDébc¶´®øìütëC(×
-Qf&ýËny½!<`Ì4ÆÍ4x°ð2@I@@%#ïl¢Rôf- ùðF_xg¶!P%%gòÛ^Î{ÀP;ÿ«÷#=¶¥\úT$JynÁ{c³]Ñ5û;õL;¹Ç8 EõÙPuv¤øe ÔdL¬ô*ï#-ÎÛæ¶4úÝþCîêâ©+
-á
-#=­ýnÄ1Ü¯j«Õ&âú¡Õ°/ô$aXfÇ{3HC§Þj0E&BÊd©S9¶;ëCÔ2-de¤&1iíå
-´·ï{
-×ìâ^OÕwú=6´<;Æ§ôSÂÄ¸Ä2AT¤^¤ g)cÖ2ñ°¬Æa>µËOsdÒÙiIµT°Ú
-&×7±"
-·àÎ$q`¶*ßGy8ØÙÑ|Uç£À p+ôxk«¯µgüß²äÖ4À/Ê¡<D}¾
-ÝèÏ¾MÆ>ØÆ3
-ÕÝ
-Ò
-nÜ(a0B<¥ºÐcD¨Ãéçù¬â|ì¹zà¶èñ
-à?óK¹¬Ii#oÊ¥ ©Ed$*Òk3öÆâ`@ìû%}å#=V°P¡pQý¢è"yÍÕ
-ÓfFJnb$YB0$H@2Dé
-²Q°®Â#+Õè'êÊ¨t8Ïzwïåk·»××¶¬¬¿©ZÂÐ l¬I#èä®@ïB[ñzzl
-¤O¨	yþ0tÓAõ{óöCªÙIEgW)
-S¼C£@^Ä&Ì
-*{ÀâPï U	!f¶ØøæjìIé'ÒWó)Aé¶¿V.Vþ°ëm|ðû^LÍ²WÈ¹G ¶]ÒÇ±3b¾¼V¹D !áb[nl·[h+ö²nSíÔÓ	0²KÊì7#+
-;Ò6®
-8LcË-
-éqD|X>ò
-SÅÿqÞù±¤Ï¬ÅÁÄb RHËÝ¥ÙçôbÞô%èÖæ16¢Q¦ÎfSVf0ý]½÷vt0
-Kv{e1®#=fJ½k}ÖÓL¥­J ²à*MÆÑÃ=¿ùû<ßq*æx.%ZjÇÓb0¿y­pÆ\Çd\rQGÇÙ£ª@ûíÉMFtý½ÿ6·[è§ô6^ªMwácù¸vÐí¢9ûù¾Hj@£QnÕ(¦Øö(TõÄ39¨_Uü#*&ù#ûÏãCh6V(C`jöØ1 ©h<5Ò!ò¬Á¡Âò:Ke¦
-2Hf,¤º	*dk%yØfÐ4 ã#=(Ä(7CÚp0Õ ²&(¦n¢>K÷z½¦s§
-åXEâÅvkÉÅªa%.
-£tIÙÊIYÄ-çf¥
-åÒ >OÛ
-ææ1xa&°vBdúÂTlÈ
-0ÊÍmßF:ahêÎÊ}1ßc¢AãÆ%X60ÄwR¤§eû²ý^^ ¿nÖïL¥ÿ =é%BÞ¿½éÕñd¤Ì¹æÂý²PIoX³ºb ¸í¦;~t
-éÂrOB½½WÏãÄãkW1µæ­>°üñM
-o)Óýk»ãzìî(ÆFQ´m¸bò'ðëÕ1(|Ït¼Eß^q`em£HýO®Î ·@ÓNf®»c^O'¬´ò&I!·@èYP4FFz&tD$[ÜÑu(²d(;?QØfÞÖâz{Ïñbr«·Âde0ÃAaëÆcoCº
-ÖìØ5ìÔ .¯!6pëÈ³
-ñp&YÊm$-o
-Ì³@ûðõÚëÆ¤¬	5±xs¯Þ+Dnûè#=9\ëlÿ
-
-MÙ~4ÔÌ7ªt²C&	Vblð¶J¾±ÆCÊa7ã½óö\ðçÊX]Ðí¢
-è-}üZð&±vvBE'*lØÜºï]å5ó£çõ¢Y3#+ä¡ èFDwÃ2®~6à+	Jt¯¸3y¬±ôåÈ^2áìaMÈ" !	)0PSº$M=#=ÏCX:»cl-Þâ=¤XÚ·HÈ+d!È¼PsCfs``#=
-ÊÁYª5µ¢i{ÅùÖÃîH8b¥Ì7­9¡³#=&SØ	­JKÙ¨­d,`«Ë¼gxyÁH]µÚôpµ`6»0Z#;Ìâs³°0¦i/¾Î#[ß
-ýKnåÁÝ0M9HÕ8QêV!}6dØÃL1¢·±æÆüßí/¶Â§n@}Û
-¾Ëó²ÖnÈg%òÈñä.tTÖ¢áà¤
-i7¹pDÌ¢zû¬ÀëÇMî¿C1É-u|æÜÜ«v+á>ÍhMónx÷kD
-üu¶6é¬¯òëÄ-<¢ÔóÌ®[p,p!]ùño*½ÁòL}ic£Gg)ãÐ½|DfÜ¼E	óU¬{#Ö½äfw`4sïl2n½R(!%Ø«Uö?	a /;vX
-ÔnÉâ¢jã·ÔxöÞ9Ó~¡3$Ç¥Ï¶ìEIÔû>x#=îÙÏ¼×hÐ#+Ìlð#=jÚU]Ä<0ÅRC
-
-kÒ¹×!Po´!èl
-ý½4/s¦ìqø9_ê^ÅAvVSjù,a£×&ò(õ"ý\²kÍá´Jºhã_2æ#+¡Øéòs×³@/'¥ü-í,ÇJºxÙÆ1D#='|iK!Â
-=}YAQÌ"©Ø6
-6ã§VN®µ*°¥äÖæ=³×í	&`¹²"ja{&û¸Ï{xoÈÜ[iîüòy"gbÖ:4S¤§Êcó·0.´Ðb
-ý¥`w
-ø^y<Æµcøß³1ë¸²,¨q¤
-lÅ&"J¬)Ën¬Â÷¨Sæx{ß- A·E×
-Ú$ú´é}ÚÇxv¥èñ@y ì
-k9øúõk¹qôx§=Í+<¢ñâæýgñV#=hn7¯OHlu8ûâ|§ie*°òóßÀër
-¤È£
--y©T¦#=-~bUtPhØ½S.§/¾(õ?+3j:«üY¶jAâì(pkù½.x^Í6&°áT$-2²çÒ©[àÿ=W8Õ9D´
-ò¦wÖ=½¹
-(Nyæië
-eIk@u>iGÈ»ùÜ.]6Poå-ö<,,}³HÏÖµy]6ûs.dÏÍãÑûwÓg·¦ñ*eÏ¬-Õ&YtÑ4Jð{`ôØ4bÉY¬sùäf_}¡uLs>f
-vññçHñsçºûþ_/=_LJMðî#bñ\ñw7ãg±Ã:¥ñÉ£¡«`F8(p{n
-£Wou_7³"°C¤²³c
-Có
-ogS#âzg1¥ÕÐIOó!ILïç#*ã
-ÁW§ô?·¦5CùÖî±R)	VÀ£Dhm¶Ð»þN¢1R¥>@Cì©!¯GVàg?!$aöJD¾?wc2gÆtnù }Eìóæxæqê=;ü
-Gø`wÀø;÷ëá¡I$$î@#+`ÿnQB0ûÄA¥âüçõ¿¬øtz¿OÑö0|cø#ÔS]|µÈ^ø»9BÍåú>ÿgº>Íá£	^ì#¬âGOå²
-%Xç¹[¨°ETgÂ¸üXØxønü\ØÞð`u=æÞ Ãyp 	Ã³'æ¼á<}·½ Ã°ÆÛ@¾ñ#+{Hs¸`ÂÝäHa!JqHéifó'xûåX¾½O2-`V°§!îÁz¦§ÑFÓ ÝOÎ.è×ÚYõq¬ß0vjà>^ü>û¢~ÁõTßÏý×üÚÀÊ¾÷#=áØò¡=ÄLG$&×ÔX¯â|0íûd7WÊyèqHNâ¡Få?³éh¦]]_éìkuM6¿³ûÃZG«¯×8ãh@ÇÁ\¢ÊÈ@`OdÉ,@³&
-ð
-i½&¶QwÐ§Zi`u`&¨¢)þsö8°8m1ç
-Gb&
-F>è!°´,´ÊK¼6ÛBÙq6¼#=ë¡vkÃ`"ÃC7(¦ê0ÌòÙ@>p(¼/¥¹'ßóñêü7ng[ühþºhÄàWT °á9tLh=Yâüª!èÓ«ÁÐýýþÏÄÉÇ%2o07O{éOÜ1ý,
-ï¶­ºìò[¯
-9'{CáÌ^Ê%Zóö¨|ÕC*
-Ú_HHÂ°ê ò¾®Ià#=¦ñüµÞÊÔmlV^°âïl9V,Ä#,bÌ|;x÷æ^JñÏ¸Ãñf
-"$ÆF«¡.nmtñµÖ!":C«¨Û¶T÷ÜË>Î:*Í;e£OôUBmØh
-Aè9L`rÂy
-§VÇ*áÆ>í`Úb}Ä¸Ù:»,qÔÓö²È
-
-\4^ !BÿBÏ´£É:GlHv8Ñq.­gÞ-ye
-C77c[8°/´ö4
-ó^ù¹H
-õ¨!F2C³J	
-ìD9å`¨®Zø:N
-d±CEd­JÊY¿
-Ï}ßo®¿7YQÎåÛd*Ý.|8×¥ÚLöìÑÐ
-2pÃlø$vfÖIìÊà¡¥0L
-ÒJ0M
-ÌèÉ#
-mE*'$WÖht½:_âÒÆGh
-çußP'
-)×¼ãQ¼¾½Â¡hmÈq;!\ô8] \fäàa\;44¾Çbj®þÆ	ÆKAÝ²Ã]4D©PÆ®2
-"
- ù,ãPÙ>k® 3|û
-^Ó|¥I	ÈÏA=;5pvÂ`éÊ¶­]qÙ96tOj
-jtÁêf§¤X§£®û½hF,2¦wGê.çc=f^¤£L'×kÐ	"p_&¼Uò\«%mØ¶²SqZ \÷JªÆ#=H
-"ý?=Ì[H
-R$¥ñøWÕ/-î·$Ó¾öD¨Õ­¼¯"@Ö3O¦qÓ®r9FÕfHQ*JáLÞ¡rr#)ëð2g²>º§Ým0;hò¶¤Ì#âÕºyÒl/Åòé°ÍÈ:HHHÈ#$®G  ÛÊ ¤$:1¨3³$î¨ñé¸\>°i«éÔ·±vEH3BBd~/
-h­$ãÅ`wÐsµÇç(]ßå
-·ØfÚk|fzî¹[pÛb¤¨ÕQC$ë\ $I+²Þ[FsÎÃÏE
-ëw=ªÓª9îáV
-èSê$"`½Ã#+:DA¦ÌQ|<yÛSÖý«(T6ïï*FBÄn;"#+óß~®ØÝtGÝá¼àaùË
-sälÎójr%!I9¡G
-ð×¿1æqàfèÚr`új	Ô1:ÕÇVíuÈ_IÂÃR,YT0ÀÑÎ'-Ôtù7dC60Üø·¾h]9×ÇÓØYp9¯nÀéÀGF
-6×\Ñ5»<ìS5ÑÝgÊy#å 2þ¤v1ÍÙp»É¹É¬LØ.&!Ý:v_£`ô¼Ï:ÄñlQîõßDòíæa§wA²X
-!§T¦ksõ^t-#=(1dN¬°ÈpXÁ9MÄhf5óM
-³Wq0$2\â¶lÛîgåØ4ÌÓl
-yi­í¨JË¼f,dõö Ý/P¯Ñ{ï3áýMÍ{Íj÷xpxC^4T¬ä²f
-Ø:}:º/Ör£B·;ì7MQ
-¢²lb£^I7Ç§W8Ò¥(PÃ¡Z$(£©wR¸ë6À·
-Ë]éO
-Ï%±÷Eoêlna0_H
-jìT.Ëha D¦8îÍÁßÍûI*¦}²ÈBJ
-ß7ÙoME$VmÏÔxÎÜDú|ç¤ß9·ü-üÏ¿FÖ®ÝÑ§doD\pÝ­@è÷^Ì";ÖzCCa
-*!î;I°§/®F.¤"\¸!"Ê¡¿µ'c¡»¼I¿}Q²]å»Çl0}P7¨Ä
-~9³ «còºõsOhÝ"I:U­i/IÔ~º¡®R?7R3D&,mÀ¢r!q¨XáMîcÛ>?}ëWU¹Ô{ÕÔæ^yd÷ÆCvæ}]clß#=©*B
-ðf\ÖÕW¸®9x
-3(â¦z5
-]x<ú¬.Àã[¤\]6m<eBUQê¢ÆlÄ¨<$º¤³8OÑÏ
-ß<Ñ3F(ù
-v7&¥+PBYN$ÿ7·Å:_YÆÝº5/±¥b|!#+ÔAêÅ
-
-ºfHd«7Ïw»¸ec(Ä
-á;DùHHd¯tI
-°aÉ»º°¼$3#+¸m¯g·øÙÓ[Ý¤ê»DðáÁañ${ák	£ÑIkÕwÃl/pÁ38nïeM! I#E>s§æã'g-v$HÍGÒÌ¿R úÛÏÅÎö¼o'Ã!7Wm²,#ÊæMSX,á²ikXÑ
-Çq6ý,1¸ÜmvPß'âÛw6GãÕ¨
-sAHo$ÓÉ0ç~rtéûX
-ô{æ¢lLhM0Üxò,!y¨ÉÕÐûeË,éqÙÂÉy ®-Ô{±]ÞÙ¡5 s ñ~'³}ÎDNà±Ñ
-êåì ÂÅÈ¾·6
-Â·ãârïH°ú:5×b®Å%ß6Þ-#4±h½5ÛdÙ$&½u¯(Ñµö2ôù<
-×td½Id4õS´-#$"tm6Ä¾(ì¾
-rá"¤±úÌ]Õ¨ýý#R|¾^ÝR½ìÇCÂa¥
-ÁÛÂ(or
-ºKæ+ë"ê1>
-¢é»Æb¹5ù±Ü÷÷É
-ÀÚzì@ ñ	¤iÚ¥7µÔ{¡n6APwÚ>>þHi#=Gê;&ì"ñàz@æPi l Hbâè=3øëo]¶0vLkòvÛ^ÿãý ñ>õmõuzzû?wÇö«ÂÏÝÁÐV
-%EÁÕjK¨JÎt®¿×GJàV
-?öþ£Hj2¢júqÀûølÙXø7:é
-"
-4U·ê@f/o;g£èZL[#3vlæ]à5=bzt¼Gç$´f*òoýª21=G0¯IS4Úß7M¿c
-Á½Ø4ûÁô³õûCq=pÙ×4õM(¡0E
-¨-å¨9þÿºtúd(ÏarAwôC8È5%gaj2Hå/7òÃ,¿ ¶yd
-^¦p?oNº#+~?Ì{ïQÙ#:ºLëßzvY*1O6Å÷Íê"Ê(B#+Å;´~ýë~Ç²ïo]f©TªvâÉ`¼éúçñj¿?èýÿÏúf¸ÍÌwõÌø8,Ü
-YÓZjÅ¿º¹UH±Þ¿M6/«^W¿¬Þ¸Pü ¡D³îgD_ÒW]ù¸¨·ç
->9e]yf&OQ&%%ß4)v¸v`LÖõýÚ
-`oå[zû×ÚV¾ù,UT(£XW?»ôùm|òqzþ5Ê÷ÿc¸bEuÊ½zû:ý³ÜHÛ^ëÌÉÔþ¶ú:Öÿ	x¹ºi(ìØ®|×/çûne!P#åkÚºoõx§ ñä%>óyÐ©
-.+ÂÁYË_< QÀz¦#+R«
-3zA=dçuP²ëR!Õ×ÎÉ¯D7ßÐ4]0Y%\©ÉÕ
-¸h¯ïÿc¯"t=¹#+}IÓ/ñÉv9wnµq#·»KÆ»ïÙ¿mb°»àBuá,öpjHñd¯3Åð¹®eÙX½>M858àÒÑö7§#+ÛõûäK¼õÆ
-äJJô¯9ùÄBdF·¶yãë3¬ö@¯Q½az#+Z£ÎQéª I¦D¤ô£ûôoùîìíôxTð0¨e6¾7+üw~û~ïN'iÑ(E=îú
-¨±
-xï[2}_ðwãÎt×'ÇL22U,ÊîSqîæXY;X>¤I*ÌÍ²Ò¢ [hü½~F¿Ôsúw{´ÙïxplX^[ÏèTÄq{ç]îøöõ
-^ÏU/Æô²!ë
-°Ñ(C
-1Á
-þË^÷Ã/ÆÉ§0i¬ZÀ°Zëá Ö0·
-1S@éÿpM´ßlµ
-#=â¶Ã@æðÖ¢©U±_Úç½ÊòééÓÍÀÈ®1æn)æL s¼VÑ©ÛðúeÔO±ê £
-p%þ¯{üs
-Í%·º½^Ù/g²á#0ìË£nÌmwîîbÚÕù®#ÅgÓP¯©ÔW`£õW©æüýkï³=z
- u÷}ÚïÛ¤CÒæòëÙWïü2U»
-M°?eg/s÷ÅK*{Ó³Ð!Ï¶ÇR
-ÃÝ0/«Ò8ºb ##=x Hi7&È:|½.ý"ªª¨U[ê{à Fr ÷hÀ/>#Ä<
-'ä;æi£ëåíåÙÕÔV6çW¥¤çª¯|onsåSwL
-¸ª*ð!5jPäSøô7°;ÝíTóOÉ»~#+â<8èàJáÌª{¹0
-
-¼lÎª®X=¢ 88fê}¨¨Î»Ä
-¾ïåp|ìgF^/tCOhrÎPøvÃ
-¬kvÜîÿïGBñÊº4o¯;4ÞÉ8 ¡B
-ÝêJô?æÕyF·¹Ù ÚI/Vâ&W £§Í³eBÉÊ¢£ppùÃTnVpõ¯£ÐÁZô-ZÚ`Ã!Ö
-Òú}(ßÃ°Ûaó¶°Ì¤
-×kË^ÊîÅxèÌ×ï¼°Ð|*"P
-¾å)²í°47éñWlþï»÷Ko
-uçÌÄªÚôKµ¥Ø
-(8uÌKG
-Ø?ùOÃ³
-OÆæ
-4õ(ñqÅßËöu·ßáÊ®mÓ^79
-ëGÅ
-ð0ÙÓA7®µtîá\«uÞýt4ÓdIÆB1Aøz½Ô{X×èØ/õ?jmdç<pP{0pÔôÑA§¼ô¡¸3È®c¢E|¢mµ)ËE·ö¦zt)¡1¦¿*\=Û³å÷éêÙ¿è#=ÅPrÈÆ¾èl×#+vÃU~ih×X@&
-Ëî@6 GLx·FcúóçVÍZµúò>ÊKÍ½+«Çî(µ¡ÛÝ§~YæàP\¿^?²
-«ÞÂ?¿Ó­u<A 9ý®üÑ§Û;\bÉ	{¼ó·Ëõ(u÷ÎÚ ûkòÅaxúK÷õIÛlZ^
-Y w!-shè.Uï_ÁÁÃCÓ¨¾¥UT*Bäû[ó-º~È½çÝ<P·EHÎ¦!Òµü~åó¢×Ö¼w÷â64\M·×ôb&Ñè
-
-áñ×gM·¶\P$
-»ÆõlÌ¯íÏU´ùnJ'Q/ÌO#=u6QÉN8¶jñætIúÑ?6~.M;dËÞÌM&ÔPØº ô*tÈ¢Åw]Î"ªÿ^Å­
-wÿ]ßíô) øsé¼ñåá¶5Î{Ñ[_E1"#+¸¢åR±Qi,Yú/kÛ{¢Þ/hª¾
-o5V@°¾Û4¦!ôþõQ\¿¨{ùÃmx#+
-à;ããýv
-ª*Y\5½Ø:¸³-Rb:]zNaäâ®Þ¾×Ù?ëØ}´¦æ·þÛ~V°¢I/±t¼
-¨¿cÔEjÄ,((yÄ3qlPíÕàKÅ³iB!ö@ ûåÇ{Ö¤ÅTÍoötûgçgÙøÉ1®ûÆ3øøØídh
-bÅ)Ô5«ªg×HVº+[+#=Êë#+¾²QT!VÆ Qiâ_yÈý:ý/sîß3b¦¸|u×-QÁV*ÍDæÊµ§ø¬wÕæñk:Rïo¾`XéõÅçª4Yûq1W´µwá40î;{O{Ø²WO~&$ãÔ»zñÒ«Éuy§À!ôk¼]k?
-ÏN7ÇßÙ:²ÁXj*ûVÜåtWf½¢ÏO_
-
-AB¨"T§ië~^ày{¹u
-úó/Eòøæd=¶ß,oKÔ¡ZÃÃù7úq}£¢béþå1%ÝðÚ­¤~Ø8¢Uú9-gç
-©x3iØ-óO
-úg<'Sv
-¯OÉ½ÿZe}f5åP¡ÄÏÄÉÏ;ÄVBæ4eU+­¢Ù¬øæÅl#=q±_bIÄîÑd4náÏ·Ó¤ç¿.?k`U	ï1ëY¯2-wu$÷ìÑæg6½°á3Ø>?ªhçíÖq¤Fp$°r.ÙÁ[ECCÑi5D½uô+½·°þqïg?rB/Ç|5*w{×¬ÇvsæCÝ'5|z|©éü×ÃM
-´)t°ã
-m
-ã©ÌBhWYÅíufD¶ÃÓ$~ÍÞRJSòôI
-þÃïï{¡}9ùy_m
-)ù!àk
-éCÌúèôØ|öë®{KwÓîµá#7
-Ú»®êfaË
-%]õ
-#=åÐÕRöÄ]oæò¶3ÆbUA8rMR¤âJÐYµ	TöÀp©R·óÒQïÀ=ÖsöØ½»M
-2õ/[{ªQN8*ñÇ¤ÇúûÒØja>Â-âôíÌ/º»ö¤©bºéë§ .ct'i^ç¥Nã7?
-L>¢uè|
-ÓøaÛËÀ¾}U¸±vÖÝ`©ÞQçbZôNeù{¬z8k*e*#¨´>.Ò+("v«Ó[ ¡ÏF*?B2¼ç¿ÎÓ|@Ârç¬¼;Û~[# /8ûªÛ®âô§TÕz×4V=7Ró\]íµ2hôÑb>:cÂ(W.ìË´û¿°eòã¿B$læÂáÊ#mÖ»<ÚfeYpÉë½ÍÌ³:;¬-Wßãíeãì'lûA®ìû5d
-kÝÞ%[ôâaã¨cqÅúýp¦0<66ËúlÒo~b"*_e+ñë1ì'ò#ôA{ç¶úqÎs#+tÆ±ÌÖ!Ù ,ìÈ,éú¨EÑtBÄ5$Ä³N#=Â_%e÷¹¾Rq!ñÔðÄ;"øòYÑÛª1G/¬¥Ò»qäºb+ê½Úùv>âú÷Ý>¦¬6Ã~4#ê}ìh¯ä¡û<­øÉâ¾¥ËÖvæå}J1òò¢ñÍÖ³)®
-¶w¹
-iå/rÌÝç]¨10ÅDê*ÓK6$Ð[±vÁ$i¢¹H¹¦J\^qS0TÔB2$0¾F
-¨þ
-ÎP4
-59Ô
-ªÑõÑEÄ'm
-üÕDõxãóøÌï¬ÏfÑùºåYE
-úJôüÖÎÑ»wÜû&û1~)ß+Äë@"îýãÉß¦zßÌ»^²°<Ü¢sØIW[¬i­o¿m¿ôÁ»éÓßøÉ¡Kõ#+ÐT5ñrÈÂB2
-qûnÒXËü¶¦ÎêQögn$º~ò
-¥«ÝÏCñâmøÑV¨çgÕÿö%éçcß^TøëïyÞõÃ¿Þ_"ìÀöè¬oÚ~bþÄ]±fÊ|z×_ÑðQä·HýKÔû
-åkÉ(9=ZÖ;ÖêeuSýßËÀ@]þaªy¢^NI8{íörg[Í<¬î{×#+ø0QFX·ÑÕ#§ìÍ¥ÀÓó.(a¿E´8(4HvX$#=N2ñ®a¨2t÷aA¶cxIP/ö:ÂTq<×¡-ß5t!ôòëRwxEqÝhõ¶µæn=Ý/K^#ö8vËÓ·¹Ï³áüy±
-oâ1bôÕb¿ ÚìÈ½ùÒ2×Ôþ:ã5#=ßóN?ÈÿÄ¶,NàDÑj8ßF½á·ª¸Vçá»æÈHH*^ÈgöÙö ä>ÍÞ¿SÙ³ËD±è$ 9°>À½B}jÐÝ?uy^Ð§õöVaÏª
-é!Rd<~±Éîg
-À6mßÚ#=lÖ&÷($íÅþDÄQÎo'£A¦¼øà#+#==ø
-¤V<j&èhä½üÎ¥ÅÆõY©µ©GD"¼T8ðk8ùµ«ìÓ[ßÌßcå¬
-ªÉv¯Pr¤¿e½Ï?GQ=0xpó¹Ó
-¤¦ÒvîÛÝ±OÏã_åø}[/¦g Ýé³#=#=T@oG!$À$¹âQö£Ým³ËÁïª÷é|vgBHFíª÷ß%µÕ)#­w?qhPÛìHRàÄ3
-#=ì(¬õ`ÀjDì×#+pø
-ø7^òh§îÉÑbEÚ
-8v®fØ$"ïõ½}#+ëä
-ÇÇS¢pÿ
-Å=âÎ#=³ô«ëJXGÞ|2ßM}ÎÙ	Tv?´½Ïq
-ãuèáeÑGíÂWOv*Pg&Û»Çw'¿êüøÑ`·êvÇ^ofÛPoÞÏEfèc8®ªðXÈ²¸å
-äßQm^4ÅC;:cãÂeØø-57»}OMæ9CW¦.¤è
-Ï³\æ
-±jã{»wLð¯·¥¸ÕÍÝPM×äð-ppóÔÛªÙÉSçPôt»÷#+ºÇ&ÀÐjÃ×É«>»f
-tÑú)
-å	ÊF¢îáÓVVV)àG¤2!{í<ºOì j)P$
-§(ÉÇ*ÙÆf0­DõgÎ{}?£áVÝ`ìeÏ`Æ¿.ö
-Û9
-¼^ëy[ìûZ-k\ßÝæó{G^²Aíenf__âåg#=I ü8½ðñÀ3Dèµ]Å<YTÓÂbøøIaµ*%Û{ïUT>`AU(ÛÂµG°µ½
- G!ÓÍs½Ûö×¶RF+
-6s
-ø¥GBuÖßÃcÆ=
-í:'oIËPîR_ÃE,£MrsxÊÔBtÎ?Ö«/¤Í­É=Ý*¬5
-OßIÝ
-öæ÷O®ãàìuföË 4z´¯qAá$ÅÕ8Æý5ä,ZNò01V}o	
-
-Â;>v3éÒ2u;mÂáqlU«ÅòËQ*?Kq¹IaÏV½[å5´NÿÖnimÕëãÎ´_òÿC·éo'¥ðÅ_>©ÔTUhy 3
-3h	ü\î/1L%L­hÉÖÄ-øÜáuöªØ³¯ï{;8ºqÍ¼sï~*Üã!9Ó/3ÌðSÙðAF'{ßnäêòöw]¨¯åj«Ø
-×Ëtmelë}D½;yÒ@áTGÍ¿<vswÖþuxôèó=c´[ö{ôxÖ-¾Ýá¶1»¾E°¶æ#+I¶ ¤:1aCDäÖÍö«#+ë¦ãÜ îåÐîÈYLÝ
-9èiÌXq2[ÁÅW¹±Åýåæ¼ÇÒÊØZ9<Ã÷O);Ýe
-ön¡¸Z°Â¬ÝïÀÔM]\Ëq2Æ)h)L­foËÊ4ÿoÛlÀ:
-zuáe
-´Pä?qX#+Ï­~0åûuø{òDw¼èÊÛ^îV­C ªÉFê+%Õ¨ùÍÄ§ÚÐáÂÓ¢@ù}³±QÓç©ÊHXsðíªÚl#I6Å	'
-@í¨6EÆ¦£´b$'l0=]#=xÌU3ËvPçB®Ë© àgò7wu¡ÊQúxv«I©6×¢¸%p¢z<Tº_ÄRY<U¦ôðAÌî°YÊ]Q¬iGR¸WêîöWªkG¢ÞêÀX
-c%
-vþßû®d7K_
->ÏN£ùxÛÓè§ÝÁqæu÷þ³oSbMú.Ö]Ç¯}éká7m¹¿aCüF·F
-«ÓÔ&ë$¦Ê¯ÆØhK¨F*¤t.½&1å²)ßêÝÜµWHEMV´¾Ý£Ûk:Ð,ª)Öi}ñxZµG3Ò)w^ÛZ´D7g/§¢u\ Äf$É}é[Tán|3[#+<u»A ^NÉîa³Ôû~nhK!^VB¬ÚÕ7õ¹5«Ê5
-2Bs
-mºíXR.ÖÚd.
-lè&dòS5·+ß7»¢¤n pÈ3¤l}7×7èÝU]×á¯
-vb'L£VXÏ­w\w¢$ùýY/yñBgVÆít!op¯§=ÛÆ=:°»uµp×âÖª1¥ë±áÞs8×tV:ÓJ<#+5ßõ´s¢Ð×¶ñVÁj_õG6Ü2ÒtÁ,éîÍVçFí,~¥¨t¼bF,b¨Ú¢dâë¿
-bÀÀ8ªËVÐ7Û÷:ÞË£Dùn×=@Ý½"H[qõéÒÀ-ÙB»
-Ýºan×;ÀtYPKCÜHíÑy»r²Z¡â[}¬}w³GØý¶pýE»Ç¢<F»rwnßö§EÍD~-Q¡/uÇm¤Üã-cÖ­í¿®AÊ9ßÐ|ñSÙNþ$zÚQP+ÅQV#+Xsô9[r>Oí¾¦H,çìBk1]}ú
-¡·
-ù±Õp»ÜT«Ë°aÃeOgóz&ar#¦
-0MµØÎc:Nò3õ! V«socë »w#+|ºµs¬P!1
-®­ë·Hìí¾1äóõ»¶/tpù[É#+x½çr±î÷Ú¶ùZð>´&?"ÈÞNN¿.Ø¬ü6ÆZÜ
-]!³ÒX5g%éçåc¨#+Iã¦¹#]ß¯èw«÷Á*½áNB9@5Èi£øZg»^ÚüÁ\GÞW3¬¢Á¦(¥^¥ù®±Õ#³×¾®7
-¥áá~MxîmãÍØ:;õ:PI
-ªßAé,»Õû\ßûØô]×ìLÞ¨ðä±OíXKeÃÃ;ex¥P×.d#=ØÏPÉ¨#=à+êÚÚ¿)ûÃ³¼åûú9cpðÀI@­Ü÷qâÂkxLê².
-tXýX®¸éÓ|uáÇs~ÇoMÑ¦ZFTÏ×4v¼å«{ÙX¢Õòf÷¥Óµ
-oá3Â
-ExÎ5Â"	¦\*Q¼DüòÎ¡Dî®`Vê&ÁY·l_Ë|Z9bQd¨=!*Zô¯e¬ûðvAÆf¾¸Á!~
-.
-n%k+eQ
-P¬ÐDN8î/ÆÛEoC
-YEí»ZÝÁb®Ñ`²Q
-©ª
-Þé¶I¨É
-(0
-Qyh¸;J×tÑ:#
-Ì@'göþôýÞ®èë
-°m##|®_tþ@@5(^¿ÕavÀ.ºu/ÈáO#+§ÛÑ6¼©åéYê¨I$**ÙZdE\Ð!eÔ¡ÁEåÂÚÔè@Þ'ðõÕZw9Î^ÜX#átú¸.Éb¹ãXWÏÏR¿}ówYÕ·ðû#àð?~ÜÔ
-Iv
-ÊµgA?P½?Y¶ÛN76<7¶!î®·ùIÅªÍýüþGçöãì`T*¤¨Cv
-_#<ö?ÜIåë>ß÷íÇùoý§åø¾üâô¡ûÁcûHØ¶~#+kIµþû @`~fIüãej*ê¯¶n"¼ÂCj
-@
-(´p`?ÔTg§ûY_ñÙóçGËqvüó,ð×I´!¡ýû²îë)©§wh0áÙÀØª]'&àENÍ§!:¶B»,LÎ®P¹nþ×®(7¨ý}¨W:
-ÈD5;³Hm¼(Ô7PØ"wzÐ|Zàv<='õO½Áù¾£ìq
-³D=B¡ýÐ²§Xv@»ÚNbfØi
-Ér÷>7Ú:LrÎ´Ñ£ôoztÃåÑùi3L#+	Þñ
-pUCìõ&gg;)¨;8bRõ<Ù?U\#=»û³~²Â2:D+Y1{å	Í
-rçãè¦>$eïASÆÕ÷õøLrãÃ#+zÙ¯±0ý-Ö¹{<«´_àÿM?÷pÌýrßÃq¬Û
-]Ý
-ò»¿u±êDóê<Ø¹ìë$Â0#HÕSë3ä}îNEij¡[qú»7IÚzWÄÔgõ4
-#+oûÙ_oéýÅÄãºj¥£t(ÂP"ç¥ã
-l¤ÓÉÞ?ÃP11°pJvûHoC·PÏ ©#!&ªÃy'î½Ö]¼ì~#=òn,Øg7æ{øGáG :Ú
-D=&ÁÒlæÛ¨BÐý¤SOP¨ßp£@}Ü#+"Ú$dì«¶2ª°*
-.$Ïq{î9#+)FA´í=¥êbu\c³7cWl:}¥¶B«2
-!Ýô8j¦!	E£¤6üà}¬¨ôíö^®)O¤kèbÏ^#Qø#=°wù
-á§µjæe@ÛÂWõÓ§/ú~
-þ½"läÉ?5¢%­ð~vQ¾¹ºlHe©
-èd°º¿î~ñæSNª÷ÿ#+²%.×;,C&$¦^¹Í¦{év<[=,AÇÊ7?£F¬ôIs-:L¯DåËU(F+$÷}^
-ÐwÒR¸
-ïh
-ÉUî·¾à{¢ý³NÂiî=/ÕÂgÝÜ
-=ä\Õ¬?
-ªùßÒÀ\£TGéÕ{» fÛaõ¯óreß=áé!ÏçÚ~*¦¨Púú¹ÃH=ún¢î*CîO#gÅÈÒo@ 2ü.URÃïv#+	ùÜÝÅUBP@
-XËÒjnñäÃ¢ÚG°Ëúå×ZrXïãÆ)ëü:IM4#6µZ!à]È#=eå$èi¡%%Ñ|b$e&W¹Hø4kDAeo{%òØÌôyCÔî ÿÔnz7
-ô§u:Ý1·fôÜÂ
-Èv04Åß¾TE0ÙUfÃêg¹~_~çüa¬þ(ÿÿ,$íÙC'òÿcÁÜsÕUû#Q;êå®Zé4ËþÃÚLa§.Ç©¯¦ÓÛ¶Ø¶Üq¨XÝÆ
-ì_!lZÖ¦!"é¸FY&«ßH
-à,Iò¿ý¿¯ûä
-°úmÂðñq.t0Eè!F
-mË>.y
-,00?Öl>´¶Róö
-l`ÆÓ#+7Jc³Tå-øß¢À°#+l»MOÐ°|·êÖêÜì5ïïi1\H
-
->(eö}éÅ#+_@úní"*ãÒ¦³b~½ÆJaµ 
-ÇyÆd
-ËÈyh
- À¸TMý¥béÑ)î.ÖCUtPNÚ¢Ho¦££ÂN&¼HES"±ävSµL¬IZAhèLNó¿À¿hdäM1_pô÷I$jåý-U$í
-Í&¨u ïx\Cù{^7C]#Òbf^µz×#=r30
-X°Ô#+Ã½þn{xõ'ð¹ÎÛP ü
-7þ£õãN¿É©©!
-6WµQXÑÜ|É»nÖñÿòY
-!ÆÅcn¹¾Îñ\
-zÖ¬zZÂ7Ýê7& ¸³zÑÖéÄ+bØ1éMñ!ÄÓEqLìÓÂ[MfbØóU5\hÇZu¢ïA»qõÖÞ§
-7)Xfõ*»o$KüMpÓ#+µ
-¾ïx< 2¢§çú~@YM¦XØèú§ëú«J#+Ö#sÅ±>^
-æ»Âõ#=}í|ëã¯²yzùÞZÚ
-ºáº¿¬1B÷<æ_Z)û6³´û$£¼¸KÑ"ÄÊ¾ß¸¢uýý¯#=%r'óVÎáOÚ¹6"{æñmÆyY·¿¡AáhÞÚÅÊ}íH§6Ûj«8;¸$Iº§O¢ó¼I:»hRenwnÈ2É(B
-
-°¢Ðm¹¾®ÆÙè¯¾o5¼Î©
-)'í¾a×
-d|ðÃ«½ïÈLóÂQÄë|ÄÐ-:o ÁÝ½á!6Sf_Å¿j¹ÃviWyDÀµ"[fÿt|Ücõ>o»äÇN¯¿<#+
-¢'wOM#=¯qð+:/rx]°ø&Y.cbµøm'±»î¾Ð,XI!
-zÃ_
-ìú½Q¨HBCnboCP
-SSmFW ·jØÊÌÊøÍÒCCÝï6eÅ®¸¡5æ?ñ*¾®éÐèÇ|U©
-){y,r!ÈøNhq]Q°Ï-8/}ÏXw
-££bÓóD2óÅ~Mü­SËæ¡WqR{§?«é*ïnºó¯Êî?ÀïÙ´CGË
-PÓ!ò«áh·ÀU±ÝBDD!âCû<K4e>?yøÌ»w<Áô#+ÐÿV·	#÷q	fµ>.¯áD#N¿èûsúÉôªr<¾Ûüñ5jëO¸Ú®ñâ
-hÇ½$¤Á
-n<<Bfj´o°
-6D ªùóìî®uäy½#+
-!¶û
-õp+B9G_lIýÆ´ôHeióÃ{°{BÏ6BEB@ýGH:slñSû+pu ¾f%»ìrC©:
-Ï·3c»¨cà¼çDa"DtoÌöüN#=î¯~\Ï³
-³¦?£èÛKÏÓêùÚ>©2Ñåk«xÐìÇuúú{¾t'Ç¼ø[)¼LÌBïðú#+V«è¦ô\1	#+¾ÆI$áp(ÁØ{T:¿í@¼Q¢¦ÆÁ 
-H	ãü? Iñí;á¬:õ»ØUú>¹ïÒÖ1àòÚiËEt3Ä×à®7Õctz1C¹³ëòÖr¯¡é©+ÀèøtN»òFozñ|íQDÈ8/²>FäêÊ
-2R{M%jL÷û#+ÿ
-±¨0drÐbUºyT
-ÉAG¶@æct}©ÛÑ£8æ
-pq©x(~öÛÓÁÄ×	éC}ÿëÛÛ*^ÚößÍ¤ÁÆKg
-ÂÅÄxg5a«Ö£A°9¼¸·Å4pÚaÀ"§3ô;xÌ°
-{¸	"éÜñ9°¡'ìó=&~dÇ'1ZÛm©HYÏNÁØóúÚ=³
-Nà;LCãÖ
- p!³^ÉÁPîAæj:^Ïàû&(î#UR
-¿?¹þd=x¦^}S0í´÷Mº1½Iò<¾'üúGúchÊõ$eS)JÐä£V=H0Â#ÆôH½
-ÿÓ8Ü¥m»K	#ËTð:¤å;­÷Ü.¦à
-ÂªE¹¾u-W³¦ª­ÇUÌ#=?ò§°vqÓëyCGÎ"m!««Þ¿_¶kü[òCBFºÎmt×ïÚû/ãÕêú`
-×pæs¥9|ÉðÍ¿
-äãZ4ZØ`ü.XÚxõ×íá÷îðúM+Ìæâ6±£ËiÄèN]T`÷ðà)o·|Ì1-®?j¬gÒàaiÈP8Ì'_w
-lKÐz;'{OËLÉå$eùºñI³	bbCZÑÆ±#¸T¹!Ã%æ\D8<Ã÷&Ø6%P2ÓñÃÛa*;H²°l# Úíhk	">PG0Ds"jC#¹Ç7sM CCR×ÞÜ47iðËÖa
-
-}Qÿ'mñ2LwH°@HlU¦¦SõsBxÝ[M#=dCßh,g1h,#ú;úrã÷l=0é3­
-RDÀ!		!ÃÌ}¾®[ïvß°½ûÒBIdËãÞUñõÛNí\·¸ÖÛÐ([5]ÞxëibJHÈß÷m|¸?W«ç¢ýÏW¯ÜàD	<s?Vß4J#=#+Ë²ás~BDö
-*
-^`ÐB>ìÉKºË¡üºÝVøßF¼F½û±&¨ZNs"ÙËI#+ÊVÓ`"ã?¦@wßz	¦»9­«	á·£	Ï*r(GïÐê
-#+ onÜ»ÜEÝ[à¨1/%°)¨Ú ï³ÐQÀ	¥!¿p
-'QÝ¨®»ñgIaõö`0#+eÃpÒVpsxX4{.ÈÏªY1¥j#Ç2ýäýÅ¥ò7n°(äN:-rÜaå
-ÿT}{ð;|ÚL`8#=Ç?×¢x~¾·Ê±ns¸}Ch8C	 áJå­¶Tzç©ó~x08:4mÓÇµs
-
-
-Òd3nf!²UÂHQA"}#+§¿e?,41åG
-C9$fºh½¿:"oÜ,¨CgÂ/HÃ£/Wæ¿AØ^LIÙ³q­
-/3ÀpG=Ü»8¤)*@õÜ£Þü³»?ºIMël6'ÇH#=Ç8ÃäfÂFÍ}RWÔ£«Íü_·Ö1×­GÙÔhæWíü>lü;þý)R@(2ú|ïx
-HÿoãtÔpÈÕÊÖ¹D ó$HtSGBÍ0ÞJ'ÆÆu\ª¨4ÚTJ!
-gàô3&DÜ¦äqkÙO¼_¼ .ëC
-'`SÕÒõòÎÞÀ2#-±â¦Âìi´0nuh#+©
-AÐvÛñ«~J:ø÷y	ÞqS¼>g&@H#húývÁq "`ªqGÃ¤Ý
-_F¬Ç¡N!Ð
-òw\
-Rà>íª`BM wnHrð²·NyhÏx\ÞàèW8É$s$lX=OæîñWÛß	ñáUic;Ü×µÚ(¥Ú~­n
-Ò·¡_yA(
-Ñ ù´m!;GhÂ±^?7ÐúnXhl4'úþ7ª¡w¶µhÂ:-¥ÐÚ´T~¼Éf©Ù^§þÉË)³=ÜH¹S$ó¾3è¡JX1dUKµ6/¬J+#+è|½ÇVo!iNÐë5gcG¨$EÒMËîw8äQiÒN¹Tk@z÷L\­&[À+Ì ð<îñ_dA70ì/Ô
-ß%	é£ôÇ#=Ií(A5©Z,$ Ö:ÃyÜgòÓçsTvîBj¨AøÈ	¸õê964¬4@yÑX¥À°¤#=:8¢¿|ôÜnªÔ¸ÞK· j®Z¢Ø*ÅÃ[Õ«a³sÏAÒæÈ¢7âLtàª¡#=;y'vwëÜ4
-Iú¥
-ÈE e!æX äÂä4øBV!³k!è'}Û¹ò	5AüåÕãáÛÕþ"§]¯Õ3»ëªµ¨øñ
-}'Ô×õãt
-ý¸mà(
-úêøû
-ä3Ðÿ¥<gNb¬EAÉÕ
-$
-ö#+ßÔ©Ô9äTu=è¶©Z/ÖïÌ¼kÂ¸g65È7k7UéB8«q3Õo jµ4¿æNÜÌY£
-2
-.ßÌ0Ú«ð!
-ÊÉ¢»«B¾snW] ?8*!¨h4;áZfGcæ1, )>´~®-Ø;ú!ô&Õ?DAÐ@61DýÿP!Ö
-]~a¨w.óáéúùv:{J
-@Xs#+¡_ ætåASLùfÐôJO`êu9ÆwÀ<uåd7.É#È4Xÿ·3ÐO´N&²ß¥¥êMºþlbàb%×ËÀ=ÏG(ÜÂ| YmÇïþÏî_wéóÏ^ª³ô^,IK{Clclh$³#=i¬ún·¶Í2É ð-·ó°çâBÞÖ6¿óQ]ËÜvÎ/¢
--B_Oí¹I¿j`ýðã¦*I5O8×¦Ê°!Î-ë,â®	¬P4¢Þ÷Ù¹ø:#uétò¨B)îÜ×zxúºü<'l«ZÃè½!ùþ·Òas%õÀÖÀø¥§Ö=$ô'p9#+>ØFi_>¯]ÅÚl0Wµ(³üþ==ºB£©I!\}Ú:NpM3È"ØBBµû÷Ø}_ã9í9ñ*îF{JÎ1º¨Ì Ë¼×w]7é¿Ú¯æ¾>ýµý«­>#2À+h$oñÚË¨)©¾?"¡i¤k?gAèý$&É[u¶ØiãªHÆ1ÀÂ¨c
-T+®H¥Ì÷ìå}Þñxñ$íê.§«óøßiùýzêÙÂ@NWÆ\ªåVK¥OZxÏYá°Þmùo¼²_9
-½Ôâa°ÜéåwÏìø¢á·Aê~0Íéê1Ü<·ú´ð
-øKþÍÄ¦µEd6jT5 }^µÛû»¼ð3@B&iãèôË®ÅFôÑQj@ 6íA5Ð\T£
-úD»üTÙ$dqhzª×¥Èw~ßì[©Bºý}%°$pGqögÒßL¹Ü´#.²~õ]Úlë´3©Új@#ÐôüÐÞÚ2ÀÛ
-­0xº_²ü	cùtú
-ñ
-ÈÄ?yHþî¾rG±@æÛº
-è¢_$¤_¬@?!14XG@1ÐÈ¦Dñ 
-&dFiii±B-rÙ7ÓB­}ÃB&¦1)"cRâ	Ãb!q¨\@Æ\ª\$-±»,"+8..¯&P[Ò×Ü«]âëË»y Í×î,þCÏªHjfb!®DtÆu@â©2uÉI{ôS[Ã##«øð­¶è&1r÷ü@1Å´Z»¡Ý /{À]·ilL
-À¶/¸K1h&óÑ½MßPß½
-1ÃãÅòlêÜ÷Dÿ£¹¯ä!þ÷üý"?{G^Ûª=©÷X¿òýmnEçsÄpt±V%+&	Å»¡YßüCöý¿ä>¿
-£;\­½aõÎ«¤@û(ÂqjÔ¥D1×(8îßÊè
-f5'ôüI¬a
-#=ºòsAl`¿M[cãÖO¯]ãu/2ÂàÁðTX@m,ð©hF¦ô£°'¿ÊQ7ò×Z;*Þ\P~G:¼âX§û÷»G¾Ú9úK9}é7ü<ì|é¢ð$PÓ\7Ä¨qó'£n©0pEF In¬HOÍ*{>.Z3åïûO±óo×òäÎE¢òMÔ
-C!&ç¨N#!â:öÈTüä(ÛH)óÄÏFÁâ}Qp_zr×öf
-w:víûéCÀÈô#=Mç´­<©ç¿g¤Kê³î1¹ D
-ì­äpÈîX¾R^7úpyîðÃèûìûµÅÓØ_c´(.
-új©­ð¹³K¡r
-áìÖ{YlMß
-Àf#põ°ajáÊXdÜä°øU-îÑ$ÓÒøéyàÙ »
-lzÏ${5t
-ä
-Qº¥z¢½u5	ÿHE%ºõÈÄÞþ÷yæ *¬dk#e$ZÉº£^4aî
-¢]¹õOc¹ø#üG#+±ã¨B»
-#+/
-;<rôV÷ww3° ¬
-r"?Ã	;ü«°ðgäPÈB'Dp!UÇ~AëÛ©B´Hè ±F'~»Q¹L9·ØÖ!$
-bEf»1m¾#iZÃI"ÁÅ6*^
-ªYy[|GÏhÔgÐ@xý¤:HÄÚ
-(ÀpÂ`1Ñ*LP¢Y
-Ä0âf¾0
-¿*>:·ò"a>5cýéç±ûÿôKqÊÝ#=.ÔûEá¯x¯f'´°ü
-Í3ç<þ.¿cï#=¸¨]2RyôÀXÀsUï«^ç@Ëäýçí~1À0÷ãs|#=7ÜmV¬·ê²üÑñÆÀæ`-ª.×æ±Ö_$%"/²{l	gKió4ç'wºvføD
-µ´lP.t4:Ü´¾ap]UªÜø¹/Îl#¬ÔS
-ñd65¢GËMp¶PÊêBêVç(á£ëoÛÝÇ@Ñ÷ènºCó¥u²f¤ÆÊ/êãözäíünea^ÏÜMB
-èt%q+ü
-ÎÊ+½F¸¦Ãkámß9xñJÔæý/ÕX½ß9Kâö
-Î½ëQ\Ïjr¹²vPv&Þ5ªð
-¬'r£.Î§´æê¤n!Ñ­§Ó¦6Þ)òR3¨Ìóã
-Íïç'ªbûõûâûý_WÖij33FR¦¤¨ÛìíóòùyÏÅßb¼%Ý:ñK!W0Ì¸õ¢«Ã}©cÓighÔ
-
-ðÔç)SßýìGïýÃÇòtwtu7'éP¹wèWnpz»
-î¶Ð"l?Ep£çå×NyJSjÅó±ú^QXæ³ÝÛ(rØmçõe©IÇê¾M>¦vÄîi»Êrgü[sÇÐ÷ïiÅm#+lEyëÏÛÌÙ¿Æû·8Ý´6üÄ!#+ïe$B\ì-§#¤ÞaFºÅ&fæîÑãßèÆCY¾	ùé
-'mikPã³T¸\l{VßN=_Ékú,¢PW²f
-$ÌXôÝÈè«ý`?
-ÿvð@ú¾´äúGdz,¿À¨þc`¯MNkÛ¢ ã_&ûI7ó?sáÔW¢ä<i»¦gÑqµáF«I0,
-gÕ¸úÈ>6bÌyöIÎ÷gbØº´3ñüí¨]/gÅ¢,d#³Ú`
-¤@)@=ü¢Æw#ó°Æº/B<¾BÝõÑ
-1Ó<ùQ3IP3d
-ÄÒ!¶
-#©¼ßå`C¹qEÄ /51~6#=Û
-@º#=DÏï¡¨ë#¢t`àÑâÖÉÊ8-ñ`®Ó
-ldj°­Ù3
-ìÒ¾¤vö)ÕóÁBþw)ëÛò¡
-îÀ-Ã|ÌÁ½ÖDðåï½t±ßåÄ?r¡pÉÓ÷{´|ÝÞ#=«#i^
-LlÚï)
-NKÀ
-ª{y
-0@ß²\Ý0ÄÞy^û¬ÐÚñý-ê(!üñ¨Â$I/Ìr?ÔøÀ¼Ã
-_ö&\w
-wþ3ôiÅÚÈ+Çù}ÉzÏÕí?¹!ÅÆØÓAzÎ¿¦Jµ#=
-Õö~ïDÛ7ÙþÊúgJÒ.¾
-×M È+*}î»?ñ¿C÷ÿqðGð@ïM<÷ éìÉ^uUW±ý&&Sþ/ì,Þ<(ìîw§#=ãÈ57~cò¼zjI!YÓúÊ1Ã
-M¦²#Â¤
-åÑp
-yZ
-ødæ¬!àð>
-ÚPÂ`ÈÁbsþÞYâæ·ÑðÑ¬È±À¸nìý	Í¿pX>lm¡Ð³ó78ºÑëz#+C¸4£Çuöõ^¦¦
-I`
-ÄÌ±ÀÖq4
-÷ Mõ;»»Íåõ×Â¾»Þ3§#=Djëè!
-SQI¼ýÇGÒÙö~D,Á¶å(PN'QÔ}L0=&ÇÃeQ2«s¿@é
-êU®ªºJ;q#+Vf*ôÇ?
-tÖ¦cfUeé¿-</wHÒ`F"ÊÃ#+UH&0ÐÅ È	ÉìZ8
-î
-Z¼ö©íL6Q8p
-=ÌÁ¼oöo_ÒµêàJ95Õ´«
-VæÌÚGJnÜ#R÷C³Çø?½9
-ÕÖêDá·ÈêOÚø?ÍóÌmøËéw_±`¦¡Ö=bÄîê6Éô
-Z×¢£UMÄÓXÖR'ôÕç«Ûx.åØ¬Û&èÝÝ)Yd­3îÑËAöÈ~Éj Ô6ÈdWWöy3Y(-ÉÞ·÷Ö`Pn4IPD~ô.Wà¢_b
-Æ«»gìô9HmñlT²Jõe,7è¦~ï¿$¿óÀmë($`ÁÊïÞXØÚH;#=_Cgd#h& ¼¬m³ÉyÉ*ÒKËo!ð!IðÅ
-F0Í»	¶Ã»#ÝU[ÍØÒ¸OâyÕ£K¨÷ã
-ð6Í#ðI1ÂKO !¦fJF¢ÆBBõ
-=FCpí!9óªkv¤1ÊI8Ê±m°Öi¦ô'5Þ»yø[ÆÁ1~~,3I§¥!Ä0<êü
-3ÓvyqõQ?ßøõí3%ÌéêÆp$h 3¹#=¾Â ³§ù«¢#+ÕwM®ô¹´/4Jª
-ÜÃN6²ÂgywgN$#».Þl#+ÅÅ
-	>þ[qÂ|â÷H¾^ëÝ;PîdPqãA¢sÅwmÉÞqÌ®f(³Âz×qÊDâ²Ù«nî
-wzYÄ¿Û:@Áá5×æÚÈ·FÕ!£¨asc%7"A§¡¿ÌuÌÂ¹Æn
-#àHD
-æ·0Éþ2ÔhïòóÒeÑ[dab*r0KGv¡9[ºÓºû¸eÕÙ½;#=¥
-
-ÝÙÄÛ0ßf«Ï´RK7ôOi»ÉI-CnJåâàrx®¦Íøñögu?¶J¸&¦©íÓ	Óaq
-RËÓ¾iØîîòþ~¤çQ¥²{Öå3^0¹4Z6»Å#Ñ¢z
-«§2Î!ªÙ¼ô<¼
-x¤ÔôWÁ#Í(dña~
-Ëeç¦Û0>lÔ3¯SMá´
-ý¼´xA§&
-7÷n_,/éíì%
-ø«
-ØÌyÐãBèvèÆÊÃ|ó»HOk ÅCØ
- ãÈ,Ù{Ä	¹v½"Ç³ÂÜ©&ã´âqkDk	¤2Þöf¤!$(¶FîqÎçè=¦&;
-ª4:
-{jSÅ÷7C¦pcå7j¿Ô¹çèx@ÌÄchlàÄ®öùL¬¯u£TÕm½¹L¥.·Hc]CÜ¾>(`Çã×¾ßMoÔmðÎÕ&o/ÕL¸ÈeU0ª&í2nfó¢éÏBW6F¤Wq ô
-oËe!ÐÎîî$6Ì9|Þ6ó¢;è{ÊéÝ³d·0hLË!>>[ÔÌÇ3.<ÌÉ332Ì¹s1ºó2ú%ßi¦=Òäs×D#+ð3wÊ6ð!
-$"!´ÄÃÛ+tD°km¿SÛÇ²jÊæwÀqÌ3Øïéu26õ÷òBÕø~8Õ#+ïËj±¡¦#+»	!QÛ¼lDñ³×j®9³H¶\ï­¢³`ëy&uratÎF¸ç3*ð
-¯R#=è#=g#^1¡ïÅc«Q±·p`ß¡ÃD
-N@ì9ì½
-¨v=sÖ©¼MÝ6qÝ(Îf>~^·§Ó^}XUÒo=Hó½ÕbøV.Ù&úÎÎõã#+u¥"÷ñìE
-Ú³
-(»
-W´0#+¡¬!N[
-º
-!ó
-)Íèot$ß
-N¨vè{
-h.îÉ·#+;ÿ^<nUÚTÐí)(`B#=[c±!víL)"wï³:ÉÊ´%N×ýØèô¹¦ÅáØ#/	y§»vÄXmboê3-N&ùÒ-¬à6
-:HràO@#O.De#+',JqÏK
-VK,SßÉÈÆ}+2z#+A´¨MÌ¦7Ù	å	0è¯È¤%ÔXwÚ{=09ÿãÐóKÐaò·¾	«è}uóù­SÈe
-Úo#+Äo_è¦
-'¸r6vUh#=2XõmÂPNÀ8ÅØ
-}­'M%¹Bå£©[fK#+ó#+,}ã+
-|¼#	4$sTv¤Eví§¹}MÛé»9«¬ L¸ÚÁfÄ
-Íp_¸1v(À>rò	¨C¢òÁ^Çä½0;ç~vÆ`Ä¸ÎxÆÃ.éM#+L­pù|TéR+CzbL¬ÐÛiÜ-<ºõg'=ÒDÙº£·2Ú¸!ËË¾X]²
-:à¯C~ps=ÏÄ$ä&Eì±}4aLf) ]vFæRD8Õmb3
-4õò3<Î5À¦½WfóV¬¶=Ýy4{Íh³bõJîfMá#+Ï#=<
-#KàiÇR7£×È¾¦ø¹¿RªùfodE#=!FH û·ÝII½,Ý¥IÉ-E Ùº+÷îUeÎ=¸¶Ó¨ÑÇ.Õîc_rG{e°#+3àvøAº
-
-OG½"ÂápEÐn¾£§jy&b@(wh1#+åßR
-½E(ÚÅÊ-¢Å;üÖ`Î&Èw­_{ºfIÑ°úýNÒ ®7ùM
-eÛ	°
-¼æg_sâÃðB}Q?âRÄuµáéâÃ_Óÿ¥í µÄo0à×æÛSm]<§UÐ¯òIÆeef]½l®
-Ð
-[z_C'°(J
-Í!ç ÝèÀ=S¢HÂ»ã;K¸³¥BÊ K*ÖØ|6½ÌBA;ÿcóÐÞ#=¨PÐJíâú·Càì/¡òùQyãòÿuàÞº³üãÜé7t®'ÔùÊ
-Zóö ê+½#=c!!BÓ]Î¾¯FcØ¤>ï¸ò)¹Ìä	N|ù
-!M1³Zcl¢1-y×RDÀX$	w%.çHëlã¡¸#+#)5`V1ü¾¹£#I`)~Zt}~¼í¯áüMõ"¦øs­$aI¤\jðî¥N¯æûDþù¸0(j(%()Ù®387¹|(ëµ{ÖøÙXó*m¦DÜr^èHwÀ³y#JoÅQOàð=ÈøYô´¤1RÀh 
-õa<CÊP;Æ"ÀBÁ,¤Ü#=|þª LR¼Þ¢¹naF4Ù
-lM#+hÄ¹ cÆAä Ò3"¤àèÝmD0»ý^g8yÊÐÒ-=ö}pÓt@7ÎRwoèÈê.ÓÊh;%D"DwÄIÄ¡>ìßTdö
-
-@#+
-¢
-dl(/ÀÆËÞ2Óguõ¨Ãàí?*æ6yr÷ÅR+|vãÓ(È(ÄBýC!Àäª÷AüED èAQÁLüa`û*ï{Ôõ+x¾ªëÅ±GôÂ²¶ÖòGZ@`ÖÂXQHd"[¸Au)0âlõÿs
-·
-·vÞâ/Mõ×xôµËÆôàãh
-!"ÿhY5 DnU7uùuâòw^õ¤±#÷à#=Xq	Ñ_Ä5@ HF!ï{P0a"
-(`#+4 °#=áÖ±üHFsMý¬_
-~K>¶HFÏ§ ö²56xzÓÐ<Ç×^MA¦C»2ø¼õ
-FÈkÚ\u'|výÌäèw6?¬HÜqÇtä?#Yú¿=ÖÁðá¸@"b)"_ 
-8bF2"A3F^ý&óEÃÕ£xä#= yU1&¶ì¹Ú=_£f
-@¾;%¸C£Ù
-;&
-#0h+\Pf$¡
-5"b:ê MmÈ÷¬)(#=
-ñ3D
-±(ÓuÐp9ü®TÀsúÚx%öÝ£@½rS£]Ó	ø5É¯uåæÂ-@fM]ßâh·$ò>1?&Ãn½!j¾êK«[ÈÅå	0(½áÓOFã]®J{¢ xõu¥Ó²øQ%¿Ü{?eôqãj£zLc®ì­ÏÎÖOÙ}ttîØõ.ú9(:Â:^Ð¸	"H  C4Ý$ã6MQ~N|ÁÊB£QØs¼AÛ«kiDRÉ÷Æ¦HÔ¯9í~=,»Ñ·[-ÌáÃ<+xzõýÃø>6Æ¥PÔ)ãpøö$¢j
-k~ÔJÔV±mF)«(ka²­¦	ljÅd­¡¥b¤Ê¬ÕµTó9¤ç¾t¿'T9ïAðåE"¬*¼}jä"EÀzúvYÎxÛË 9Ä
-ÇiÛEKÐ¡­à]aÎ$Ìi(ö-ü@NQn¨S£Ï,<Ö/¢ßÕcMð±`ñ á²L¤j¬ZÅÐEzÆ@GÈk4<+
-À/§ç±°¨íuë¥Ó]Á#Í®»Êiæ W\V<#=`¡
-SF:²·É<`evD@!Ü	×À"p~ÝªÜCt}Zxo$Âf·Ù*¹²dÖÑInjì¦lQFÚûÖ¹£j¼W6¯¾þ>ø%cI"ën5^"v1$5{DG@
-Kéä<µzzþÛu5MIk`qãºÂx¼`î®ó´
-»A$Dü`j
-ïl!áÈ9¿Ç_ú<þ/§·êþÒ "ÞG)ÅêHÌ{LøG[¬#¬÷E1 m(¶×5ZY¯|56ë²¹³K¨}SèÓj·=st®­¦#¡Í¨Fjný²yÑFÿ±hþ|Ïë¥ìNµ¥¦pÂ¨
-"m¼éMúêý/Óì?àô¤G[ÈîÌ÷úÉHéÕÏ^JqÖ¸ô!«(Ix¸L"y3"÷ÉºÀ>ÂýÐÙ,VN¡cw¥É¶PoNo#ÊdCN²LsÐLV
-	¼w
-èÑ£qiòÆ#üâ(a+±Íèê<¶¸ês_÷ºòw
-8>Þ ä¡BóR¼rü7»ñ¤P:òÆ§ø´°¡#=Oã/oéRûY|fwëãå«
-¶
-z¢?/_3§]ö
-Ç¢ýÈní;²ª !¨Ðµj
-/mE¦¨
-f(lhÆVçÖe#=#+¹o<òk{QÉÛ9xÁH@©h
-h¥(ØLþyãY)+t\µ§SfRVã+¶{Lt×XÁ¤-ÇQ;w.;< "úÔD=cÙGÜ
-O¬Ï <è< ®\8ÖJ>ïÃûýüã
-Ë-ÿ#>y¨,-¨Ðá²0*u{vm:@èÚH'SUAa!$ÙìûU]"ÄPÑ_-y·Â;tí(*Î@ù
-O@!òy¾Y"}[=¦#+æælÞhv1>3=ñF]ôD`È&q
-;ÑÁTiM<UzÔÜÌ ^iZ¼b÷§bÎ
-WVz`ÂËÖ¡ÈRpöø^»<tIµ¶GDä:­É¾{ó±Õ÷Ç(KMý7ïÝºFe{¬hâ×!
-Uîq:¯·7>J¢#+FÆPªjFbi\!LUÃj1l;C¬6çÁ·b{»¬Üw{ïFÝc¦ýõç3iæÜaRÊá»#+²Ö	U)®IºìùÇ|oÍpÖÚN.1[j´#+
-¡ï7¢lªâ·W^¸LÍéeDÔAÀ~ÔÛÛÉçó|@`Åâô_#+3Âåw#DÃÚzgß½¡-Þæ­ µ34)¯!<´EtMI2PfE¢SkwÁm6ð Óe¸³ËOUP\öõ·#+ßuæí¡:fnÃu<¨mb¶ôÇSY~þOK±
-ßóp]ºUïÐ5pPGñæQ¢| 
-TÄÆp#+}Á.É%ÓãNôþÞÃ
-b=ìÜ{±ùçªle<Ï`Ý´ðÉË¬!²­5	CÞÄ$.¶Å?=g
-½ÄýL9g¿L8äl? X7ÆÞØÆPr!3}.¾=y
-ãu¦C6xî#+GXÀ\OOU%VXI¾qû jÍÒkwmÚä
-±Ók
-mÃ[®ésbÑBç 'ÖgfoÜÝ{kÇ¦¦øG9ªEÏSs§'xq
-³nrÒn5¯e2ê;c§qòÎY²1¾DÜ¦È"èqã¿¹'<&Ó8rd¦ZWd»¤
-){þ_zz¤>HNÞìfÁ&¦Å BB¢L5#Î
-,;æêÔ¶Ó!J\8
-(Â³]Ð
-&­VÜ´ºy
-Ã«u0±à4]`t}mó½£åC¿?²lD
-¶¨jWLêÉ	ÖÓEæª¤nÌß{W{óBNÐçâöB9wò9hÞ0pê5¹ÎïsÂÈî7'îñøkP÷rÇÓÏY`À{Îp$éõuVûA#+)KÙÛHv1±\eÎ^5µæ®i#&M]7dî·SJ$î­]²µÝ÷4æ¡!VF ÆÐ6F"²!­
-¼}æ
-§F/¦ÓW+¨Ú¼óè ©j2Çr3HDHÂDMøjÜ
-J~msUÇQç
-AðÙâÎê5[îý¾óòü­ûßjn®·ßç
-õ`F#ï(¦O#=¦5UßtX±JÉCÖ
-ª´U¨lûÌïÇh;"ñG÷¡"²÷Ê©(Ï¾wÀ#Hg²L=ÁÇaÇ½'ód­@ñnWTbñaXi¢0¯¢z£l^>]¼ ï(¥Ð¦F#.nGçl1
-tÄôD¶Q'¨-¨ñËIßp§9p£ÑD÷W%]tº»QmËvåºÝ«µ»´yòâîg<ÚÙÙkhËKzeB½tHT2ÐRWÆ¿×3Q¢ÜÕºZ Ö0ÁÒ~Ô`Õ&¤wpºT ~T_Èù]8#+äï±}§o{ëÅU
-ÙóYø·U]O-ð[jIØFCk¥g}Ë¯ò½øx(Ì¶Û#=hÄF{Op ÷&ß½Á[i
-çÒQnÛ8Ó$	íÃ
-	K$\UêJÏN«¤Q¨`QÄÈ-Ñ§!ðûkå­&UÂvÑco£´çÔöûà áÜé}Ä=È&çCP?NÑèefH?±
-u-#C­Æ¼÷pÈwcâ,1²îÎóqúfÓJæVr¤:èF¡°Ñ³
-6í" Ãf¸«!7ÔqÚýKlÃ#+Â0#æºï¡[z
-7·Ñp8jaaØú`
-ÎÇ
-UàL-9_èY\lO¤Ý$L|³Õ3¦£ÎH-\§%
-h»ÃBÓ«TÊÙY²&h(< Òü¸­c#+®B#+¾B4Ñg¿¬·Ysm"àå2I	8Õ%ï LÞØs­¬Ô­ê=òXÆó
-é¤Áãî
-ì! ò*#=5K¿ÚV¨(oC°#é¦U+HCdÆ6c#2C<qàk^f,ÄÍµÝµ8-)¬2²Ù¦'Be
-*~Å%XÍÚ i/rÒÆÉIª+kÉJÚ*f¨FôS$@Ù5þ[
-
-W·¥¨
-<plKùè
-yHSÄÅkM
-t ý1Êp6tê¡²»#=|å¦î«P*Ûvjø¢Br	¤ÐzÂåØD&¾×Î$´´Fñshª#£&Ü¦tC¤Úû
-û
-åÌMI:`ßÃv§ït#+Ã;©!#=#¼h4ð=Ø`¶
-
-àcowww¯©O!p·{ÌÌÜì
-[É6v×+{2HÈªe¦2ÃÕðÛ°wfè¢â\N%B¨¡Ýíð? è:¯w£íÒì¾ª#´Ùó*Õ¢T³åÁøVp.Iíð6n
-Ú<¹fÚjwÚGª#=aDuçâXÇÃ¾ëÙïsÚëß§ìu¡0TaiÁuÔÜvvüï¸¦,ª¤K¦m#Õ4ÓHýÖQ°ÔQáó2<$ªch``l)zÏ£PÊS³ÆÎ!4Ê¼÷äq	ÙÂ9Î[}=q2¯bb®Âì
-éà=Å,TfrOÓÎ`Ú0õÞá¤@ê{M!þ
-}ÐÓã&)1YÍÃÅÊlAð ç$ó0(ÈÇ<Ä+#+Ã`ÊáT3¥°A?ÂÀ]Ì|©OA©G*}­ò³}ÌlÄÜVoßãÉÐøðËEÀÉÞ"6Ñ@Füe¸QP6FÅâ¦¹±Ç´·T
-A`7¦A2½L1ÿ¡
-iðÏ{'6ì
-TNµ5 åLd«¡¸´4¸Wëã1¡½:
-f
-¢j(xû>Î¼âøLä 6ÈÙ
-ªÇN2>ÞH&îòòÞ(¦²ØF
-Z¬_µ@2;VIIb+f#,ÊÌjõí4áyø¯·§"å0Õæ,Q¶ Ö­E:&6ÓHoÁÀÔÔ±
-Í¢uÕA_*Kþ½©
-±¥²
-Ï¬èîÜ¼,Rp\]ç
-/_Î¹9ÍuÞ:ë¼¨Õá
-T,ßç¸LöHHÓ¼1S¯øé¿Î`àÝªJÅ»xR¸XAr¥#+03®ÝcjöMéÎºöëÁÆ©F(bLÐôÁàýÞ¤lpnA´
-Àñé#+ä'D@6`×³WÅ®VÞL¥oiW+{ÓnU$CCSb#+1L"ÆÀ{q¦¨ÑÍÈeca£êÖ-%M°ÙÌn¼±%økã(vcù{ó4ú÷â¬áÂlê×¬ÁaT+>¨Ìµ)VLc¥'<ÃC7ö2LÈ@h,éÅÜ¹ºárÐo»áa Ñ¿Ìi4Ãgéz
-¶
-Òá3Ôñ×<&Nm^Ôìe#+å)bÈá
-}
-=h
-Ñ.#+ÁÃý©ÑÙÆØLÌ`@y+Lp 8à?¥ú¼x¸ñÂ;é
-AÈü6s¿tèa&I/ÇÖ1°æð,
-³f
-MêÓÜ6ÅêÎÍÊ,¤¸ãÆØ.ò¬âGòj°R
-z·37E¡ðáaY@12êÇÐA¶Íâ$3Àù	[ÿ®ëäx¾VÇIÐí÷ì3>¨cÉ RÆhÞ·6^c¿Ã¹ó oÆ#Z Ó;	H;K@øuTÏ³ÂAsîPCTÅEF$Ô\lç$ÌM4i!JÄ,Í8r¡þÃ[
-°T`ÒÃ<8Ñ£¡¢SÓdrrdA2/=ÐÀh9q´&Ë7çh`úÛ?iâwOÝæÎÔÇë±HMz°	g2ÛÁ;4zqç#+áú»
-7/4èyvKã{
-ýïYFM±ò²J2Êó\Hh
-
-û
-VLÖ>°þ?ivÄEHA0xÎûÚ'¥zÍ$$FMWæë·®R4­m¨ÛTmi*¶5ªÑgúá\Aà H	DV¼#+¯yêçW'*ûÚAs¬{Ø­
-mæNã~*º/#D7·óäOÒ|#+ÌµúÊ¤#=!$1A¥©
-21IlZL°¤É«AF-4¡	)¦HX³$kç×HËd£fÒÊbe#2É[&CO´Ic)dIÊHµ&I ´hh¢ÂF&LÅ	¥6Ò, É#%*23(¢¤c{{>ð*ø|~¾ÛOfôÆÁpðh´u[·=N2öÏ)Þóó¾3ùH0ñG³¼I$ÑaúO¬5È®ÌÏÑî
-ð;X³k¶ÍQ#=ä]¿¾NìX	rHq7ò4=ÁwEDüçáE÷63=Ç|ÎÙ`]µyá6ÁäMFÙõK^]+8¯n#+ñLõ¥Ëyª­ÞA{y,@Ûa`aC¤I-%³Ó©¿r­ímøY¢3XL¤¤±M4AL©#AI$dc¡^mì0CÍ²Óágk÷ò/àLúÌÍ­E D_"kB(xD/
-÷i$FUË¼Î1÷O¿}\·èöá¥ÔAà;7ÍH
-`MþÈu
-²½'$÷ê_Gä÷hÞBy5O]QcTÎ³Àéêüxq
-Íl{H	c¦¯àßP½9NvÌtÕ#+4$	PJ¢!PF
-;ååf£4#ÙWïË×½ë¯>c£Ét!òøÎõ¢Îï8³Þrß%½èÊãJ*àoµØÃ¦b±É
-h3°LKk
-!ûF¸~ß;á}\
-00¸_>³=/8¬Íofm`¿áO¹Õúoå71,mÁµåA-Ó8¶ð9qÖ[cDI_KäÎdÁja&P¾ÄñúëÙ]éÈÌ»>8·rÌ[Hp_AfÙ©íåm·nZOzI¸mØÛEa5rãæ¥Tnlóªr"ußQg
-¥29¿d(Ï©"+×Ç§	wÆ¤wzs&ÃGzhfèO¢Ût*¿nÌÍßáÑCZ> ¬.
-ú½S;*ý¹ðÑ^[8Ü'gw5*C¿°E[å¡Ð'zºÍ¡°çÕsîËÕÔÜXAÉk®Jú|Êã
-
-&¸r
-Ý°¤>Ë"
-Ëf¾Ðë.FÄ·ªeZù_m_BÈMú0ÕUÓMñì
-kgaRm=uá*=$äj3L#_[©èxw<Dã^]o¢áã7"Í=çÍ@Ô^ È*;
-Ùz ½¥±¡­"6mË¢ý§À±s?å	-ÁLH.ª²SÓ_ëN}ô¯/«$óµ»%tó=B!äù´F°iNI[Õ
-­ÂñUéÂnæpøã#»wRo#+æ$5$w¹"ÖzË^ÛkW
-[xºp¹ÌâaÌ»ÝÆjìnm§´¶ÌeË.¿N¥zRÍW2lqPÒÒª5ª«:¤¥#+#=GGë¦ô:¸fJoWÀ$*³¼½%çY¿Ñ]|\´ÌZ6©W¸¦G¼Øº%0©Ýx#Å=ÅVÙ:1['ýv|X©0iwÞfK¬&#ÝæÔð"£1t_j½ñbu¢Ä³Äffie)g§Ò
-H:~«9TT?`´p]ÆÙª$y¼Ã^bÄ&
-è!²®>2Á¹NÈÒ|ÞGMáì9v@XÈÖeËµVVy¹8³ÉC{r`©k¡úÚBZ.BÚ!wQe2:ë±×c|NfN½ecN:{Ú­ok ù¹vêµ¦IÍã1´bá¥×¬åàÏ.
-dIß^
-~t½2kÛ}øþír°tªÎÑ
-Z5XqwCme«Ðñ×Iè¿ßÖ1
-åÿPã6{ë9²Ûec6îxÛUCÁ´ôÖ¯jªåÈ¹W¶;¼ñdm u²D¶ÌZ&ÕP-3ì9Pë
-L3ÄUªmJ1¨Ì_{t56pB|c®ó¹f¾ü4ÄL4 ÎÖFý9:/M:§èfÈï£bÎJbïWdõE
-ùh0'¨ÓÝ1_c4tcmé5¹Ã.zÞi,a±4QfÍ¾Iaß³~4¨i¤KL;!9°fgã`µ#+s$KÛé6vhÃ|R´zÕYÎóÈÓR9¦Mzrf
-#·6IËdÝÇ·é¨ì6x=®2½fUsn¶
-8c#+ HZøËf-|·A¦c~6&®3àIwÔzO,§qKÆ¥M9àøè(µ9ßâO=õ8kI.ÎÛ'FÑ-L¨Ù¢pmE­-Ñ²u°YÌ!õ§kVàÖ
-±ÀËf8D-hHLbx
-	Äí]õYÎõ¼ª[©PÝ7­k{5¥#=ûÔ[Cbû)*Ùsh®R¥Þ-@RÎd:3g®TÍ&¼fÑA» ]°w8Sm#EbÊi·¾cDZ 	¸Jª-°åÊà£d,RNsÝç8Ã²¡cég®ë{É,ÙCBLaU¨@ÀåñÝîo\ÍSóêË
-â>í-ÃÊHÈCÇ¶k	 K6Í_ÃÆ±²k|7¯ÔmøB¢îxØÇ
-mÂ¹~Liò2bÖeÊ
-E2^(fÑÊÞ%BÙÉ6.ãxcÌépzfË+#=0kLÓ<l/h®¶¯yzÉÁ7ÌÙé¢lzuÕYuÇ)²ÑÇ¬s}pÓ<x^êÑ×­òÞ9|²ruä¶´ûëÁ8©
-;#ãF7ãmÔ/Ýê©·uíÍëÙDræ^;.î÷kÆ
-zõÒu8\&eneó$qè±´øhã.®éHÛlâ"<tæq&ÔµèÆäï-ÜÍjéîÌ¦c+-hÂAÆâÜÌ33
-0²¢´ÖMºÀH³¡å1ÂMI&.&õlà«4äñg,!¥1~Ð7
-åT
-#=ci "-%vÑMCºRæùyQo\S-Ë´Íïß&òÅZVÓáò3Æöj#\å6Ø¶37x
-Úb©ÐÄhi¨Äº»X*QÓT½uJdPlç¼njf=V6{½·\Î:ÁF´Ô9m¸Eo|xámó6: ä:Uºe¢Ö ßNñ@1È¡PTCïDÇl 
-ÇéÎ}¾+]'B¼q ÉÓ¨3¼4 à:@xnx°1®Sx
-;4Q;B#+e9
-ÂX£ÝEÎ6I-'
-Q¦ÿùþÜHÕ$S(
-P:#+E^)Iò ^56äHÐÄiðë
-.ýr46ÚZeôó¨á=4yXF,ÍÚi`0l%ë4yõxQ#+íÆÑ_IÛPØÑ)#=&
-º
-3Y5¬£(c	FìaCk{Þ1
-ÚèÃ£+ArÆ6S]­ÑtÀ®IäæØ	ñ+
-ËÙøvÒ!Ç>ÈHvtg8?
-y)ï-4Ú9cM#8$LBÐ|h|j9|ölpHJÔÄ§°Îo°Væ²è±8J#+ù]äÚVÙ¶4m%3ÄcajÜ>Ëö­£+,E#»XG½£1AB 
-ÍlCºÄ^
-B
-3½ï¬åª×lîñLÍb!*0°¨m2#+VÆÆë»êÃ1lé2q©Àz¸
-c÷BèÕ
-#=Å­Eo%ÌÕVÛóÊ.ä^ÀHPøFh2j^ýÅ!ö¦àÓ#=4"ØùÀvMö#=Ög±ÞÆætñÅ§LlñG³Êß¸ráUHsý#=%;@¢5*fA7qÈ,»&DA¶ºc´lf:EGa#=êDb#+Êñ
-êINy¬R»Í0E89[6A'eËf@n#+n¸°#¥JÆMeÕÔ.×0Â^Âhdf³\"j*QBBa$XAZ`6°Üît!<]Â6ÁA<XÅ'm²â8(êc
-SÔvFf#=
-silå¶º äÞ8´T¥ÐP8##+²aíltsMfàAØlôÌShj4ÆXvÀÃÁyc~I|É½Ì
-¸w¡
-@Þè¸²ÃPÜÃ(f¥HEEýdOÕ¨ ?Ê,ºÈ¥AH^)ëJH#=%±ÿfõ~Á~_]V¾zû¨Úû®Úì«bCó¿! À'j=´ªi7£At©úÂA D
-âJ±RCL:(å\-x«eô-+_sïw®iÈæ²üHòh)ÙA´ëi¬¡týÎIMó|
-;¾Å¶QÈw½¦èE¶´µ_LMYÞ/Y»]8·Ô½¤Ù­iTrwÁÑÀ+c½"Új$ }Ì1¿©Ï
-r_6èBm@f
-óÀâjÇq!+9(¡H½Gòó¡UGUÔ)*
-b'q	#B¶"¢ÅVÍDÁxùE(r"ó"X·
-¼öv'2¸)$RmQóe#+³ïûþl
-W¨~îÜ
-J/Ì ":tPþ½M-oå5ã^^äÓ1¢ºîÌæºZº_Ï^j_Ì§¬WÅ·+ì¸W©8½ñA¶~ÅÝµT8(ïà
-~öTæ1ÎcÑ|¢ðúÚ/ý¼ÂÇ/«4}?¬À¸üîñú`l?ÓÏÌô^¬MÑJ6ÊZ²0oÁ|w¯o4É&¤ÓcmÎ|¡¶ÒÑ
-)Ø
-ïfà´]VÊìÈlÆÕ]±(ôF@©Þ6#=<5¡µVº\*,`
-Á0Q?WL?ub$X@Ç¨ûØâ#ú>òrE#=Z0Ìï=T| q"E$d¦Ú5EJmFÛFÔRÓ3b6LV¾_#=Ô%*%}£ìM~,rEâ
-pS×§Jââ<L#ïÜ¨v¢{g`Büu)Ù¶
- M#=Ä« .ð4|W·a	#+½GC¾IÕ2_Ùko.B<¦m!ùa(Ä#= H?L¨"®¦JBÂ{'ªÃ1Ó,$mÆr%éBbIwM7¨  ²CC®Äëº
-Y¦$VÆ#Ò
-1MPÛ3ñ ×oàØ¥ùï¾^ýÙfSÙÔ»¹ñëÐ³E9¼¸sàÌÔQ}qQ
-ÞÙ8æø+³)=½7Þ×-I¬wif´¾DjÎ¥'vÝ@ÆÐªáqJð\½R,l%¥Sm6Â±´#+#+(ØÀ¯¹Ä
-ÑEdl[db»Q
-LÛ«}àÐÆ&ÝÇI'NãÑka¨»ÒcIaÃlb`w4¥à
-xreB
-Ó^ï[à
-ûÓÊ
-ä-Q¨´DjÇäv	6¹0µõÈh­DdÄE~­¡Æ(¨1" màØèå°4©¾åú±¿ÂøèÚ+ið@'âÂ6XiñnÁC.LâbÅí,Bh@|ðäH¹öÎ¬p
-]'
-^51
-ºm±êýnV5
-eÁÐR²l"÷iLU$ù*¢À«ùyÎz1LèÞ3XXMBá'Cv»ÏËËÍÓCÆÃ½(n`;H^cü' õ
-ðY Ó#+h2¥7/l9Ó:Cë÷½­#+`NU2¸·"Â£µà]8£àÔ8$"hè¬8å¨F«t!¢YLÎz)sh*½òägM«ÖïRypC8Mcf¯@ÆI5y-KØlÒYÀº¹°ÈÍ`8¹ Ü	L!
-AÍs(
-G ¾¢B$
-7Î7:ô³Nbl½ÀÓt?,BEø
-ùz¼	÷ý^ìG¹DjU6°0hÜýyûª~r¢}g0á¢Æ~þT.iGPVv«âgü
-ÍsdE¹3
-|}aM*Ú´ÈÀMuÿ.Ä&º!ÐuYà#+ÿºddUA	YÌXYGEÕ
-úÊëìÆ}ëª¹0JÌAñ(Ló÷@³U9#=mýçmZÇ;Tf¡Ó¯µ^·ÿÍ´Ëg¢
-îcOOº»±zèÖ"±c¸l8³
-tÚç#z0
-ófní<kÌºÀ $.få\0 %|(FlÑ¢"!Ø×Ýn®h·î>pºëZL=Z¢©Amº^ûr9}ÓjL^Âq×¬7² 1¶rlðÇ
-wJû[A$³¡bSb×µ@»"a®
-w5»+¤ðö§Ê4+¦¢Îø!­6¡µÊ´9|T¼Î:ÃÂd¯ÞÒJtg7!,-E¥ÝNJqbÍ"È
-ZI
-]5ÙDî¨F`âdË'Í`ÒÒjûMBeO¬KcmÔw'1¶e(Ó+¢S1W)£br÷;;w5E@â#S
-
-4,
-ÔÖ°I+HÚ
-U®³l¡K×Ê»|6ò®ªàC2AûÐÌóh1gd;0V~ÍS4É}¾{ï;©µ|KÝs.µ»¹;vélç[Ôç]Û!Î»
-uÙ·e]6#+Ö®ÒV#+Êî»wvFÞwBMNÓÖëËÍo!kÜªí4ZJ
-y»·øßß0&LE7jC RH"\IR"lÖÅf¥f»+]+K4´ÒVLÙmcKó}ÿUô~ö÷MS5£RÖ@$A$EHGý~!Ò
-¶RzÈ$ÀÍD#=ÔNBBè0U^ø&N¾¤5]6ÁxÀ±ñ;O;7
-cË3ùXPËÎ®,¦a°ÕújÉß¤_dG¨
-GVÒ¨loâí`±Çµ¬ÌÔì=0ðÁ¼
-Ü`^H¸Ï
-< ä325A¹ãíC¤<#+
-
-á¸¦}%±CÝ@ýçòÃDJª@{Ú¬DÅ
-ýê!fDHQJE¨
-TP%BE6îFîm*qó¸ãHGöþü´0lçëLéæí·YsÇ
-w9È¯#=úËo®7%9Y;W®,LTfÑ½»­â>¤4ÂIRx¨¼#=
-_
-¢¤îKÔ*)xN=µ
-"é<T°
-¦Ú©;H¤Òðl$µ%A¦(% ¿#§Ë@in¾F}A÷(\Ôp\d­À`rnÃ]¬H
-Ø!#+ÿ~R@:
-§CÄÃ¡×[ò]Ë+<ê1
-¥nñúü#=0D"	#OOÄAælÑÙT^#=kÃòÊýÚ+ 
-b/ÒÿØi>Û¶$À Fº°
-Aa)F¨Á­%¦zîªñ¶×
-Cyv­vSZK6ÈL³5ô7S+*Ã¥ZbÍ#f"¢¶URÅë·lÛMÝÒÖDùÚ]i{uvH©Did­S´k¢ÓIßÖ­n¯w$UIP«2±­­dm­{«µ-Vj£Ï;yK#+6£&ÊØki¬Úöv­¡µ¨ñnMyÕÒñsM´Ír®Öjyum¡5®& 1h@0h¡'¹Tí²O£74.Xðñå-_ÀVËQÖ*sã©ò|]»{#+Û¶òlÜF;7½'I¡éâãèÝÜPfÆ'·§çmE¨2J¤¨
-ªf5@Ì%àE[ßÛ­¶×¶ÕñÓ#fÐ±4¥*QÕ&¶oÉþcZ½-µWm¯ÙkÉ²jiyºÝnlZìÕt±kx¶`#+¤NÐ0À8= 	¾ôhQ7¡¨¨²XÛR³i¢¯·í÷éòôY´É¥M³)µjk6R¶KSJh¥QSCDb[e¨)0¤-%)i²H¶J11³FÙ-²mÒPe%6b¬Iµ,ÙfFTVÈÉc¤6Í!MY5f#+Ù#
-©II2f#"Ì)eTÖ
-C+@ÃlÊmJÍj¥)1eM)´§ÂÛSmº¬U¬m¬´Ú¦Òim~UªºTj©MUm­|¼Ùm¼ÍmµÊkÒ«rÖØ`ÅÙàÑËdc
-wm±6§ËZÌÊyCaÇN£I¦kzoÙ~¦
-»Ñ:ôÑÔçV&â '­ÃËLÙ¼Iæx´õ±_IB
-`¿Z(ËØ>èCLÐ}æS£¢*ã|àÐ^¾ÿxØå¯Ê4öj(&c¼º:6Hd·
-q'pØaBM²®ªa
-Ï©qÑìß´/û<ó}0t¾cÆ~á1±cm¼Þ¤Ywx^«_e]¯kìºçë[~
-¿#+WäÓ¿yàOjÜlÖ©ài8iÝV ×ÃÏ,x5À=ùP"&ÏÏÆ¦"¡i
-ûæµáÝÄd^(ù½¡ìÚ´2]!¿ëÉCG#+»Ù»ùvÒ¸ßÙtLchñ06Ç\ÚxîãÜV!ÅhQ}T; äý¿rkÑëÙþ·&Rz
-.S'
-5$ùcC!W¥é%O}P\'£¿TãX
-#=ä/W,!;X°^æýIÐ##ciIîp©
-¯;SRÞ_-±Dn¨á\]Ò(vgØn
-.üô±ÑNö¼èG#=
-¨>¤ùÑ#+²ôætTT.àV-±¨ªÆ
-o¡WuÖ¸õ86¾¥E®d6ÁµhA»»#=
-½:Ó§	ÓN}Ç:À¦Ìazç\ßÄR#dvè:Dì;§0#£R	É[nØ3ôÎ´y² J?âå«_±T×¼èÁÝÞ÷v¦Ok$O[Û\Îè\ê0Ì4aÈ	kbýËEêþæ#+òÀF%ý¿ç©>§#E¤¹Åý×«×¨¯J"ÊEy:\ÆaçEüvåÞºi_Ã4Ð>êQ0ÖÙ
-#oEç{Þ½Zó]ÎîQÑI/ÅqJ"*Ñ¡dLdhÝhç"\
-Ç$âÎ Ø&b¬Uéàúd5
-M0Æ¸V`6pQùXÀÌ WF>Õ^iKuPB%mÌÙnÓ|3;Ä{C5Cê¸_ÓDù{Ñ5ucä>uGQ¥iÎÃÜR4j©IOÐb`<bóOãA¤ÙêSOIKÍÔásM
-ÝñÊ&N£#R
-òI6
-*èÍ\KõÉÖ¡xh!R@¼a"Îí±sG¤Õ[Òrµ/Ñòúóú¸Ø`
-ö\¨Þû´¸ÖµÙ¾+)vÕpÆµ
-ß{áh`ñþ¬]!ÂÄ@<Z×T4±ÄY¢F6É5}¼4ÂJH!ðFw[×jÎ¥¤LÀ ìíEUTj¹f\e
-eãý¦WMØÿ$±¤M
-ZhÛå¡#=}:	/Ö+×"@ÛÄÒ#Ê2+Î|?jëõ²2ô¾8Ë1·B¥*ÄÜC2¤;D{MDdÓoTUÈ°Úk#+
-}#+
-»ãÝ9Ip$pÐ@hæC!ÖÆª2\íu8ÖDÙå¡Âu°¦bI$P­EêBRÂ,®¢û½Ô:©ç¶t'ÈÊ­ä6N¹eï¨PÎ£}Þï*ü#=¿qA­"ÁbÁXF%P©°Ä
-bK³
-Îpå¡uxîù»~®¨
-g»ßÓ9FãÐ§Õt
-®£²4*´ö ¢`G
-Chöñ#+&E?¸"Ì&þ/IËÛÈìY,9ÔÝb¤*
-¼mÎ÷ÓÇêéqå4P5L·¨u@Ñi¥Í¯
-´0ÖlZ
-HÜ#+asÑÓ@ëÙ$d¨©4½^N0¥¾(æ{}Þ,]·	´:ð1ìåû3'H¥+! !T#+R2nº Ðý	ù¸yÛRÒJ
-ùeØ
-/Û¯\øÁä@õ#Ô	¼8
-#=Q¬  @è1·TÖûeËãw|
-l]×
-ö%õÜöÞÝwíÑ§·®SÏn¿/¶ï÷®F^ìtûúc¸L#+³
-m
-b"fÚÕ×zrLº»^;]ÜFzèçWcnE.t¨ºî»wì/22b¤Èíl©:£iíØp4ÊÃI¾È·¥£î!'pÊvo$örì<4ÙtèÉæ{	ß¸]×u/R¦}W×#+uÍýú9Ö§{ª¢(Jâl	 ¨N%ÇvìÅ^%âL¥ªn@H¾}WÓkµ
-Wö5P$uØ²úB¸âîÊQÊu¸À5!Ñµ­yHP'
-À:ÖÖ2@X¡·
-Ð
-%o;4Ûé¾ïüFü/¦6p¾°låÈ6=8m&4 zÉ!ÅÄÙ\m»iL@@Q&iC
-$DPÅ2LÌ±.4CU°(EJF(QÄÓ`MÛ{«q)ö"¾
-©Ó³]¼ÞAòù÷ó9ª)
-=^b:4
-&ÍÑã$±*k¶´6qÝ#+ó¼ë7Ã×,yÝ&½w)#+)?t#®+cü
-Ý ùZ<ZTaÆÓB³z¢BAI­jæÆeiºâå¦w\¥FÕ¾ç5$µ
-
-	k²É(Ü*þÓWA@ÀT!HQËÜXg	4Àö5¦{¬
-_wPcãFÒ5·¡i$È"	PÞcMtË ¾ø0¨ìôäF
-£O3hKQÁhp-(RÊ^°ÎÇ¯$Íú¶f:Såãp°óoõÉU
-@Md@ÿ"9@,9QQóà#=¯OáÝß­:ÓõÈT
-ÅE¾Ö&R§½~\ï©
-÷·Ô)iîºÑY²j"¨ÄÊZ>âyÊ¹PZ
-âQPÇ#7au¹rïª¡¶mÖÆ*,U!Æ)kb·ò|Xä{¸áÊª"«j"~D¦ tX×y/cbã¯rÀÇºÿM*ÄXi2¢é
-[CD'¦÷(À .¥
-h=:øÍ¸i,wHQ×DTøóGVPú|mxj"(dëU¶SuÔíï
-â¹Êä3íN}HQMeÒ5Å0p©eMû7
-9*:6ÉhXº¼Ò-¥?owhàììnt
-Ï2ÄÄôãÃÞÇµ
-èû|ËpÉ§£r[£ÃD¿ïôó·qà
-Á2¼!ÈptÐË|)ª)±¿ï#Òwñ"? òÖw.#=þå.ãOÔZaQJb $b !«Ð."¡ `¸IÅ­µ=«¸Ëm»kö¡ôP&GÇÀÈ6C>ì÷#a¡Åì: îùÜõ=Ji~í|5ðÄâÂ&´Öù´ftÜí4¬âgl¿¬M¼;
-B2
-"'@½TwÌÄ~#= È\1*(_Yìü
-R2ùÞmdAdO{-llß¬ cê&!¿Cè@§¸ö_Cê{úö|`Î«¢|e½Ô|*i
-¬¥ùn=I÷
-aêá(@3Ý)gldC.Ï»X\U6ÌsõÅcz¿àÛfj%!cmuj+AHã J6Ö¸§(÷EÒ
-û_®Öæ°*²ái¡F\´
-r:qEzÐDë%oy4ÆÛMÍ«¬ñ¬á uæ7Å¦þ¦F!ôÁé¤ØCLu"F4hÈQ¥ËPfAÜÝ^ïdzF³ºÚ¹«{-\Ún!f"ãJ
-K"æÌãf(¸Ò
-j11£XÒyV4Ñk_Õ
-Ö	ÈùaFlmèàcN
-² #:¼mäÈÙi¶EÑ4Vk¨öóofôÞ1z¼íyÖB1¹ÍãxÖ+xÒ\Ö5\¦~ªõíÞÓÓi¼¹
-2C
-âA³:H-3´í#=ÐÚ3)y"ïþþ³#+2ÂF#+#MACYQÖAºûªÃlXÍ°ìæ¶îµ¤°ª
-
-(ibÛK5âyÅM&Xv@	0ÂDÎbª¿Ú
-ô>d'¥Ñ
-´ÕIà|¿m®kÑF&
-Ô]"òþM_¿3k?ÝÙFÏ+n3%Sºæ¹u¶»Îí¼»Q))¦&ï%.*~~Ì_N'Å^÷¤<2rW`<¨'pÖþáù}Ô4KH¯~#ó©0ÞA®¤·«Y-,ÄE^mQ^uphmÛ&-¬j6
-[ªÉ±4¥{×f¦­Ht@µ@b*
-[ó®Cå
-b
-	´ì×ô=½
-
-¡÷à;%?ª=IËªfb×¬Öãó=&ôä&»J iThø©@¨ÄâSLÍö¬A 
-íÍÒ²]
-åüsøï·+%±ÖøßÏ°ï<#+`|&ÆZµ@è(¥.Q*ÂÀH¬î-*$F Zn
-8i
-ÊBY6-´ª¦±bº®í<Ö1³Q4èÀQ
-©Æ#+I
-1¥6Ù6ÕgÅ­îÕ±¤¶ÒZb`%S®ï³R±ÙÓlÅÆ¶4l§:810Àë~Ëa(rm`7K `ÈYtn"ÞÍd*W¾Ö7a©öZK`^~û MQ&Ta^k#+«óa
-@2àuÞºmÙ[ÅèË¨ùé"F°|s«UCB
-´óq¹!Ë¤@¡éF#+S%AÃ>°¸
-^â±yhdÍüÜç q°\6¶×t@¢þyD: %@öé
-½øN\÷FÚÂôvÔd
-:Ww#+àxª{TûÂäùë/ôK^9ÕÖî¦T¦jÑl¦hÓmM-¼¶Ò!"21Ç/uÊÑÕ»j±IPçjÒý)¾°B ¯Ö¹_5ÀÏO~D¡Ü.ZöqþØÑxºÉ.|Y*³í­¾×E½Z4óÙîµ¯
-wb¢ eáyÇM2p;ÊChd$
-#=6Æ2@PÝt¶BiMY6-°ÕT&	3oB Ø
-1
-G¥v{EC{ÏI3·||4lÇ¸ðò·§rßnÙ]9
-^+Y!¿ëRJÈ'æ÷t|8uÚs#ôÙÜlÞÎ|ôÃ¹çndoèÅrXbù±°éÂ$F×ô=H¢\aHá«µ|Õ*,~)¬Ã`gºk¦¼r¶6LH6lI4BñøhÏöcºz>&`ÍpC71À]*ÇÒÚ85Fúp°LþÜY{3·øã`¤®×Ú]Ì4Òz4Íxö^|¦RräÉ<Ö
-ÔÑî®½& >®ðó±~£ËóÁj¡X
-II3"­-R¨ª*fkõæìIBTT³÷ÜÖÊKf¬TQe)`R-¦ÚÍ³ZSM©6¦Ñl5Ð¦µ"Y©fÖ±XT0 ÿ,ý>Mý{T¶¤"f!
-
-_*AJÈªÊ«"Ñ«]Z¹[¦·X[ù6°Mañ:ú6d°!¦(H#@Âd$¶Àw[JHýÂ	Ç¥íáA	Rª¢5_±¦
-øü¸%ë¢ÂIìÚ#+ZK=¹N~EëÁ
-þÏö9ØºÔ¢W­ÏFÄ=)½,~æ åê_¡!
-#+UJ%#ß*Qj!øâ`.	yJ
-,_hNà½ïdâä{/ÄþêÖl5iÄ¦ö	N#=§9×#=íK¦PÆfÌª#+¥Ì<êéhmi"R
-g?~8zO'1W¡¼;ÁàrJ#[MFùUNWLÍ¢æÁÚñäNØ;,b
-àm"»AÐ#=µ§Çy,6åÜ
-Lî@(	@xù©úå¡6ÓE9Ú@¢(@7áhü8ÈdÛ!#=/#=ÆÈ½æ}ï×oZæ\_¶8çF[â4&KíËÑM{ª}}#+°Ëj6Or8@
-Î/ßÄ6óf2$`æöb÷ý79I	 3gùï­ùßwö¨öeqªÍNÇY&îI°Wì­{5÷/÷úõåàxê¥ÐiQ.Å.z	åÈÆüs2|´ººÚ_
-q¤É5µö»ÛååçÅ^ºÒ¼N98ÕTkëýWd¦NÚÜ»-Tbm±.
-M³^.$:,¥¤&£±
-`Ù\L÷ÃèÉFYLgµ¢#+ m<ð¬µÐiú¹ÐCÆ2
-F$ b3P#H3{¹$çÒÚZèìu	ha7vB"hûeÙûP¡9ÐhÿQB&Ì)l3!12 ¾ u"mÈWâñwÃñ×C|.xePÓ>L/léç¦Ð]
-8q¶¥#+KÙA90xót¢1Âñ¹{ÙÄõasv&3XÂó¡³õ(:&t¬«J¼Éu5×á»y^YMMF"¤íh-ÉJ/í;:Yëízâ#ÇºÂkDr#+h}¼ÌU4eÒÚ÷o$$YàTZ#=á;©:óL»Q2Ø32#=·#+oåëç·FÝUN­#+"X=ÀîLçs	($LÖKÒäÌÜìS_TæÏ,J1\	$
- 
-ELb
-¨~&±ÑX2YScv1×D$?f=}y	§£XÑïLÐP
-cu2§Y¡å­(ÛMo5pÔäÙ­¤àâ7¹l^=WVZPS¥ÖaL£FÞItN	ùh_4ñò"
-ø6á>ô6ßü
-´£
-K+_¨sQi;ó#+K4d
-ÆänÃ£Þ­Èj`	ù	|#+oÓ¥âÿÄõê`¤ûoöx|Ü>çéÀâI1ßpk¡'qTãR(C H
-oDq¨Òm1ÞÚcwÛ¹[#=Íqt÷vh-c\ëÌAÔ¶5ÈiíÄé;f&H¬á¢&t
-pô,7#°ÌxpÊ#ãúÔoIK«:uQY¥¾·XúÉi+)ÔâøomìÆÜ\ÐZw
-,SÜÝ¦¹|²
-Î*å£¹W%RÎäb/øÿb}¯g_Õ¾AtwPÓq[h¶ÄxÕ*@"#=!àÑq)@âa³ Cl²#+ß¢³E2>Â#b èn~ÅçûF±¶ç¼Þäåí
-[ì+E«îÔòu;ºØdãÙì0"#=20¼ç¥;8 ÃX§vü#=ª¹D¤º¬#=ÆP¸º|
-ý¦ÄÞl~Þ¨âyZÉÞn;wÕûKiP(¢#+#=b\
-EhØJâDI±Ø@Æª-¬²ï.¤9s[$òÛyr¬eeT3ø?/qñ<Ï²2ìáâwVôéÑE±
-)Êª¥UJ©B_Õ!åÖÌÂBÈ$e@fnÐ¹ÜKb¸Àj, f`l¬jvp÷8Þ÷¦÷©XÇ4ä£¢´ÆÝ°s#+É5Ù¹Pj¼çrothô¡¢d	×[\#PM
-p÷#+#&3#=ÎQC83¬iXnÐv0âA¶Ó°èñ.Fò(ÚLc
-ÂTÛX#ü[-Á³#+ Þª"ªUrtM
-a¥< ôí¨Ú:ÅC¸4j·ß2ÖuyIÕéùúí±ÿ3Bi1úi-Ïí>6±?â©ÈÀ$àö&¥É¡GæH´´Yt´ð°AöuHQ
-I$îÕÔQ²Å±µ%EIkJmµøÑ+òÝZwknÈÚâP*#!#òèÀ³îÖøè-hø;Z©ÇÞ
-8#=#=?
-¶­#=ÐE9¼öì:<sË-À®¤³Ýs8ë /ÄB¯öBÉ F÷ÙEÓ
-9Æ-/wÿJxÍðÛ¤R4#=íôOªÚÜ·Û4öÛ
-bI¶#+4I62l	öSÀ&·Ù«ö«ç³}FÀÍÐÈÁ3pôZêªh`ü§pxvM6YÈ^{ìÒAz`°±Â£krZb©P6èo3µ)àlÎÒÉË~j¶f¦eFÍAÚ<¥GÁóM(ùhý«ÊÝíMÏÜF°çb}m`Çx½ÞGbí
-Ã#¯Í÷±Gvû¤ÊIj_D)}_¬ó;ïô¨
-ÈO£%a£séë°÷AîI<{ÐÓØêpMJnÕøãqñòGÔÓ09'l`i/ªé4jì¢äfaÁóàH±ÐMË¬o
-ìsod× C)uÏîtç\ÔÔ5o_PøØBÉ0#=´yB>í#+¡~v^`ÏÎýýÑqhoÇåôgYncV¤ 6Î²7hØÕé~ÂÛÆú^×Ñ×Bå¨Q 7æR<@Û8úmÇ>;Uó1B_½79¯êû=
-.©?ã¦_ñv!-
-êð×¼R§<ó¼·e¬é
-¥%ÑEJ¢VB(¡«ñ0L|d¤aiD&¾ÓLWaÄõ
-yó=hdì;_fÙ<°+a~{óÛ3ÆJ($ªl/rG9î}ùH¿S¦îý=[åÜ·¬ê­É÷tQXJ«C+¥EMO¡fÖ¼dP4`1ØòÐ'pû{ó3Ã°7d*_Ø?4gzuù{µ
-½¤æ$
-{!ê E#=(¢¡¬V¼ÃÛÏ-ãWZ¥»­]rÌmÛ´¶mLÖÊZKM­fk[µ¬hÝ2UÛjÈF©TEUÎ
-
-åUîüÔàãüX¢Xñã#Xèÿ\´
-f
-ªd[EÎe,$?Ië3!QßýsydÊ³üDHÜWü¬v.ÅÙ
-5çK*/#|(j;"TnH
-(ÎR`pÖj[¥çÀytZ³¡
-,º¢êËB3hg]ÎC»öý¢
-0pÔîßm¤×¬£^cûauléÜ÷ÅhMÇ¶mö×3^ñQz«ÄÀÔoãä¶1pÁ¤à
-ZG{Yü-ì
-Ô#+Hêô
-ZrÓÎR~3ð'áòÏæÍ°äho
-V÷W«mdëÙ»4Q 
-ròÉ1q3Çè,Ö«ÐirI¢÷ü³òþ¿¹uB±ý
-Í@¢ÞÍkîGKA_oUj¥Ö©9ÕÔ»5ÔC#­±0âáaâjÓ´B~d[í7¬ºJVÛmìlL°à&Q¨q@öµ
-ù#+¥¹"ÛînPààLì«zKtÐ;;¸âò´g#+¹ÏÉnv][³3æùÑÔ@}ÿ$ÿ'ÈLO"ßïKó8ZCÀØ#=eïÕÃ"Óí¨¸wlÈ*u½ËSÌ!ÛÃU]À«´eÁ®qÛò¶Ð°Ð[FÒOaN!Å#ÄuQ	b¿ö¢ûýÎ
-ÏPÑ¸Ûiå32ÁNKõOÍ¿ns´!¾Ä@	®R@ì¬Í7Ý[ÎZ·ã~|
-Áo}¸
-
-daGÕ>R4üÐÊ¶ý 0¼²4A¹3Í¢uì&:ÐÌéÌ`h¦hÁÌ~ôÂq¤GÍ×ÇaÛF&ëúXåÄÑ#=Âö'xtÅlÈ
-£=ýë_²ÑaC/¨ëxóöß/Vö«ìRV¢¡çmW-tû6ªñ«m¨ÛljÖfµ&ØØÖ«ÅÍ¶ÆµËk_)îúÖó]Ç}|ÝVô0U³íårUP¼.#ç½åÛÜúº	¼./Ð,±À
-Å{¢¸d¡Åg³h¸åA5ú<8ð©Oãmü Ä%w Í
-pâJg¡õi0¢AÁ[#+FÓ££î¬¥ÓðëiÒ4¥?éåúT$U
-§­l5ÞÈØk
-$ ðjSÏe#+P*Ïð¥1=¶´b&åÙ3?½°á¿®pò¾]åØx3`çæeÖ³Òb;jÞÌa"7ä¥]~Ñî%?#+FµiÄ~Â®3"là&ÿj­Ó{³kñ<â¶Z¸Õ«®JªÍòòñ»|Ûé´tp)¢@ft´¢+òZ$
-à4!J
-.²öÌB!QN¤ê=¢?WÜ´çd¥Ùi²
-X
-ÝÒÂée k¾WÁÛ¯tõó,·ð
-¶êëw+»¶ë»=­ñÚ#+#&$¾DNåµªÚú*­¹õú¢éZ½ÃË­°Ò3äþ©%G
-c"~k{ü£ûxkeÄ
-|
-ÛR÷éH^hª¡:#+¹eË]ü¼>Ä~à½õzùFÈö%
-}Û1
-ÄÞ/Ï Ç#_âhÛ	¬EY©M¦	÷8ËÀpeFòìKFÍj7¶2DØ4HeuÆ0rÆ;¢!F
-
-Â°!°
-¬dëºnïÜz½[Ö×±.`cOnZ¨¡XÁÇ
-48«b&µG`Â
-LM²9«¬Á»p$Z!S¢j%(H¦¢ði#+bÈF6-xå(Þ¶³éE­KH}_«0¶T)  Á]ú%ySm¦s¤^7]wfÌ¥×weÒy|}ziLj(9ëÊçÑÛ¥^nöó\µ4 sjÝgÎ·*lLb-M-,ÚKe	6e©QJÆ$6²Z^ÝÇ©ÚÊ:[cM×\
-±=ºñ^yßèo[¬PÔÛ2¼÷ë{=ý»(d¥*
-|RóòÄfÝïzóÖ¾½öUUq&ÅuLcÒ¦H©t¸¥Ó
-ENnC
-Èa±é:Â@ÜaVÐöEuÓÂÃ>T[è7n#]"åæ¡¨pâ![cqÆ?B!)ÁÂ LsÕ®E¢mìWn|Þ9½hoIÝdUM».²Æìq´È=0UÐÁ¤Æ5è@ÔmÒL&åÀVÈQ¦6Å¾#=9adU
-@Æñ·V
-#=h²ZÐ#+ NÚ9m4À,"ÁÌvÖ0ÍûeØ
-1ow)8
- =9aZwI¥X7rbÈ¾Yô½}dc°+.âº£@ÆäÑs%#=§_ÌÍmé§Kª&O\X3ãã1xE[ÉÂªÃ.¾ÅàËMZ.7±0/µ*9 ¹#+8å!6{ óf/R	µ>m©¡¤+o¸¸¡Êûú"röÒbbC"5åxnH+ßïR?I,E
-nÔ7ZFcJ·###+
-´d6LT+ Ïm¥´m4UÆ
-F23¦3\oDé-æ{¢Ð
-3VB,Uáa.ÈæX OÕj2Éråîµ»úÙîQ\³C	ÉØ
-´(@Ã*TÒÃ¸¡JV©­A9SÂZHÉ%E¥#ñCa¾ÕænÐ
-DÂÒ
-0CA¿*å¢®SeÔ©^ªÍkÏa¦BE
-(FÒÀ5L%I0?¡n9õnåë_=f¥çËÙMO6lÂä>Ûºëí`=îÀÕûqaæÔøMSgå#K1*<}N7Æe¾³÷tBW#=¢IÎ~( ¤">$BE!TÑ#=×ÛÊ¹aT5çÂ¤¼SW&®øh{^
-ÝybjSæ¦#+ìåÓò·gæË½IÄ:·³"Ë"é=TÓRs	Þ¼ºhy!Çèf²~ýlKhPo8ï6µQx¼ÓÝ¼A~ØçcO»×ØvQ¸<9,#Úq^Ó!SH8ÈH$qÓ)÷ð#èÒl&I2´Ï9r²	qMåÛ=ýH:o¹Ä(QÍvÅ#¿ÉòfÈQýózG÷Iø
-1xàõ
-|ø-7¯èÈ
-
-ý
-l?
-Ý!$¯
-xmÏ`G¬0ù3qæaFÛm $ñ7û}Ü=|mìõÚFâPa¤úC
-ÃÆ)Ó¤Üô4®é¶V=.øàudj>á~`¯öè¬}
-ê 
-ôP4E$$REdJ`ÐûGáfXÂØ´ÛúÈªKF8Àrî­BëUæpvÊyxò·hÔoÕÌVw·I«ªÝ*îäfUÝx¶+®ie4jblÓ\águµ%i++*®ZïÖæµ%äÖ©h
-ØÔEà°¢À\}P©F V¾/ÜÎÓM×¦XÔ<ZZiÄútµÎ¨%À#=C"%TBiZÏÁ$FÀiq¬vhH2D!´ÊD«jR!á5õ]ÊeP#=EF¬[)5Dþ3¶ÂQ«MÆÔb¦TV66Æ«3Q£2²TÊI!lÆÔTµf¼JÐlvxùïÀGß{5¨!eDT$	$!-~ÁË>9ôøß¯½àÛÂ¯\n\éÔZRc1Æzy#=(¤«_vf¬mGÚç«}­¶ßµãoÒÞ#+QµçkµXÛV+f«K[+Óm««MI°Z#=R,#ür
-ÀÍÐÞQß!<Gë13n$d$x³bïÈpÑÍ.ó£GÕÙÐosK#+
-uáNSdF~pçE3
-À[B>!CçUA·mwií¹GQE½ý/³AüO×xW>M\±_ºÖ¶ü_¥ãóà>#+G¢ã­³1bÆÇ!püö:9¯Æd&Ü&£IKA«L2¦Äj·?
-×uÈÈú]ýÌd<Ë§I¬FßÈègOßÏ;PmµÓ¤­-£v§UáôÒã¤ÓÇ
-º
-Ñ½'ÞqzEÝËÔà«Z»Ó¸g}´ÚêêYþNé	
-
-yq9Ì6ÏaôkV#+´cAo··[«L¨®5låö}Y±ÿ2=+m6¾'ò`ýñ
-«+´÷ÐóN°'|(nÉ¼eövmþþtòOÒ^æ¼Û'µ|îôÈì­
-{»^#+Úúæ¯­4 pÞED`«ljÁk©¯Ä­zj¿D·¨b¿
-ý)oeUø¾öÖù*-&øwkH*ÈP.Ù{Ýí eÇíMáÏ]ù§õ ä-ã¥¸NÙû
-l3û¢&	 @a"Qï,*&Dé8!DR59=´¤Gß­¡
-ò#+$
- )$#"È#=´¬´È×Û¬EsWi[wW·ªüOXËR ck
-¬­ëµUW#ÖlS-f­%¶â5jÖ*2--¢ZFÌ£lm¡¦
-V*
-fEÁPÉ¯Gí«LcÚl¡Ã¦#+SòÇ©¤½êÀC£ª¡=§VSX±2çÞ}CQ	UüLÚM6ÛdÙ|ÃÆF2iøé²#z «°<ìBB2I"#+ÕäÜA0þx<Êùü^ÐªRýµDuGètÍ84ySù¿ïÑØÝ¨ûÁCÌuípC(Q<¥*îûðànúå^ûäiDÏ_8ðÙJ¢ø|
-S[T¯¢Õø6ôç[³å8PNXÑSHHñá\÷5
-ÌD¶l âß³¿l4·L1`Ð¦½æ©? ôAÈµÑzÑ
-±öÓè`´}¶	±TBERäÔ¡¡õ¦ôºe& 
-¬F0Hï»XEltlòøÄ1û,EÛ#+¬N³¤ÍïX
-!U»\©ÌÊÇLQ DÐÊ¤Ð¯mÙ·µwöÊõóÀ$
-ÄTæF@ª*QQ¢¡¦!bt ÀúJV ÔDõ
-jtýymÖ¢º¢UHEIB¥@ÊX
-ç#=¨
-Äþïæðl1íG]Ú¦sUÍ.»Ï7¨SºóX
-*¼mË*jÅXÑ°kÉºmFÐî×¨évÃ¹·wnÒñ^-^5ÊÞ^]nsY):<ÕºµZ¯-µ6wmQkÒ§kµ&M-x»]wk»7]nÚwusn¡Ë©cQJÈ¨BÆÊ#â0#+%ÓH0zuz6
-ádÆ>AnlXÊÛß@êz£½
-v0< ÏAP§wÀL"£¡GÌNì¨ùý¨îNÑ¼@l¯ ÜîH>]¾Çówgø¢Dúô­Íþè2wÀß'vÇ.À`~~zÓóõ=©:NÖÀ©¬T¤ÀV¨¦¾½sV­ú±Vµ"¨PFâ0Z~x ÉîûV½cMEY3+µdÚ#+F÷kÞkôm~åmK^üº6#+k;®»©Sd´eÝl!6$!>ò.¼é«ÒwAowñ.Ö«â¾
-ló¶½½úà&"JEBA]W} Z
-¦³V2DkÅëËuµÉµuÖ×jgÍ^TöÖm]ÅX°Ç#)ç±1"åÆÒ¶ù¡¨²(%CT#gÄ~/Ã6
-½^!:Ä@^"ÁR*HA¤T
-¶u'ÄºætUChèÂ! D!DdEäÀ=¡ÞÏ[WÕ~÷¾ùSQ¥2Tf#=l¦KUþ
-UFPÚ©Rô`8
-úàë§
-Ó>Jëc¹H¡)ÖY2Qý¾E
-áKQØ
-N¿oNÍ@kæm4ùxû·lÛú`	ñÁ``À©ûIk{gåm÷'Û¢^äfN0äÎÁÂ A8z¶+÷óC«(ÖÈHCÃ·nÁÏ
-
-ÑáIA]<	~Lv
-"Ú2?´Â­Eýõ%2%Z*"¶H6 ÛmLª
-Ú
-Q¬1±&Å³pJÆÈ|Ú¨k$¤
-
-i6;âñX-ÑÍ·6Æ-í¦­KÑr/©Å(ôã{{ã3#+|xÖúoo#=ª3©½û2È	#
-@3vÒaz`[µü"«HÃ
-I4"Àc¬l(\ÌD	6!´±"¬¨#=J¢¨ÄÁµCH©»q¶é 5]¥'
-x` FS×(§Uø¢ÌfSÙN@Pb+	(8*ÈÁ4¨°ãÜuÙ
-þ §ÚHÆ1Õ¸R±T#ÑD÷H"|på±¥~-Iuëeãj-fÓUò)	ZBf#=ð:ááD9AÐt¸ad<#=ÖHBóû§ªúëI¢:! ±*T(4Ì4Á¦°¡ÇÎSèfkÈù¶£°14#=FÆÖd(ÛmÆeË}ð cÄÆÖ4f7$ÿ§.KMcu44g~Çï;+cZØß<Eh§&ón3QÑ¸ÏÝ.Í¦Û/ë6<¹'
-:òÓ
-ÃB
-êú'qèÒÏ¥8U?¦|e<!¦ h.³~µT5¨H!÷B¬ò¡¢(#*E7XQcb½Á[O®4ô:/úøÁ A-²á£ÿÔÎO÷±"1HPkêHø»bý 
-9ÄCãChßÞcáõ»\û<¾
-Ò#ð¬í_\a.Zò× ü~Á¢Â
-7ÖmÀYD¨#=
-lÞK!
-Lèc[qx²ô¨­g)ì!¾ôp Ï
-;á^ª
-i:%wf¼E5ÃàÇtlk=
-»ÎXøZxPØ@´÷Ñ|ûû
-fÎ{.ðí_§÷¥[´õ {Â%Òíâ¿³v6«Éíì1Ü{$&ºkÙ¾QéçÄW]­ëm±b#+NU>É6ÀÑ{s&Ë«&jýÐýú_[EÀç,èiFtÙ;Hóóù#z5 m#+Jt3 V­¥iÇ1 ¬L¨M±¦QàÅäV««¬IhÒq1Ü>Õù°Ó|ÀÅeoÓti­¼Y^¥ºÆ.ÅÌÍ(z·Z³Å£È<ñ7U.ÁamR¸v#=é°AÂòWfù;1Iô¨ç.ÈØ~·}¶Ï	gZ#=r§i©«ËG~¤%ÏW'ª!4Be> ?ªmå1píAGàÒËvÌ"`rÆÇf
-£WÏÐSÑÞ"eßo²,ynl÷AGx!2ÓQ, L:¤ÈÙíl-¸»`q"¤
-o^§Õó>§°¥;¿ºw!ûÔ_÷jz¨ÎÅ[
-Ä
-g>\µe¨	SÚYá¯.YÀó-TlE
-¥ekøõ
-y©:TÎ!Ó¢#+´ø¶Ðí"?DÍq|Î o'ªT#IØ«q/øzµ0IÐ.
-o/ñäuûQcã_¢ ð~M²í
-6Â;IY­Xª$J"7¤v%
-[ºø0Ñë5ôP&_8ÞÈBâoWdoá6äL¯áóÖÒgèa$lSï¯«zEµzåÊ¯R¸^*y³;"Ñ3JÊã¾G~ÁWE¤C§\¦¥Ñ
-£Qó
-¬²W]Mÿ\9xÐ7¢Õ¡
-uºg{|
-¶Jõ#+$Þ
-Ú®Yàí<"W
-qË×c¦	¤! m
-THÌ^u©ß-Þºì÷[áEì½îéî%¨ è®¢ºðöR wF>N^{º±hb9@Ýü»ïa÷BI0`78Þ!Éra¬ý¤®²f
-ÙjyaD4ð3
-õÀIdþupFÙBo=õäL:gBÌZbE ÁÖreI³-×ý~Ù°%ãÈT5:Çí± DT´@½ÜøÁê
-}È|¡qýÔO¬¢ H$^²Õq]B}×6Ès|¾³ðÁô>Èd6ùÅà·«Æ Òd}x|ÊTÄûz#+yïü#+b3>G cÓ©ãÒ}¦A|LzÔ|C1ï´mø·º#+°°éPÍ]µÎ¥ÃÊ\£#ë$)ñMaà:H+ÐÃºÂ½»¡[õì0ëÚyD:uQá¨Üï£ÊË§Ó]·Êµµ5cçØuN'
-k?©Nj0*àelbNÜJ -½Õ_
-û8DD$Dí°H
-#Ô
-HÉ
--ÙÖuõÔæòuK\¾kSÄ¢¤§m
-bc4<¢p>UóëS£>/ÒnÌ@³m#=Ô¸CÒ%D¸9:Óâá»à#+(V¨^
-ljsÁlEGz;|à­E@B
-òwIý]/ûAAS3õPLí-l{²þÍ(W(T½î!;ýæ´5aO#+MvM°+)q|b7Ç¨íÀ¾Aj Ø
-Ü¬?QôIþ !#Ç#XçGÿ0
-yÅ2'
-ÈÒ¦¡
-	R¢Q¡	.þ?VU­#+c
-³¦í~]>ö¾?l?§Ë{Ù§û¥R*Ón7|G2#èÕÖ%1ÜOë=§?lÚá8àÐkÏÏ¼VÙÎ©mOQçÞ¥ã{aÖ²Oø£¼Àå¨ØØs¬hf8$12±°
-<îTP{í@:Á
-SßA0ü¦fôÏ#=,FT§>¼r	pd$6Ù³)52ÚkJhB+d±g_#+Ö _Zn1¬½OpRH­[º{wéßGïº¼È²C5iRP)°ÍI¬1³3Ù%,ÈI²¤Ù¤2¿okë¾Ú½Ú6¿	êoªn6ìÿ?³ë
-^"lnjÆ
-Úå·![ÉJB
-I þÊ?l«ßyúëÔzÄ¬V-Ç¦°ò·]d_*Êõ[W[%ÞçÉü<¦#+é ìÃa1ChÑä;¼Î
-b½ÕMvz©bY[sïìaO
-©F8ÄÐÜè¢±õ
-8&×EáOy«¦-8üG÷ugýRðJJt~çzGðUNR¤X«xbãñÈ_ù
-Y®FAHÁ §ëÈ°´¶ÔVFÙn425s«3Wªð×´ÓhÖÐÊ;h£I´°#Ø(ÐÑÅ®ÎeÍÝ®Þ×ËÃZJÛ§Wa©
-·¦0bÆEV$*Àm#=1#îÂ$á7²%L|
-±/ì¶E3
-ù«VIIB1+1#$q(	5ãç­¡Sfú2fuHÿ|nÀD{­
-PÅ\³L~ªKöòVå¿q+]]aÓ9R5¡Ù´Jýt|ÀÓØR¼lm3ÍÑGÚÐ'(ÒHók±¢"q60.j/W¬Ú§¬·;](+M7iÌ¶Q°h0¥¢²2=Ij"¢4ÚÇ c,E$Pâ(°%½+ÔuÂRö§o]]%ç7¢ÖUÂ«K
-c,e
-H6n"	
-H£ND"«+ê®6Ù#+À7¬¬Ô:Ü"Ph(Aªñ[Ó9aózÙu1îÔ=¼ÖíS\<¸
-Q²MCt¦5ëF8Í
-9h0iÆÞÃ­»`¥#=¹dxãLmÁÇ0hµÂ:d)a«# kÐ6ÔÍèÓ4«börþÝÕÉªùcI3¤A¨
-cQé
-haÒq¥«
-ÌÑiR452Ð!Æ:ëVbn°ë¶j
-ÄÐ27nGFº
-ÔiHõÉµW#+HÌä
-ÈM'´<#=n
-41­(@Ñ#+±iÓ#á®¢c`F§wÌ¢­Ë®
-ëÛrÒ#=ÒtpÒ:=fTDQ§ÃHÓ²é7¨iÐcmÖcQKtPÃ%Õ¹S§5îÆ
-&?°ÛÝ¾<5YÉ@ÑËÃBmp¢ÐÁ1PLCÒÃ+ÕWãÛ#=d]÷k
-=ÂñU"üXfÈ±½5£MÑ`®Ù¬àÙon?i
-ña¢^QX}Ds¼1áË|ÔTFaiCd0NcM0¹E½ÎÚP²9$p^ÕÐé©ÈÖZt¸K¼X	©£ÖABÌ¥öuq,vmÑ±KUØE¨p(42ÉID
-W
-¥0¥[Q0ØPSeàÄÚ0hL.`2#+*e)£J}Ò½ü©P?Âª%D½ï*ªÄÉ#Lìt5<+PeõÚñzù_;~= Ö£ZÆ
-©±-&ÄÉm|îVV¾vÕ+_µÐýQ\0ö.i¿5¤ÿÛòYªk°"s"
-Á \êÀÒ}?XÞ÷¦ ³4.vvVï­%jrÈåaY#¤ÐHrÁPó ùÔ¡¨&§{) ñ&º|VmÅ&%©ï8¡E{#Å6ÙPbí´À#=zµ(Qÿ-o
-Û¦±×WWKVöÜvRDÕD
-óRÔ0"5Vé)ä£cXùkå9ºgæ×mfI}ÊN¦ýMÒæ#«MÍ)Hó¿éZ
-t¾=.-ï"ÅºßQ÷ÓXÛVtpFá¯UÐ)Â#+%¹P~
-$a©®Íi#+A*Tk¹o
- É>n½íÄñ#=tíæ_X"~ø×
-DNGèZ¯n1¹FDNâv(íC´hûÏÆ¹æõf]­cÂè^ä-k&Úkyº§ÃHþÿÝ\´ôþbýF
-H®í¾lDltã&Ó»G`'gÓç¤ÀÔCÑU}ÅXÏ²Öå%<K@ÛfÑÆ-¢|G1FnJòrñÁD%uüÉÜ&®À©(÷H?rfx2
-Úü@	åå²ûÃÚo}²@*#=ì`l­:Í>¬ih vp"ÂñÎFDÚå#+4ø´K¢@£i´Q[ïm{ú¯{Ðó/ÙkÛN}'õ÷nÇYmÂ¨XÝMq
-VÀCbÜåïñ
-ø
-ìx.uS¿oÝÑF
-%ØjXÛgóÈFúú½ó)çr¯;Æ;µÁ©=74[ÙÍo^Ómo1+Ç²5Íµã[Ü±x®mâ«$tÛ5tÕr®UEµÒæÞH"ý
-1¦Û@F´Ñ©4	D[c`Ò4À®#+!í
-kÑö>ÓÎÊÞBÍ(!ÄQWÄ[Å
-íü4 áhHÄáêßêªß§ñÍ;4î6ë«ü 
-
-îËïD? ¹M«õgãRU2#		jbo¡¾æ¾MÛnTÍ6îd¨ÄdO#=ð&
-¡´AÉT@E±+WX*m_:Þóy¬µ»Y#+C0xD{ÂH_õ½¡´;)Ä#=
-ÀPÜ½Q:úû^ÌÙÑCSÎ½;¹«ÙRô5«cÞèT:úIXsCù
-1èú¨xÐTë=7¯xÅDÒ
-h°üi$ 1FQ±FÙ)F,É-MÒPÊI&kÐËj­FÕSSlk-¥Z+ÆÆ[õkózøwA03%l'"iëÖÁj<«,ÝCÍB$h¬(Ü¨V¢
-¶ÑF±R)2ÄM±ÄW#m&èÁiL4#=
-¢W6Ô­ºmVÌªóÁ/(OêÊ×ck^ßwZð¥ãeÖ¹¥Ü¢.Ôßº2i#fRüòÄZk(AìÄv3Ù9"tÔüz}}F
-uãg0*I7¯­ Å¼34÷æg.3¤ßá,(¤ÙqXÊkîçÔÐcÅ2dHÄ¬*rÅÂb	6ÕJì6VC5xR`xÑ¹
-HáÐ	²Z^D»é#+IÈO.¡N	#Bftôï.Ý^isf
-Ë÷È5$DdEAj#=Ñ+£ e
-8"
-¾NK<;>¼]vÇòB@n1`ã
-Û;\(ÚD}~Üð9ýûÇóhmÁÌ§äkJ5BUQç¤YÞ¿4½^Bm³àþ^37«tq8ýPu³æ^¿Ë·¯­­ùM­8õÂ{¸MeAXqüj-Ã³ën­ÃÓj1a#ã£ïÓÅ²jQ¶ESàeix%Deaï­­¯5ØîvÄÊW)
- ¨yFùìþI¶¸ûS¨É·E2cîElçeÊðcâ$Ö»Ä­VO
-/
-m¾¾Ø¯>ÛÚCª)u]ST^6E 
-h
-\~­é¬qè#=°gÚN9¹#+¢w½î
-dÞÐGWÖjÀÍ q8oI:1róé])ï+iO:]Ô.[:fÖsb
-#íUM5Ã×Uý¾+¥Åå=ÛD;:G9¹ tÊâ¼=ÚÛ¬+Üoe¢ÎhqîýQª®Û½¤¶Í"¿IÀ*}®Kìå.×ó[÷C÷Löy}ÜÏj=U»ó(º|¾* 1{½<¹Æ|Ù¯B2&§²¨¨£º*;bÉT¡Î#=^5ª¯_äÏ}1^Îxª·sÒCI$ýôNhì/9
-2;â	â_ûý­ÖYW¾6õáW¬·ààúñ5¤Øõ­ú¡dÁ¿ÑM¬Gµ¥|­à|8jm^Ý|àÛ\½Â2µ+9¾%¾/)ãúI'Ó®®».
-uêeyâµ7ÒæL]w>îÜDí|Ç
-6)$&tuiÈI VO<ZXÉ'XÕú#9­Ü#+Ì°¶
-Ìol¼3Îú|M
-à$ÀØåÆ«£ám89÷wêÅ÷qÄÈán¶ tã»27ç©ÉµMÕÍ»êTHpÚoÕ©¯ CÀµ#j6Ò¬)éÂ¶;LÊE4Ô0KV]Óá³~{©sDcì1¾{Í#+«êo»ÛÒ´´fuÎÄt
-eæIW
- ÊÅÞz[¶jirXnÌïËÐÚÒÙJ]¡¯
-Ô[/=
-³Í>OÎ
-ö5ì]
-Øz¥Þ#+¼Öûô*ö·[{j]ºhÂÒ5BÏª#=ú­Qíbª¼+k¹í¤ÌÊ7<F_Fq*¶Ñ¤Ó§èf7ÐTãä×Ú¦{nóå%ç2½¦QÚ/*SÒ­öL¤à/ÉÓ&²âñ1Ý5«
-ßàf4pÂÅÆ
-;Gää
-«±
-ÉfÎ«çÔæÞ~'Dî¦ÖnÉF@½°ÐðÝ¢Zèá"pvH1¶M¬+l`Þ4#+FdSÜo(èPóS<.Z6¶
-6yÈ=ÝªÕ
-Ä5ì¯Ö²K&Hr­>q¾l0xw'9õÅÍð+±4wúXVÚ¬
-6ÑaÅ0;snbNZ³yÉ5ÖÒuêÀ§­ôy0Z¹M@^ê£l~Ë³1¦ÑÐgS§JØìâ#RèÂ:à÷òFg#K^ª)
-G_MKÀ9K$aJ/¡è
-3"F
- 31­	áÛ!³ebnº
-²I¶áÃ¡émA®ùkZÙL³i$1¡2º
-XIÅÀ±±ZJLJhQÝ.$XDdD
-DwlvÌB8¶Ïmr¾®sÏ#=wE6h:#=¡YÝÐI½
-Ì2ÛqèÐ®*DRP·>1&3<ï{!O¦fc04²ÞlÇ
-u«:J¡1ÊcG\tû³¦ðÂú~ivØëÉì®'Èþ*ÝS±ÒT¤Ó,@/s8q¯)õQ¦Åý:|¾ú
-SÞ<CmÉ/ê¤HéÎ'¢0£Ô3Ãã(Ãß®QPìÄnò
-;oÛ&¦ º
-Dýo7ÂÌTe14d:×Ü1¡<;ím?&ß,·<?JñÆçÑn#
-)Pù î%Ä°î¶[ÏFmkË#+`s¶ªÔ´æ¹|C"bâ.\Ô«_g(¸I«#=Y·çyKÓfr×
-Lç5ÞW·zåjvìõ#+:¢µ£eµàQ32
-W¿Ù¥8´Aqñ#+ºH¶*¾Á&ãzT×d2¤¡[(¶÷RÖZãH+oLÚWupÉGTÖÖ®
-7[¶úÔÊâÐØ-iõº oä±[]·Þ¼;vwæÎ
-õã½éb TÌ§»Û¡Î{Àü=¸OÇ¸Û­ªÏ¹ì½×Ö#ÀGyó¹³#5!3¸±¬çc¹åÖëÄ.5à§l+2f
-*!=16å¨&¦fL×ÒYO7	âéE(¹%%{Í
-b
-]8*§
-ÂéÄ&Råyf[
-$å4Â`§N	±|@BR¼H¨ÌëØ
-Ê?
-éÐxÃHXíéÄ¡
-#z
-+â´Ã\q9Rd·+f¦rg­ïwR
-îZåÎÍ»N$àÉ¶Ã$
-ºÌ1bøHTÆZiÂ¸¹B<nÛO7AqÀÔH	´^ªQ¹"\vKináÔö:6
-0ýÐf(£o0u³¾M'UtÔJ"8uøüqäÙÚnôVk?µ1ë¦K½~%9xôâtß
-o¯oÊÞf+
-: ·æákmÀ:EÛÉlEÅ
-9ÏÛÞ þi:îÃ>3F/;}KÌ«Ä÷
-e¥àñM*
-t=¡ãÓ.kõù@Î
-2
-hlÃíL_j*@+LÌ3QSÞRö{/iËwæ½ªòé
-ÄäÅ PPÈ3#=Ð±#+¡¶íjÞ<ë<å[Ómbøµ`AA¼JÈ!EtÒ¹¢\SÄJl°()À6B-
-Ç:ykÎÎáØkÒäYhqdnGcTvºÕìÆlaíÚ®46ûÀªñ¶7K+MµªüÊÑ«Qd	DÒ(mö³eú8¸±Ò0J¥|frK¦g÷%NÃÿK4>¯¬3¡¤XNnBÄ}¶dçø&#+Z$Vr:~i¡UÔ¶E­#=5;cp<mwcPª
-^M±G	$L6ÊádLi
-ójðfM£lÊ@ðuÖ$=bã(=HW
-Ò+JLµ¶6=CX#ÕPè³yZå)V³ºe)ÙÒI\¬¾×jO»,¸é$º0lI´b\4.B&Ta,´
-2Ã
-vôÞàc2@Ûk4³.^¼bÆÒ]Ü
-G.Ñ³RØÔDÞC
-m®uÖ§C3xr&á½×¼5ò¹7bÄÚ5JÓT$+p]Kw«ÁùÉ
-Yi&ëRq(Îm^Ñ.FÉ+sãó¥Ô©¾2éº¤Hä#(j@ÇßwjÊPC5 È
-9{à¡*hj'B*%8I/R)3R¤ÚÆÚ[!oO­sB'mJJ]µ6Ûz4ÆªhRCCÆ,éVæ©¢=CÜ
-Ó¶¸%KF*R¬2.ÌXi±ÆÞ¶jFåéÅÒÑË
-¹5Ìhàd¡_ÅZL:¶²Ç2ålÂZ
-)3Øj%·Ïcou#+ÆºçíÊ"*6#£#+ÿNQ÷snMW ØíáF%sO Î¬¯iì,qF6õ
-+FÆ¤n8X85#=Î#=Áµë©ZThXô4lY½+rFpRwï°sV¸@éMÇ¤QëÔ]s[!Ôzm¶Û8 ô5¤ÏïÊ\AZysp©:øMB´4G¹»Ú«é©Ób~ñl`dÙõ%¸å§#ÆûÖÝh|µ·¬¶IN¦ÂÁ6Ñ
-À}ØV¬È´ËI
-+#¹Ó«ÇÅmèæ»^¯#=<Þn1D+Óå­£k`>SuÕ«ð4ë&ÄAgRÎ]lèØËÞñzà§i
-ËÊ³Z»A@·ê}òB;¥$H²#+¡
-)(ì80Ïpqõ´u'Ôãm%æíäüöß¢Ñ+é[ÅúúíÚåp÷éC9Ù*
-}	Ü<$åO§ãYiÈv cliCB>QÛæ©ké@´ÏèöÒI`U4ÆÒÔÇ<ÑèñUsúú\ê Dh.@Ðúfÿ>Y;ÑÛ··:{uôN}¢B
-ï/#\ªÉ?õlý
-còº¥""²¦«
-Wr#+.äîî$îÞzüY¹ç·1¶7#r(ÛNk¸i({ç¥Û±ÂÞã{"xUUzGKÄØiÙM5u7R#=&0ÔÙÊX©TgÒÊüÎ
-}ÚjNà<Î=Ñ¨ÃÀ!¡æ
-
-£¾ÝKÙ·66¶m¶ØòKP¨\P
-`§¹4îü'±Mú¿²¿'ãü®¾Oë¿1°²¢ÊJµ`RF#Q¤²m³-e¤µ4Ø«h³I-42cK-Sf¡¦)5(Q6J(Ò°hÙf,"bEF$!$  ÈH?¸î0ñN£Öm9j
-õÁá}Ög	Í6lÚ5ÜÌN½ ÅëM	³±Ö&$=Õ±CxÀÀ¸. :Ôk
-3
-#BI#g#OrDÖÅñE Åñ@Z;z¤	fÌÉï,7´íNXÙ%çÀ9BSi´M7¿qëðíÍE=zz#+©ÈÑ$©îÜ<ÏÖçùõ9)­o3!9Ò@8¯ïúVÛ_kXÖ¨­~Ö®m"±E´Ì×Õ:Í¶m¡#Iâ
-*Ç°0C#3¯#+PkâÑ)'dÜO9ªÓÈ¼ªcK"#pÉàoCn]+¢g,¬æ*2´_C±ÊFÞÕuÆ66­YbG,LµB1-'1F#bloQµô8¬SlFH6'ïi©2	¦,#²Ê\û)Á
-´KLuX«¥;×#=´FJT¡
-B <Í÷Úô÷÷»(07Ò¢úü#=ÜÁç®«ä«ÔÝ­O¯Ö¯=ËÛèîqlkÅnÌ¦$F"4Û ÎÔF_ûPådLÛÒ\gåãmm÷t°^Ør,@
--©±¢è
-hÄuXÆ äÑ$m|Ø¨m444L¤WBÐIÑt(¿`$GV½üäèC(g`¥*$g§¦Â
-ô}æ~EÎ¬CÙóöMÇ£³£ùúyÂ z¢HgéÎ=Î2À%ÇÙä¡:ÀãíNu"M:arÁ¢Haw< D;èQEÒáU#if¼/ï÷³fí#ÜÜ@#8òû;½iýT#=
-
-t<,ÏR
-¾Ï:ó8½î:KVçÖ¯ö]øÒia)"ïl¶?T~ÀîÌ,cÛíæù¿9ÀÌKÂ¼q»Ç¬­ã0\èèÂ1o£e§A$$ú­vÖJÞKÏÀ5ðÄLJù'¹4Zñ£»Û©6`c³cÒHH$Dë4)3Ö¢,¸÷
-Ìu Èó2ä?ï2±!ÊæD¿]ï¾Ûuj+A#=LãÑ3"f%äw¢¾ÿSpÎfê¡ïÎOf¿O8DëùOwíßjÙª% ©¤óß÷3ì¼ù|/ÆzÐlM0åCãE	~ÿ#+æçÏ2X¡#=7ñf&¹@ÌÉ#+	"
-ÍÉðFéþÞ¶5Û?øÔì¢¼:Ëu¡îðpï	UO;¯=Ô¬­xa-®íõ´#=¬¢t¥,ÏT*Ã$ÑwX6£àâ^4q¨Q½ßjòÚk÷uÄ<	(Z$Ê*ªïl´§÷©ÃÆ\86NÐÑqJ#=3H2~¦RD©Ûw¤kìwÉðÒ-æ Î ñ®Dà÷×7¡ì4*U0#=Ê¥õ7Õ"òªVùÛ-Ò¾NS²1´+Ò39¸4<ðs4]ÇVV3ÑÓ¨±§KÆ ¹D
-2èË®8*[¦èrèç#¬*lÇ0ç	ê ¬ôJ´Æ
-Ê6
-§Ûp!¤ÓZc·!Î¤z|énUJ$QÒ\Å#+)K"P#+@pà\ÓzB
-,×=z0Íê
-Îh©a¡Íµ7ÆÖk*$ÌÚ,
-ÁÑËFs7¯èòðþ5ÆË!ºZv\prvHePöRÈGgtXeu§q°¼¿fô®Vü@_jx\Ì6ËaXswn^zÅêÏ{yç³cË0Sç[¤,6È"ðÊíN<©Ôï¾X,`kqÍ©HLB¹I£"ÀºkdU4J«!*ÐïSI:JÍ>$º{º¼xÔ76ÚÅ7nq½Ô¸àÆ1ô3	S¦Ø
-	ÉÂfÖÂæØ¹êÑ7j#µÈh=Q<dÑrøÙSUðbuQë Ðl#+³£ÐÒA£V¶GFióPQír
-¢rMv&q¨áñ¦ÃfË°D¢
-<!ßÊçO°õ
-&Û/BFXÖ¬c¸ºÉ¤>Î!­N¢]ÆE#+°ødÜî?19RhÄæPhW$JÊ%*xWg=©TÆªÊyÔ³^Ê
-¥m
-ÓÊ¬f¬O»©Ö-:UØµóåÒõ|wM9ù["v1Ìúl
-FÇY\¶öð&1¼iü	¾u§lÆ÷ ÛÕ§iÊ2iiz;Ú#¥pÙã#=R,ë<ïÐªì8%OG-zÌ«Âé*b
-Úæ\á!|¥O¬ðF·-yHvXenÈ
-z?DÑca#+­Êæ%7åî¥iö`Ù5ÎpÖá­±ï%ÚË44q<ÝBµ$é{KÏm&.Í¤n! eBwLôYz8`Á7&üÓ©¢DèNHA&ºe0QRX
-àa9 Ì3)HF,|'#+Oµ­#+£XÆbHÓÈ©"é×ªok]FçØnÓBÍk18Ó
-$Äòßç5éÏ.eö`[s[(¤u8)¡@b¨Ö¼ª¥ÙK¡¢ÔV-qÐ­	ì[<Ò!oÊßÃêÒELØ9Aø]¯4ßp×·=
-G,QKïÛLC)9
-
-ØÕ=´ùñM£Na¶F-ÓOÃROûÓWD_J
-ú8Y§1I o
-	³³XµaÛiÉ°ºZ>®Wlá0ç£%ãn m>L$WF-nb#+´Wt
-Äìm%Ø3ÞâÐÕ½'°7¶¯Q¥«µÛÛS#X|+aKá\!í±2v´4nÔ]¬XÅî´¥"à J 5Ej%Æ *-g A#L¥S@X§jb>o"2Á7Â
-¥æý>=qmíó:UîFd¦±Ô 0ºó
-$Âj0ìÐF³.ìÇ}8ÌuíÝÌ#+ö´4gïë$8±ùUWkâðcï|u6Ì'ïaÅÞ-
-Ê@Öè³J¨p©>¦v8¨Q¡¯£pÛTA¤|eÁ÷ãÆÞHØrø+r\]<xæÄGîiyçÊLsHÙU£`Ù0À¤ìd3X
-HÑ3C2©ã	ÉÑ
-Í½oëâÌ÷;¦ÞÖ÷Úî
-4´Á¶âà 
-4,  c6ÄT"²!¥Ï_B2AwÙ
-"Ò:4ÖÔ2n°ÞÍHh174'¸1½(hL:;ù(ÈÉ#UN¦ÔÀ:À5
-éI M#+¦ wP`pÑ³©`#¡QG&DK
-èSgn£x.YØèEÃU¯r	OªrjÅ¦-7"o
-SUvÄ><¾RvkÙ*M!TS	 Fve.èÒ£¥M~=c¨2ÃÛÀ¡! a#=iB ðý¿¿ÕªØÒtK×
-Vðé
-¹Ì±
-2»óë«Ýs|óÑ¦Ô
-¶±ÿQ8
-\Êo.²ü
-Ë;8±øIFE"[í[mÎe¯Î[
-ÐÕ5®GÚùû4i&RZ&¯_H ç²Ò¥GÊÔ@üøÈctó"'2©3õÕ½È$b].æxÃîàÞ
-EØ(ÓåE
-h°g#+
-Fl~ÚAÇv#©	åò&ö>þ
-º)+s*,
-
-µuXáÁ= Ë¤ÄfâêJ9:Ð@l¤h'Ò)®
-ç¢ªÂ#m+Ñ²NÔºkêzÑ:¾ÓzÍÀ¬Â÷Æ÷-(¼H©üX¾@yvXQn=ÇÀNdÃ\7í£Ly¡çBÊO¶)Bë0
-8
-ì±$Aö#=E
-á¾©F×£(Xâc0éí;¥C!ßþ3
-f4aÆRÈ± ©`¡Òy6i"Eu¯;Â^né¶ñ`d!	c%Èð¨@¨B6
-´¥#=bc£HÊ4Rd¹:a¦I#+©·0ÂØß{ÂØ`öbÒLL4p#bLmïêN}Cêëí	ç1í;4jÖ#+òyEC¢4vè>S1+5©ß«m¬-E-ÌÆ;QQX± p±ßxô&¹ù"h[\Ä#+¨s8ï$ÜÀÕ7J¼ØóNÒ	(ç~NÂTéºøqÀ>âþÄ/ÙÐVO±°õ½®ÄÏ¶rËrÃfé
-=¾¼!¿Õ·
-ó ¨ÀZ²ÕôÈö±fzßÐsæGTåPâãÎà0d*P¨óàc ÛIotÁ>Ï`a¾übç*
-ùE#n66Æ0ù
-+`½ðYÊ*Ï°1º:ëwAö amµ¥"­_¯KdµIhÌR¢*  ·>®F¸HâQ6ijµ- ¦B
-£GxwÅS(OM3<èÕFSR~½ââpé«á¶»#²Î¾_fúUIDE±B[[.Þ] }»ùd£ü"ÈÈ #=:~³mÜ Q<#=Õð]
-ßÉ&6ïÛòSMP`tTPÃ>ìg¯ëÑs¤éÔ!¦Â§)V\bÁÛ¦qÑgv[vÛÆµÍºNmEuåV[¦ÔËÉ«³Tóu­
-0. xë¼ZÊ Ütq0\:X#=@ÕsÌ:©÷'.§Ó¹è(iÛöè~¿´ûá&øÁ´õ"0êÊcB¾ÖLØÓ`ãýÿNí
-{6µ"¡@``­ºóå o!zê#+Øo(òÕ6{$Ý
-
-Y;1URFcO#=#+k¬+#+ëÇHv¥ïÆÐÖÀ({&AÂÆ{þïnüíkåÂoÌØ²ýKí
-
-Á{êvaÑF¾Ýr#%t¾«Ü¸9éiÜ¦>½¥åE}÷áÇtSämW~ªøäpÙ `f!¢]9°{!«ÔEAT2X o f 5UA:á	²^Ç¤
-Ù}
-½©ó=	Í}»01Ëc$H(H¤)lf6AZ²3PÍ¥ûí­Ón©Dh5¤ ;CLì#+Þfó04uhW` m;xöm×ÛZ]Bx:îñ
-ºzPGp^zpyÛ#+°I6|HØ1éÙÑÔ
-ô³«w@èíSÖ
-Ë+Ð"H@
-oJó¬HÈhÝeüg=ñ]ßÊøØÇç#+îSâ«úÞÁEìgä?ÅB8lñÜ/mfÑ.Â5`õ#Ä4C!á¸
-YËÑÌÛJõ£uJR%³YU õ;oÖé&eftÙ÷º
-
-ÑZ×µÌ8}Ì0t°ÌäÝfÈ+6|ÙÁ HaBÉ
-1ÀÙ4üõ>;6£ìôÐ`BY[áUNª4|¹ßC#+>3OÖ6
-Uó!ËÂc§àB Ððf¥Ç)(AärmÍ%o"W.´¸*'ò¢
-ô´4qèöÎòwrÕ½2Ñ
-Îs
-dlM öPXAPÁD³¦<·àÂ
-4öx"§»Ìñö­HH6Ðy9Ð=£Bä$i*zwt
-qU!,òíèÌãkÑ"ïFÙå;Ü0}gæÔ¨´
-åvÿyûÈ,AP
-==Úë(QA?¨bÖ5ò%@ªõ×üØýòqðùôv7¸µk#]ÕZ£%!"FþTX2¦ð-ì?ÂNKÞ}¤´>Þ>5P;Çt(§m¶;¹ío/ µç]
-bE£Y	.îQ\nÕôªñâ¼ýÛ¼uÝ½zóÊ®6lØj½k·a#+<·Ki-2Í©k²è
-)E4ÖMAá5êù{uÎÎèÁåí>W÷ØòÒLÁp|LþW
-äôtsã¸I	#=À	
-"`ó<mj÷üq´J&I,Y6°Y¦MfZ¾ïÑ×ðýúShÔª5%E¤¶ß¬¢HH`Z'Õ¢G×%-ròYÜ!|È¶Âp $Da=°ÔÂÑË´¦62¬¬c[52+Óª©Sd­¯ÇÕW¥!#+ P5½?áÞbñê'±ö|i£IØhA4év?Ø'Ï#"KCPÓMØZ!;ñ
-'pë$$îKÀòGIÐ×YA$b&GáÅøn®È!Q@A8J?b©ñkZ
-ê+h
-ñqª<yüÖj !_UþÎÌ±Ê­òy#=mX¢ú¬¡Ð
-kD@<ÀZBÇÈ}]]©ª®%¶Ëj,±J%H$T
-wÃ·Óªaå<ñ¹Dþ¹½GÅ`
-H`M
-Ð@#+ì5ã´Ötû)$9Ûó<¦½ÌÍ4Ç°?M
-g£7-)
-L
-÷ñTÒ3Gt¤&¼õPZ¢c¤Åöuµ¿ò©
-ÍhÁ~
-b{OèþÀ(u~j¾ÿÆ#=B¢V)±¢¢ÆÚ2[bÛîk~6¯"´SíU«^]Þ[Ëóë+,xrÉ¶Æ$ibhÆ:*¡	þÝ6!`P ÒkÔ£àuÏª9âºõBñÙwåTÛoéR6µ^mEj+%©JÄ&´ÙEXÖ©¦´Ô9-³~Ó<¦ú$B¢á«ÃéëÝ^Ü3=
-1Fñ*6Ä(Ý¢rªbûÇØùB0m,¹S0
-kl´Iq	ÍS
-
-3üV#É_$ÖîíÍVù÷mo6b1#+Ä>©²wÃîÉÛ¸ÁupC;{ä2N(äErgoç4¤É/}F¦zÒUM­ÏoÚ]_·#+](Ãò`cÛM¡µÒö*×
-u:»ãKìÙy¼­ãy¾ÅºdPÅk±Ú80ÆªPCËìÔÌÊ®ç[M*m-zî×9´jT©¨£c[ÎíÁ2
-ð
-1ÚRj¦F	¶R[e-K4ËfZé·iGFÁcØ­@x£\K";
-0õm´À@­ÝüÇ#+~þUrÀê(ùr½ÌÛ¶Ðvã#='ë¡
-l|±½0¨G%S_pÛÚ
-ï
-£
-#=¤Ãwû/Vv95#=Æ#ùÉ~|#+!±ÌD&óM9n1
-Éö-Ó|8¡
-ÈúüÇZæ>#=#=ÊIa
-
-7wý·Ã~rq·KIèk|3³KmºaiÄ8¶: X¬&Áæå¸
-þîv$úÖý»Q?_Ð:5?
-ôp7oÄÕzRD·KsäDãý<îûÓÏ[¬3
-¡3TÁè]Þ#]ãLmN3YFÐ²Û;Ü4
-IÒ&
-W#2QXqóÏ
-n¡º­|?6Ü
-¼
-à)¤rC¾%â2AD`Ð#ÕhÑp>;iÅ.îA1©Qõ=ÌKÄÞh?Çó.ØVöÓ)§g!¶4=±àÁc¯cÞq·þt-I,G#+@öÿ6Y
-å.ôØÌZY´Ó#=ÕÊ­ùX^qFÛ±#olH==	CÉÆÓÄ»²!Y§k2
-òÔçµ4ó&}UQ5
-c:dT/éÃ
-\Â&=*Í9#ZÆª&	adË
-äw%þ5¼Èä`fP3ñ­
-ÁÎFìñ?æ_©0ÆÁÔno½q¬Àîör¼5¸LÏ²=G»×g
-¬séaÁ@	ûtÀ,"þ9yâ7DLå
-Ô(¦,RéÅÌ,·¿Ìº¨#=Y·òüCÝëÓ×»w·6mÊ(gaWT
-Ù7K¹3ûp6A'ûÿ«Ãú?ÉþäÿN¿èÿ?«éû?ùóûþÏõÿóý?ÓÕÿ¯ñ}®ûû?§oô¿gWúÓùúþ?÷~Ïúÿåÿ'ú¿Õþ¯ÿÛÿ÷¿OóñÿûÙßýËþÿ÷»ü¿þðÿÓôoüÓ«ÿÏ±û_»ôR?óì¶?ôOí7Ü8
-ýa#+0
-ÓCW?É2?Ê?µ [2lþüïö*@\I!	¾ÈÛú5üú_Wú>xîáImSü0R5À`)s
-QÓ¸£\d£ Ñµ4G<ÀL`ËF=W»ý´T:øùìàBkÐ8Í¹T¶#·J¢£LC`>&fal;ìì4ÔðÿTZ'dXKYÇKõôý®¬ ÿUè©,3Ø(¦ÿVxòI HÈ$ÎE#+"ÙçgýøÍ§p·_óç-q¶ÙºFòÆGÐ¦gü<]nl®6&×¦6Æµ© r4­¨
-{¥Æ°Ù?ÅZ2(v7[Þ³x´Fm;y­I$ÓØ\ÇLÂðÆHÉPuÄ¸jÜ`iêN
-aÓ"ÆqÇ.9Fd7Q¼2òVï[MØ(YçQþsþ¬»^0K!¯#+5ë%ÅÏ´2#=â SÃáÝ¢Hc1Óqf¸½íÕºj"hTÍ51Ó.
-w¾,ùLì·+j.Z/W/ÉÝtí{æ3sW#=ÐÂhLk7dÏSÜÿ"1}^#+ùB£Æûy¦]JÔö`ÝéªHF.2<fù!]kXCà@é
-íõ×»
-Ø/qüh¡â@~yå2é#=ÄO­4I
-
-b00KÉ©}6êº'=zLVèn$»Ò`4@Ö#½b"§z2#=0^Ä
-õÛb$(HBg´e/7
-WIj&²C\=ÄOf/	c3úmÅâÍÛr¾º640Â0u¶¡{É`ê4XªÒÆÒ0lU¤ÉµdÚjH¦&e R ¢
-wØpr¤CõDqÕEJº^©¦F
-Á<¢
-,]eÙP!ë÷½;¼)ü$c$|IX#ØÚ
-Í!ZFS=4ÍúÐÚÇ´
-^<»FwÿYÛ#+z¹{ºcòéÃãD±×Æ¦Øi
-úÚQ¶¹iÎ
-R×ÖéâÃ}b²-@¡µ\ÚÏaüC=´$CÇës!TÑ+ê"i66a5²ü°ZG
-2P=Í¥Ï4$5°5Ëñ÷é
-<%) ­¾
-¥ì"H¸1±:âÕh±·5zkxÕ)¢,S-)ª¼_J¶¼¢´{.¦´ÈÔdß­¹eEÆä%Fì8Í®£¦ ì3ùi
-
-dó Æw#+4-DHÊ\xövcù3ÞL¡µªdd=QiØÓÚCÇþáÓÎêf½thÑï\È	úïYÙ
-@âú¶´
-×ÿ!PqNIò 'ùà	Ýâðí|µIªKµVM¶F¸mv«¦¯õÚ)5í¼¶ÕùÚMT9ûO,Ïþ~ èïé²½©¦Ì·¾îR<ÇvQ3Úí"ü)úåoÓï?÷" IÏí
-DÓ12D$Sÿ!¯ûæ_ho÷A÷ÿ¿¿ßþ­ä¡ùp\@«á`ýúìä1ÈUÚbÿ!APüûãÙÿù6
-Eù~u¿=Ù¤®ÔGö³Ï72x¼l= (ñ0«ÉáØ5íùuè;v
-í
-¢ÙôIÄT¡"$üh#+*##=?TY/Ë?ÿãRr¿
-2:¯¯ÿ?õ|=K k_¦Öÿ¶
-~:Û_Ò3¢ÕRþtYzÜt­gÌLàöf·ÝËw¸â
-ß<Î
-´C$Y³ãôæBÙFájÃY,oÃÂ"Ó­^bË¹ãçÆìÁv²dF¤ôN.¸áf&«x ¶
-ïtÈwêtO,
-\èÇp{åIòª(A<@s1âôxýÿ'Á ÿü]ÉáBBí¦¿d
-#<==
Index: waflib/Build.py
===================================================================
--- waflib/Build.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Build.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,769 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import os,sys,errno,re,shutil
+try:
+	import cPickle
+except ImportError:
+	import pickle as cPickle
+from waflib import Runner,TaskGen,Utils,ConfigSet,Task,Logs,Options,Context,Errors
+import waflib.Node
+CACHE_DIR='c4che'
+CACHE_SUFFIX='_cache.py'
+INSTALL=1337
+UNINSTALL=-1337
+SAVED_ATTRS='root node_deps raw_deps task_sigs'.split()
+CFG_FILES='cfg_files'
+POST_AT_ONCE=0
+POST_LAZY=1
+POST_BOTH=2
+class BuildContext(Context.Context):
+	'''executes the build'''
+	cmd='build'
+	variant=''
+	def __init__(self,**kw):
+		super(BuildContext,self).__init__(**kw)
+		self.is_install=0
+		self.top_dir=kw.get('top_dir',Context.top_dir)
+		self.run_dir=kw.get('run_dir',Context.run_dir)
+		self.post_mode=POST_AT_ONCE
+		self.out_dir=kw.get('out_dir',Context.out_dir)
+		self.cache_dir=kw.get('cache_dir',None)
+		if not self.cache_dir:
+			self.cache_dir=self.out_dir+os.sep+CACHE_DIR
+		self.all_envs={}
+		self.task_sigs={}
+		self.node_deps={}
+		self.raw_deps={}
+		self.cache_dir_contents={}
+		self.task_gen_cache_names={}
+		self.launch_dir=Context.launch_dir
+		self.jobs=Options.options.jobs
+		self.targets=Options.options.targets
+		self.keep=Options.options.keep
+		self.cache_global=Options.cache_global
+		self.nocache=Options.options.nocache
+		self.progress_bar=Options.options.progress_bar
+		self.deps_man=Utils.defaultdict(list)
+		self.current_group=0
+		self.groups=[]
+		self.group_names={}
+	def get_variant_dir(self):
+		if not self.variant:
+			return self.out_dir
+		return os.path.join(self.out_dir,self.variant)
+	variant_dir=property(get_variant_dir,None)
+	def __call__(self,*k,**kw):
+		kw['bld']=self
+		ret=TaskGen.task_gen(*k,**kw)
+		self.task_gen_cache_names={}
+		self.add_to_group(ret,group=kw.get('group',None))
+		return ret
+	def rule(self,*k,**kw):
+		def f(rule):
+			ret=self(*k,**kw)
+			ret.rule=rule
+			return ret
+		return f
+	def __copy__(self):
+		raise Errors.WafError('build contexts are not supposed to be copied')
+	def install_files(self,*k,**kw):
+		pass
+	def install_as(self,*k,**kw):
+		pass
+	def symlink_as(self,*k,**kw):
+		pass
+	def load_envs(self):
+		node=self.root.find_node(self.cache_dir)
+		if not node:
+			raise Errors.WafError('The project was not configured: run "waf configure" first!')
+		lst=node.ant_glob('**/*%s'%CACHE_SUFFIX,quiet=True)
+		if not lst:
+			raise Errors.WafError('The cache directory is empty: reconfigure the project')
+		for x in lst:
+			name=x.path_from(node).replace(CACHE_SUFFIX,'').replace('\\','/')
+			env=ConfigSet.ConfigSet(x.abspath())
+			self.all_envs[name]=env
+			for f in env[CFG_FILES]:
+				newnode=self.root.find_resource(f)
+				try:
+					h=Utils.h_file(newnode.abspath())
+				except(IOError,AttributeError):
+					Logs.error('cannot find %r'%f)
+					h=Utils.SIG_NIL
+				newnode.sig=h
+	def init_dirs(self):
+		if not(os.path.isabs(self.top_dir)and os.path.isabs(self.out_dir)):
+			raise Errors.WafError('The project was not configured: run "waf configure" first!')
+		self.path=self.srcnode=self.root.find_dir(self.top_dir)
+		self.bldnode=self.root.make_node(self.variant_dir)
+		self.bldnode.mkdir()
+	def execute(self):
+		self.restore()
+		if not self.all_envs:
+			self.load_envs()
+		self.execute_build()
+	def execute_build(self):
+		Logs.info("Waf: Entering directory `%s'"%self.variant_dir)
+		self.recurse([self.run_dir])
+		self.pre_build()
+		self.timer=Utils.Timer()
+		if self.progress_bar:
+			sys.stderr.write(Logs.colors.cursor_off)
+		try:
+			self.compile()
+		finally:
+			if self.progress_bar==1:
+				c=len(self.returned_tasks)or 1
+				self.to_log(self.progress_line(c,c,Logs.colors.BLUE,Logs.colors.NORMAL))
+				print('')
+				sys.stdout.flush()
+				sys.stderr.write(Logs.colors.cursor_on)
+			Logs.info("Waf: Leaving directory `%s'"%self.variant_dir)
+		self.post_build()
+	def restore(self):
+		try:
+			env=ConfigSet.ConfigSet(os.path.join(self.cache_dir,'build.config.py'))
+		except(IOError,OSError):
+			pass
+		else:
+			if env['version']<Context.HEXVERSION:
+				raise Errors.WafError('Version mismatch! reconfigure the project')
+			for t in env['tools']:
+				self.setup(**t)
+		f=None
+		try:
+			dbfn=os.path.join(self.variant_dir,Context.DBFILE)
+			try:
+				f=open(dbfn,'rb')
+			except(IOError,EOFError):
+				Logs.debug('build: Could not load the build cache %s (missing)'%dbfn)
+			else:
+				try:
+					waflib.Node.pickle_lock.acquire()
+					waflib.Node.Nod3=self.node_class
+					try:
+						data=cPickle.load(f)
+					except Exception ,e:
+						Logs.debug('build: Could not pickle the build cache %s: %r'%(dbfn,e))
+					else:
+						for x in SAVED_ATTRS:
+							setattr(self,x,data[x])
+				finally:
+					waflib.Node.pickle_lock.release()
+		finally:
+			if f:
+				f.close()
+		self.init_dirs()
+	def store(self):
+		data={}
+		for x in SAVED_ATTRS:
+			data[x]=getattr(self,x)
+		db=os.path.join(self.variant_dir,Context.DBFILE)
+		try:
+			waflib.Node.pickle_lock.acquire()
+			waflib.Node.Nod3=self.node_class
+			f=None
+			try:
+				f=open(db+'.tmp','wb')
+				cPickle.dump(data,f,-1)
+			finally:
+				if f:
+					f.close()
+		finally:
+			waflib.Node.pickle_lock.release()
+		try:
+			st=os.stat(db)
+			os.unlink(db)
+			if not Utils.is_win32:
+				os.chown(db+'.tmp',st.st_uid,st.st_gid)
+		except(AttributeError,OSError):
+			pass
+		os.rename(db+'.tmp',db)
+	def compile(self):
+		Logs.debug('build: compile()')
+		self.producer=Runner.Parallel(self,self.jobs)
+		self.producer.biter=self.get_build_iterator()
+		self.returned_tasks=[]
+		try:
+			self.producer.start()
+		except KeyboardInterrupt:
+			self.store()
+			raise
+		else:
+			if self.producer.dirty:
+				self.store()
+		if self.producer.error:
+			raise Errors.BuildError(self.producer.error)
+	def setup(self,tool,tooldir=None,funs=None):
+		if isinstance(tool,list):
+			for i in tool:self.setup(i,tooldir)
+			return
+		module=Context.load_tool(tool,tooldir)
+		if hasattr(module,"setup"):module.setup(self)
+	def get_env(self):
+		try:
+			return self.all_envs[self.variant]
+		except KeyError:
+			return self.all_envs['']
+	def set_env(self,val):
+		self.all_envs[self.variant]=val
+	env=property(get_env,set_env)
+	def add_manual_dependency(self,path,value):
+		if path is None:
+			raise ValueError('Invalid input')
+		if isinstance(path,waflib.Node.Node):
+			node=path
+		elif os.path.isabs(path):
+			node=self.root.find_resource(path)
+		else:
+			node=self.path.find_resource(path)
+		if isinstance(value,list):
+			self.deps_man[id(node)].extend(value)
+		else:
+			self.deps_man[id(node)].append(value)
+	def launch_node(self):
+		try:
+			return self.p_ln
+		except AttributeError:
+			self.p_ln=self.root.find_dir(self.launch_dir)
+			return self.p_ln
+	def hash_env_vars(self,env,vars_lst):
+		if not env.table:
+			env=env.parent
+			if not env:
+				return Utils.SIG_NIL
+		idx=str(id(env))+str(vars_lst)
+		try:
+			cache=self.cache_env
+		except AttributeError:
+			cache=self.cache_env={}
+		else:
+			try:
+				return self.cache_env[idx]
+			except KeyError:
+				pass
+		lst=[env[a]for a in vars_lst]
+		ret=Utils.h_list(lst)
+		Logs.debug('envhash: %s %r',Utils.to_hex(ret),lst)
+		cache[idx]=ret
+		return ret
+	def get_tgen_by_name(self,name):
+		cache=self.task_gen_cache_names
+		if not cache:
+			for g in self.groups:
+				for tg in g:
+					try:
+						cache[tg.name]=tg
+					except AttributeError:
+						pass
+		try:
+			return cache[name]
+		except KeyError:
+			raise Errors.WafError('Could not find a task generator for the name %r'%name)
+	def progress_line(self,state,total,col1,col2):
+		n=len(str(total))
+		Utils.rot_idx+=1
+		ind=Utils.rot_chr[Utils.rot_idx%4]
+		pc=(100.*state)/total
+		eta=str(self.timer)
+		fs="[%%%dd/%%%dd][%%s%%2d%%%%%%s][%s]["%(n,n,ind)
+		left=fs%(state,total,col1,pc,col2)
+		right='][%s%s%s]'%(col1,eta,col2)
+		cols=Logs.get_term_cols()-len(left)-len(right)+2*len(col1)+2*len(col2)
+		if cols<7:cols=7
+		ratio=((cols*state)//total)-1
+		bar=('='*ratio+'>').ljust(cols)
+		msg=Utils.indicator%(left,bar,right)
+		return msg
+	def declare_chain(self,*k,**kw):
+		return TaskGen.declare_chain(*k,**kw)
+	def pre_build(self):
+		for m in getattr(self,'pre_funs',[]):
+			m(self)
+	def post_build(self):
+		for m in getattr(self,'post_funs',[]):
+			m(self)
+	def add_pre_fun(self,meth):
+		try:
+			self.pre_funs.append(meth)
+		except AttributeError:
+			self.pre_funs=[meth]
+	def add_post_fun(self,meth):
+		try:
+			self.post_funs.append(meth)
+		except AttributeError:
+			self.post_funs=[meth]
+	def get_group(self,x):
+		if not self.groups:
+			self.add_group()
+		if x is None:
+			return self.groups[self.current_group]
+		if x in self.group_names:
+			return self.group_names[x]
+		return self.groups[x]
+	def add_to_group(self,tgen,group=None):
+		assert(isinstance(tgen,TaskGen.task_gen)or isinstance(tgen,Task.TaskBase))
+		tgen.bld=self
+		self.get_group(group).append(tgen)
+	def get_group_name(self,g):
+		if not isinstance(g,list):
+			g=self.groups[g]
+		for x in self.group_names:
+			if id(self.group_names[x])==id(g):
+				return x
+		return''
+	def get_group_idx(self,tg):
+		se=id(tg)
+		for i in range(len(self.groups)):
+			for t in self.groups[i]:
+				if id(t)==se:
+					return i
+		return None
+	def add_group(self,name=None,move=True):
+		if name and name in self.group_names:
+			Logs.error('add_group: name %s already present'%name)
+		g=[]
+		self.group_names[name]=g
+		self.groups.append(g)
+		if move:
+			self.current_group=len(self.groups)-1
+	def set_group(self,idx):
+		if isinstance(idx,str):
+			g=self.group_names[idx]
+			for i in range(len(self.groups)):
+				if id(g)==id(self.groups[i]):
+					self.current_group=i
+		else:
+			self.current_group=idx
+	def total(self):
+		total=0
+		for group in self.groups:
+			for tg in group:
+				try:
+					total+=len(tg.tasks)
+				except AttributeError:
+					total+=1
+		return total
+	def get_targets(self):
+		to_post=[]
+		min_grp=0
+		for name in self.targets.split(','):
+			tg=self.get_tgen_by_name(name)
+			if not tg:
+				raise Errors.WafError('target %r does not exist'%name)
+			m=self.get_group_idx(tg)
+			if m>min_grp:
+				min_grp=m
+				to_post=[tg]
+			elif m==min_grp:
+				to_post.append(tg)
+		return(min_grp,to_post)
+	def get_all_task_gen(self):
+		lst=[]
+		for g in self.groups:
+			lst.extend(g)
+		return lst
+	def post_group(self):
+		if self.targets=='*':
+			for tg in self.groups[self.cur]:
+				try:
+					f=tg.post
+				except AttributeError:
+					pass
+				else:
+					f()
+		elif self.targets:
+			if self.cur<self._min_grp:
+				for tg in self.groups[self.cur]:
+					try:
+						f=tg.post
+					except AttributeError:
+						pass
+					else:
+						f()
+			else:
+				for tg in self._exact_tg:
+					tg.post()
+		else:
+			ln=self.launch_node()
+			if ln.is_child_of(self.bldnode):
+				Logs.warn('Building from the build directory, forcing --targets=*')
+				ln=self.srcnode
+			elif not ln.is_child_of(self.srcnode):
+				Logs.warn('CWD %s is not under %s, forcing --targets=* (run distclean?)'%(ln.abspath(),self.srcnode.abspath()))
+				ln=self.srcnode
+			for tg in self.groups[self.cur]:
+				try:
+					f=tg.post
+				except AttributeError:
+					pass
+				else:
+					if tg.path.is_child_of(ln):
+						f()
+	def get_tasks_group(self,idx):
+		tasks=[]
+		for tg in self.groups[idx]:
+			try:
+				tasks.extend(tg.tasks)
+			except AttributeError:
+				tasks.append(tg)
+		return tasks
+	def get_build_iterator(self):
+		self.cur=0
+		if self.targets and self.targets!='*':
+			(self._min_grp,self._exact_tg)=self.get_targets()
+		global lazy_post
+		if self.post_mode!=POST_LAZY:
+			while self.cur<len(self.groups):
+				self.post_group()
+				self.cur+=1
+			self.cur=0
+		while self.cur<len(self.groups):
+			if self.post_mode!=POST_AT_ONCE:
+				self.post_group()
+			tasks=self.get_tasks_group(self.cur)
+			Task.set_file_constraints(tasks)
+			Task.set_precedence_constraints(tasks)
+			self.cur_tasks=tasks
+			self.cur+=1
+			if not tasks:
+				continue
+			yield tasks
+		while 1:
+			yield[]
+class inst(Task.Task):
+	color='CYAN'
+	def uid(self):
+		lst=[self.dest,self.path]+self.source
+		return Utils.h_list(repr(lst))
+	def post(self):
+		buf=[]
+		for x in self.source:
+			if isinstance(x,waflib.Node.Node):
+				y=x
+			else:
+				y=self.path.find_resource(x)
+				if not y:
+					if Logs.verbose:
+						Logs.warn('Could not find %s immediately (may cause broken builds)'%x)
+					idx=self.generator.bld.get_group_idx(self)
+					for tg in self.generator.bld.groups[idx]:
+						if not isinstance(tg,inst)and id(tg)!=id(self):
+							tg.post()
+						y=self.path.find_resource(x)
+						if y:
+							break
+					else:
+						raise Errors.WafError('Could not find %r in %r'%(x,self.path))
+			buf.append(y)
+		self.inputs=buf
+	def runnable_status(self):
+		ret=super(inst,self).runnable_status()
+		if ret==Task.SKIP_ME:
+			return Task.RUN_ME
+		return ret
+	def __str__(self):
+		return''
+	def run(self):
+		return self.generator.exec_task()
+	def get_install_path(self,destdir=True):
+		dest=Utils.subst_vars(self.dest,self.env)
+		dest=dest.replace('/',os.sep)
+		if destdir and Options.options.destdir:
+			dest=os.path.join(Options.options.destdir,os.path.splitdrive(dest)[1].lstrip(os.sep))
+		return dest
+	def exec_install_files(self):
+		destpath=self.get_install_path()
+		if not destpath:
+			raise Errors.WafError('unknown installation path %r'%self.generator)
+		for x,y in zip(self.source,self.inputs):
+			if self.relative_trick:
+				destfile=os.path.join(destpath,y.path_from(self.path))
+				Utils.check_dir(os.path.dirname(destfile))
+			else:
+				destfile=os.path.join(destpath,y.name)
+			self.generator.bld.do_install(y.abspath(),destfile,self.chmod)
+	def exec_install_as(self):
+		destfile=self.get_install_path()
+		self.generator.bld.do_install(self.inputs[0].abspath(),destfile,self.chmod)
+	def exec_symlink_as(self):
+		destfile=self.get_install_path()
+		src=self.link
+		if self.relative_trick:
+			src=os.path.relpath(src,os.path.dirname(destfile))
+		self.generator.bld.do_link(src,destfile)
+class InstallContext(BuildContext):
+	'''installs the targets on the system'''
+	cmd='install'
+	def __init__(self,**kw):
+		super(InstallContext,self).__init__(**kw)
+		self.uninstall=[]
+		self.is_install=INSTALL
+	def do_install(self,src,tgt,chmod=Utils.O644):
+		d,_=os.path.split(tgt)
+		if not d:
+			raise Errors.WafError('Invalid installation given %r->%r'%(src,tgt))
+		Utils.check_dir(d)
+		srclbl=src.replace(self.srcnode.abspath()+os.sep,'')
+		if not Options.options.force:
+			try:
+				st1=os.stat(tgt)
+				st2=os.stat(src)
+			except OSError:
+				pass
+			else:
+				if st1.st_mtime+2>=st2.st_mtime and st1.st_size==st2.st_size:
+					if not self.progress_bar:
+						Logs.info('- install %s (from %s)'%(tgt,srclbl))
+					return False
+		if not self.progress_bar:
+			Logs.info('+ install %s (from %s)'%(tgt,srclbl))
+		try:
+			os.remove(tgt)
+		except OSError:
+			pass
+		try:
+			shutil.copy2(src,tgt)
+			os.chmod(tgt,chmod)
+		except IOError:
+			try:
+				os.stat(src)
+			except(OSError,IOError):
+				Logs.error('File %r does not exist'%src)
+			raise Errors.WafError('Could not install the file %r'%tgt)
+	def do_link(self,src,tgt):
+		d,_=os.path.split(tgt)
+		Utils.check_dir(d)
+		link=False
+		if not os.path.islink(tgt):
+			link=True
+		elif os.readlink(tgt)!=src:
+			link=True
+		if link:
+			try:os.remove(tgt)
+			except OSError:pass
+			if not self.progress_bar:
+				Logs.info('+ symlink %s (to %s)'%(tgt,src))
+			os.symlink(src,tgt)
+		else:
+			if not self.progress_bar:
+				Logs.info('- symlink %s (to %s)'%(tgt,src))
+	def run_task_now(self,tsk,postpone):
+		tsk.post()
+		if not postpone:
+			if tsk.runnable_status()==Task.ASK_LATER:
+				raise self.WafError('cannot post the task %r'%tsk)
+			tsk.run()
+	def install_files(self,dest,files,env=None,chmod=Utils.O644,relative_trick=False,cwd=None,add=True,postpone=True):
+		tsk=inst(env=env or self.env)
+		tsk.bld=self
+		tsk.path=cwd or self.path
+		tsk.chmod=chmod
+		if isinstance(files,waflib.Node.Node):
+			tsk.source=[files]
+		else:
+			tsk.source=Utils.to_list(files)
+		tsk.dest=dest
+		tsk.exec_task=tsk.exec_install_files
+		tsk.relative_trick=relative_trick
+		if add:self.add_to_group(tsk)
+		self.run_task_now(tsk,postpone)
+		return tsk
+	def install_as(self,dest,srcfile,env=None,chmod=Utils.O644,cwd=None,add=True,postpone=True):
+		tsk=inst(env=env or self.env)
+		tsk.bld=self
+		tsk.path=cwd or self.path
+		tsk.chmod=chmod
+		tsk.source=[srcfile]
+		tsk.dest=dest
+		tsk.exec_task=tsk.exec_install_as
+		if add:self.add_to_group(tsk)
+		self.run_task_now(tsk,postpone)
+		return tsk
+	def symlink_as(self,dest,src,env=None,cwd=None,add=True,postpone=True,relative_trick=False):
+		if Utils.is_win32:
+			return
+		tsk=inst(env=env or self.env)
+		tsk.bld=self
+		tsk.dest=dest
+		tsk.path=cwd or self.path
+		tsk.source=[]
+		tsk.link=src
+		tsk.relative_trick=relative_trick
+		tsk.exec_task=tsk.exec_symlink_as
+		if add:self.add_to_group(tsk)
+		self.run_task_now(tsk,postpone)
+		return tsk
+class UninstallContext(InstallContext):
+	'''removes the targets installed'''
+	cmd='uninstall'
+	def __init__(self,**kw):
+		super(UninstallContext,self).__init__(**kw)
+		self.is_install=UNINSTALL
+	def do_install(self,src,tgt,chmod=Utils.O644):
+		if not self.progress_bar:
+			Logs.info('- remove %s'%tgt)
+		self.uninstall.append(tgt)
+		try:
+			os.remove(tgt)
+		except OSError ,e:
+			if e.errno!=errno.ENOENT:
+				if not getattr(self,'uninstall_error',None):
+					self.uninstall_error=True
+					Logs.warn('build: some files could not be uninstalled (retry with -vv to list them)')
+				if Logs.verbose>1:
+					Logs.warn('Could not remove %s (error code %r)'%(e.filename,e.errno))
+		while tgt:
+			tgt=os.path.dirname(tgt)
+			try:
+				os.rmdir(tgt)
+			except OSError:
+				break
+	def do_link(self,src,tgt):
+		try:
+			if not self.progress_bar:
+				Logs.info('- unlink %s'%tgt)
+			os.remove(tgt)
+		except OSError:
+			pass
+		while tgt:
+			tgt=os.path.dirname(tgt)
+			try:
+				os.rmdir(tgt)
+			except OSError:
+				break
+	def execute(self):
+		try:
+			def runnable_status(self):
+				return Task.SKIP_ME
+			setattr(Task.Task,'runnable_status_back',Task.Task.runnable_status)
+			setattr(Task.Task,'runnable_status',runnable_status)
+			super(UninstallContext,self).execute()
+		finally:
+			setattr(Task.Task,'runnable_status',Task.Task.runnable_status_back)
+class CleanContext(BuildContext):
+	'''cleans the project'''
+	cmd='clean'
+	def execute(self):
+		self.restore()
+		if not self.all_envs:
+			self.load_envs()
+		self.recurse([self.run_dir])
+		try:
+			self.clean()
+		finally:
+			self.store()
+	def clean(self):
+		Logs.debug('build: clean called')
+		if self.bldnode!=self.srcnode:
+			lst=[]
+			for e in self.all_envs.values():
+				lst.extend(self.root.find_or_declare(f)for f in e[CFG_FILES])
+			for n in self.bldnode.ant_glob('**/*',excl='.lock* *conf_check_*/** config.log c4che/*',quiet=True):
+				if n in lst:
+					continue
+				n.delete()
+		self.root.children={}
+		for v in'node_deps task_sigs raw_deps'.split():
+			setattr(self,v,{})
+class ListContext(BuildContext):
+	'''lists the targets to execute'''
+	cmd='list'
+	def execute(self):
+		self.restore()
+		if not self.all_envs:
+			self.load_envs()
+		self.recurse([self.run_dir])
+		self.pre_build()
+		self.timer=Utils.Timer()
+		for g in self.groups:
+			for tg in g:
+				try:
+					f=tg.post
+				except AttributeError:
+					pass
+				else:
+					f()
+		try:
+			self.get_tgen_by_name('')
+		except Exception:
+			pass
+		lst=list(self.task_gen_cache_names.keys())
+		lst.sort()
+		for k in lst:
+			Logs.pprint('GREEN',k)
+class StepContext(BuildContext):
+	'''executes tasks in a step-by-step fashion, for debugging'''
+	cmd='step'
+	def __init__(self,**kw):
+		super(StepContext,self).__init__(**kw)
+		self.files=Options.options.files
+	def compile(self):
+		if not self.files:
+			Logs.warn('Add a pattern for the debug build, for example "waf step --files=main.c,app"')
+			BuildContext.compile(self)
+			return
+		targets=None
+		if self.targets and self.targets!='*':
+			targets=self.targets.split(',')
+		for g in self.groups:
+			for tg in g:
+				if targets and tg.name not in targets:
+					continue
+				try:
+					f=tg.post
+				except AttributeError:
+					pass
+				else:
+					f()
+			for pat in self.files.split(','):
+				matcher=self.get_matcher(pat)
+				for tg in g:
+					if isinstance(tg,Task.TaskBase):
+						lst=[tg]
+					else:
+						lst=tg.tasks
+					for tsk in lst:
+						do_exec=False
+						for node in getattr(tsk,'inputs',[]):
+							if matcher(node,output=False):
+								do_exec=True
+								break
+						for node in getattr(tsk,'outputs',[]):
+							if matcher(node,output=True):
+								do_exec=True
+								break
+						if do_exec:
+							ret=tsk.run()
+							Logs.info('%s -> exit %r'%(str(tsk),ret))
+	def get_matcher(self,pat):
+		inn=True
+		out=True
+		if pat.startswith('in:'):
+			out=False
+			pat=pat.replace('in:','')
+		elif pat.startswith('out:'):
+			inn=False
+			pat=pat.replace('out:','')
+		anode=self.root.find_node(pat)
+		pattern=None
+		if not anode:
+			if not pat.startswith('^'):
+				pat='^.+?%s'%pat
+			if not pat.endswith('$'):
+				pat='%s$'%pat
+			pattern=re.compile(pat)
+		def match(node,output):
+			if output==True and not out:
+				return False
+			if output==False and not inn:
+				return False
+			if anode:
+				return anode==node
+			else:
+				return pattern.match(node.abspath())
+		return match
+BuildContext.store=Utils.nogc(BuildContext.store)
+BuildContext.restore=Utils.nogc(BuildContext.restore)
Index: waflib/ConfigSet.py
===================================================================
--- waflib/ConfigSet.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/ConfigSet.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,152 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import copy,re,os
+from waflib import Logs,Utils
+re_imp=re.compile('^(#)*?([^#=]*?)\ =\ (.*?)$',re.M)
+class ConfigSet(object):
+	__slots__=('table','parent')
+	def __init__(self,filename=None):
+		self.table={}
+		if filename:
+			self.load(filename)
+	def __contains__(self,key):
+		if key in self.table:return True
+		try:return self.parent.__contains__(key)
+		except AttributeError:return False
+	def keys(self):
+		keys=set()
+		cur=self
+		while cur:
+			keys.update(cur.table.keys())
+			cur=getattr(cur,'parent',None)
+		keys=list(keys)
+		keys.sort()
+		return keys
+	def __str__(self):
+		return"\n".join(["%r %r"%(x,self.__getitem__(x))for x in self.keys()])
+	def __getitem__(self,key):
+		try:
+			while 1:
+				x=self.table.get(key,None)
+				if not x is None:
+					return x
+				self=self.parent
+		except AttributeError:
+			return[]
+	def __setitem__(self,key,value):
+		self.table[key]=value
+	def __delitem__(self,key):
+		self[key]=[]
+	def __getattr__(self,name):
+		if name in self.__slots__:
+			return object.__getattr__(self,name)
+		else:
+			return self[name]
+	def __setattr__(self,name,value):
+		if name in self.__slots__:
+			object.__setattr__(self,name,value)
+		else:
+			self[name]=value
+	def __delattr__(self,name):
+		if name in self.__slots__:
+			object.__delattr__(self,name)
+		else:
+			del self[name]
+	def derive(self):
+		newenv=ConfigSet()
+		newenv.parent=self
+		return newenv
+	def detach(self):
+		tbl=self.get_merged_dict()
+		try:
+			delattr(self,'parent')
+		except AttributeError:
+			pass
+		else:
+			keys=tbl.keys()
+			for x in keys:
+				tbl[x]=copy.deepcopy(tbl[x])
+			self.table=tbl
+	def get_flat(self,key):
+		s=self[key]
+		if isinstance(s,str):return s
+		return' '.join(s)
+	def _get_list_value_for_modification(self,key):
+		try:
+			value=self.table[key]
+		except KeyError:
+			try:value=self.parent[key]
+			except AttributeError:value=[]
+			if isinstance(value,list):
+				value=value[:]
+			else:
+				value=[value]
+		else:
+			if not isinstance(value,list):
+				value=[value]
+		self.table[key]=value
+		return value
+	def append_value(self,var,val):
+		current_value=self._get_list_value_for_modification(var)
+		if isinstance(val,str):
+			val=[val]
+		current_value.extend(val)
+	def prepend_value(self,var,val):
+		if isinstance(val,str):
+			val=[val]
+		self.table[var]=val+self._get_list_value_for_modification(var)
+	def append_unique(self,var,val):
+		if isinstance(val,str):
+			val=[val]
+		current_value=self._get_list_value_for_modification(var)
+		for x in val:
+			if x not in current_value:
+				current_value.append(x)
+	def get_merged_dict(self):
+		table_list=[]
+		env=self
+		while 1:
+			table_list.insert(0,env.table)
+			try:env=env.parent
+			except AttributeError:break
+		merged_table={}
+		for table in table_list:
+			merged_table.update(table)
+		return merged_table
+	def store(self,filename):
+		try:
+			os.makedirs(os.path.split(filename)[0])
+		except OSError:
+			pass
+		f=None
+		try:
+			f=open(filename,'w')
+			merged_table=self.get_merged_dict()
+			keys=list(merged_table.keys())
+			keys.sort()
+			for k in keys:
+				if k!='undo_stack':
+					f.write('%s = %r\n'%(k,merged_table[k]))
+		finally:
+			if f:
+				f.close()
+	def load(self,filename):
+		tbl=self.table
+		code=Utils.readf(filename,m='rU')
+		for m in re_imp.finditer(code):
+			g=m.group
+			tbl[g(2)]=eval(g(3))
+		Logs.debug('env: %s'%str(self.table))
+	def update(self,d):
+		for k,v in d.items():
+			self[k]=v
+	def stash(self):
+		orig=self.table
+		tbl=self.table=self.table.copy()
+		for x in tbl.keys():
+			tbl[x]=copy.deepcopy(tbl[x])
+		self.undo_stack=self.undo_stack+[orig]
+	def revert(self):
+		self.table=self.undo_stack.pop(-1)
Index: waflib/Configure.py
===================================================================
--- waflib/Configure.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Configure.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,317 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import os,shlex,sys,time
+from waflib import ConfigSet,Utils,Options,Logs,Context,Build,Errors
+try:
+	from urllib import request
+except ImportError:
+	from urllib import urlopen
+else:
+	urlopen=request.urlopen
+BREAK='break'
+CONTINUE='continue'
+WAF_CONFIG_LOG='config.log'
+autoconfig=False
+conf_template='''# project %(app)s configured on %(now)s by
+# waf %(wafver)s (abi %(abi)s, python %(pyver)x on %(systype)s)
+# using %(args)s
+#'''
+def download_check(node):
+	pass
+def download_tool(tool,force=False,ctx=None):
+	for x in Utils.to_list(Context.remote_repo):
+		for sub in Utils.to_list(Context.remote_locs):
+			url='/'.join((x,sub,tool+'.py'))
+			try:
+				web=urlopen(url)
+				try:
+					if web.getcode()!=200:
+						continue
+				except AttributeError:
+					pass
+			except Exception:
+				continue
+			else:
+				tmp=ctx.root.make_node(os.sep.join((Context.waf_dir,'waflib','extras',tool+'.py')))
+				tmp.write(web.read(),'wb')
+				Logs.warn('Downloaded %s from %s'%(tool,url))
+				download_check(tmp)
+				try:
+					module=Context.load_tool(tool)
+				except Exception:
+					Logs.warn('The tool %s from %s is unusable'%(tool,url))
+					try:
+						tmp.delete()
+					except Exception:
+						pass
+					continue
+				return module
+	raise Errors.WafError('Could not load the Waf tool')
+class ConfigurationContext(Context.Context):
+	'''configures the project'''
+	cmd='configure'
+	error_handlers=[]
+	def __init__(self,**kw):
+		super(ConfigurationContext,self).__init__(**kw)
+		self.environ=dict(os.environ)
+		self.all_envs={}
+		self.top_dir=None
+		self.out_dir=None
+		self.tools=[]
+		self.hash=0
+		self.files=[]
+		self.tool_cache=[]
+		self.setenv('')
+	def setenv(self,name,env=None):
+		if name not in self.all_envs or env:
+			if not env:
+				env=ConfigSet.ConfigSet()
+				self.prepare_env(env)
+			else:
+				env=env.derive()
+			self.all_envs[name]=env
+		self.variant=name
+	def get_env(self):
+		return self.all_envs[self.variant]
+	def set_env(self,val):
+		self.all_envs[self.variant]=val
+	env=property(get_env,set_env)
+	def init_dirs(self):
+		top=self.top_dir
+		if not top:
+			top=Options.options.top
+		if not top:
+			top=getattr(Context.g_module,Context.TOP,None)
+		if not top:
+			top=self.path.abspath()
+		top=os.path.abspath(top)
+		self.srcnode=(os.path.isabs(top)and self.root or self.path).find_dir(top)
+		assert(self.srcnode)
+		out=self.out_dir
+		if not out:
+			out=Options.options.out
+		if not out:
+			out=getattr(Context.g_module,Context.OUT,None)
+		if not out:
+			out=Options.lockfile.replace('.lock-waf_%s_'%sys.platform,'').replace('.lock-waf','')
+		self.bldnode=(os.path.isabs(out)and self.root or self.path).make_node(out)
+		self.bldnode.mkdir()
+		if not os.path.isdir(self.bldnode.abspath()):
+			conf.fatal('Could not create the build directory %s'%self.bldnode.abspath())
+	def execute(self):
+		self.init_dirs()
+		self.cachedir=self.bldnode.make_node(Build.CACHE_DIR)
+		self.cachedir.mkdir()
+		path=os.path.join(self.bldnode.abspath(),WAF_CONFIG_LOG)
+		self.logger=Logs.make_logger(path,'cfg')
+		app=getattr(Context.g_module,'APPNAME','')
+		if app:
+			ver=getattr(Context.g_module,'VERSION','')
+			if ver:
+				app="%s (%s)"%(app,ver)
+		now=time.ctime()
+		pyver=sys.hexversion
+		systype=sys.platform
+		args=" ".join(sys.argv)
+		wafver=Context.WAFVERSION
+		abi=Context.ABI
+		self.to_log(conf_template%vars())
+		self.msg('Setting top to',self.srcnode.abspath())
+		self.msg('Setting out to',self.bldnode.abspath())
+		if id(self.srcnode)==id(self.bldnode):
+			Logs.warn('Setting top == out (remember to use "update_outputs")')
+		elif id(self.path)!=id(self.srcnode):
+			if self.srcnode.is_child_of(self.path):
+				Logs.warn('Are you certain that you do not want to set top="." ?')
+		super(ConfigurationContext,self).execute()
+		self.store()
+		Context.top_dir=self.srcnode.abspath()
+		Context.out_dir=self.bldnode.abspath()
+		env=ConfigSet.ConfigSet()
+		env['argv']=sys.argv
+		env['options']=Options.options.__dict__
+		env.run_dir=Context.run_dir
+		env.top_dir=Context.top_dir
+		env.out_dir=Context.out_dir
+		env['hash']=self.hash
+		env['files']=self.files
+		env['environ']=dict(self.environ)
+		if not self.env.NO_LOCK_IN_RUN:
+			env.store(Context.run_dir+os.sep+Options.lockfile)
+		if not self.env.NO_LOCK_IN_TOP:
+			env.store(Context.top_dir+os.sep+Options.lockfile)
+		if not self.env.NO_LOCK_IN_OUT:
+			env.store(Context.out_dir+os.sep+Options.lockfile)
+	def prepare_env(self,env):
+		if not env.PREFIX:
+			if Options.options.prefix or Utils.is_win32:
+				env.PREFIX=os.path.abspath(os.path.expanduser(Options.options.prefix))
+			else:
+				env.PREFIX=''
+		if not env.BINDIR:
+			env.BINDIR=Utils.subst_vars('${PREFIX}/bin',env)
+		if not env.LIBDIR:
+			env.LIBDIR=Utils.subst_vars('${PREFIX}/lib',env)
+	def store(self):
+		n=self.cachedir.make_node('build.config.py')
+		n.write('version = 0x%x\ntools = %r\n'%(Context.HEXVERSION,self.tools))
+		if not self.all_envs:
+			self.fatal('nothing to store in the configuration context!')
+		for key in self.all_envs:
+			tmpenv=self.all_envs[key]
+			tmpenv.store(os.path.join(self.cachedir.abspath(),key+Build.CACHE_SUFFIX))
+	def load(self,input,tooldir=None,funs=None,download=True):
+		tools=Utils.to_list(input)
+		if tooldir:tooldir=Utils.to_list(tooldir)
+		for tool in tools:
+			mag=(tool,id(self.env),funs)
+			if mag in self.tool_cache:
+				self.to_log('(tool %s is already loaded, skipping)'%tool)
+				continue
+			self.tool_cache.append(mag)
+			module=None
+			try:
+				module=Context.load_tool(tool,tooldir)
+			except ImportError ,e:
+				if Options.options.download:
+					module=download_tool(tool,ctx=self)
+					if not module:
+						self.fatal('Could not load the Waf tool %r or download a suitable replacement from the repository (sys.path %r)\n%s'%(tool,sys.path,e))
+				else:
+					self.fatal('Could not load the Waf tool %r from %r (try the --download option?):\n%s'%(tool,sys.path,e))
+			except Exception ,e:
+				self.to_log('imp %r (%r & %r)'%(tool,tooldir,funs))
+				self.to_log(Utils.ex_stack())
+				raise
+			if funs is not None:
+				self.eval_rules(funs)
+			else:
+				func=getattr(module,'configure',None)
+				if func:
+					if type(func)is type(Utils.readf):func(self)
+					else:self.eval_rules(func)
+			self.tools.append({'tool':tool,'tooldir':tooldir,'funs':funs})
+	def post_recurse(self,node):
+		super(ConfigurationContext,self).post_recurse(node)
+		self.hash=hash((self.hash,node.read('rb')))
+		self.files.append(node.abspath())
+	def eval_rules(self,rules):
+		self.rules=Utils.to_list(rules)
+		for x in self.rules:
+			f=getattr(self,x)
+			if not f:self.fatal("No such method '%s'."%x)
+			try:
+				f()
+			except Exception ,e:
+				ret=self.err_handler(x,e)
+				if ret==BREAK:
+					break
+				elif ret==CONTINUE:
+					continue
+				else:
+					raise
+	def err_handler(self,fun,error):
+		pass
+def conf(f):
+	def fun(*k,**kw):
+		mandatory=True
+		if'mandatory'in kw:
+			mandatory=kw['mandatory']
+			del kw['mandatory']
+		try:
+			return f(*k,**kw)
+		except Errors.ConfigurationError:
+			if mandatory:
+				raise
+	setattr(ConfigurationContext,f.__name__,fun)
+	setattr(Build.BuildContext,f.__name__,fun)
+	return f
+@conf
+def add_os_flags(self,var,dest=None):
+	try:self.env.append_value(dest or var,shlex.split(self.environ[var]))
+	except KeyError:pass
+@conf
+def cmd_to_list(self,cmd):
+	if isinstance(cmd,str)and cmd.find(' '):
+		try:
+			os.stat(cmd)
+		except OSError:
+			return shlex.split(cmd)
+		else:
+			return[cmd]
+	return cmd
+@conf
+def check_waf_version(self,mini='1.6.99',maxi='1.8.0'):
+	self.start_msg('Checking for waf version in %s-%s'%(str(mini),str(maxi)))
+	ver=Context.HEXVERSION
+	if Utils.num2ver(mini)>ver:
+		self.fatal('waf version should be at least %r (%r found)'%(Utils.num2ver(mini),ver))
+	if Utils.num2ver(maxi)<ver:
+		self.fatal('waf version should be at most %r (%r found)'%(Utils.num2ver(maxi),ver))
+	self.end_msg('ok')
+@conf
+def find_file(self,filename,path_list=[]):
+	for n in Utils.to_list(filename):
+		for d in Utils.to_list(path_list):
+			p=os.path.join(d,n)
+			if os.path.exists(p):
+				return p
+	self.fatal('Could not find %r'%filename)
+@conf
+def find_program(self,filename,**kw):
+	exts=kw.get('exts',Utils.is_win32 and'.exe,.com,.bat,.cmd'or',.sh,.pl,.py')
+	environ=kw.get('environ',os.environ)
+	ret=''
+	filename=Utils.to_list(filename)
+	var=kw.get('var','')
+	if not var:
+		var=filename[0].upper()
+	if self.env[var]:
+		ret=self.env[var]
+	elif var in environ:
+		ret=environ[var]
+	path_list=kw.get('path_list','')
+	if not ret:
+		if path_list:
+			path_list=Utils.to_list(path_list)
+		else:
+			path_list=environ.get('PATH','').split(os.pathsep)
+		if not isinstance(filename,list):
+			filename=[filename]
+		for a in exts.split(','):
+			if ret:
+				break
+			for b in filename:
+				if ret:
+					break
+				for c in path_list:
+					if ret:
+						break
+					x=os.path.expanduser(os.path.join(c,b+a))
+					if os.path.isfile(x):
+						ret=x
+	if not ret and Utils.winreg:
+		ret=Utils.get_registry_app_path(Utils.winreg.HKEY_CURRENT_USER,filename)
+	if not ret and Utils.winreg:
+		ret=Utils.get_registry_app_path(Utils.winreg.HKEY_LOCAL_MACHINE,filename)
+	self.msg('Checking for program '+','.join(filename),ret or False)
+	self.to_log('find program=%r paths=%r var=%r -> %r'%(filename,path_list,var,ret))
+	if not ret:
+		self.fatal(kw.get('errmsg','')or'Could not find the program %s'%','.join(filename))
+	if var:
+		self.env[var]=ret
+	return ret
+@conf
+def find_perl_program(self,filename,path_list=[],var=None,environ=None,exts=''):
+	try:
+		app=self.find_program(filename,path_list=path_list,var=var,environ=environ,exts=exts)
+	except Exception:
+		self.find_program('perl',var='PERL')
+		app=self.find_file(filename,os.environ['PATH'].split(os.pathsep))
+		if not app:
+			raise
+		if var:
+			self.env[var]=Utils.to_list(self.env['PERL'])+[app]
+	self.msg('Checking for %r'%filename,app)
Index: waflib/Context.py
===================================================================
--- waflib/Context.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Context.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,319 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import os,imp,sys
+from waflib import Utils,Errors,Logs
+import waflib.Node
+HEXVERSION=0x1070900
+WAFVERSION="1.7.9"
+WAFREVISION="9e92489dbc008e4abae9c147b1d63b48296797c2"
+ABI=98
+DBFILE='.wafpickle-%s-%d-%d'%(sys.platform,sys.hexversion,ABI)
+APPNAME='APPNAME'
+VERSION='VERSION'
+TOP='top'
+OUT='out'
+WSCRIPT_FILE='wscript'
+launch_dir=''
+run_dir=''
+top_dir=''
+out_dir=''
+waf_dir=''
+local_repo=''
+remote_repo='http://waf.googlecode.com/git/'
+remote_locs=['waflib/extras','waflib/Tools']
+g_module=None
+STDOUT=1
+STDERR=-1
+BOTH=0
+classes=[]
+def create_context(cmd_name,*k,**kw):
+	global classes
+	for x in classes:
+		if x.cmd==cmd_name:
+			return x(*k,**kw)
+	ctx=Context(*k,**kw)
+	ctx.fun=cmd_name
+	return ctx
+class store_context(type):
+	def __init__(cls,name,bases,dict):
+		super(store_context,cls).__init__(name,bases,dict)
+		name=cls.__name__
+		if name=='ctx'or name=='Context':
+			return
+		try:
+			cls.cmd
+		except AttributeError:
+			raise Errors.WafError('Missing command for the context class %r (cmd)'%name)
+		if not getattr(cls,'fun',None):
+			cls.fun=cls.cmd
+		global classes
+		classes.insert(0,cls)
+ctx=store_context('ctx',(object,),{})
+class Context(ctx):
+	errors=Errors
+	tools={}
+	def __init__(self,**kw):
+		try:
+			rd=kw['run_dir']
+		except KeyError:
+			global run_dir
+			rd=run_dir
+		class node_class(waflib.Node.Node):
+			pass
+		self.node_class=node_class
+		self.node_class.__module__="waflib.Node"
+		self.node_class.__name__="Nod3"
+		self.node_class.ctx=self
+		self.root=self.node_class('',None)
+		self.cur_script=None
+		self.path=self.root.find_dir(rd)
+		self.stack_path=[]
+		self.exec_dict={'ctx':self,'conf':self,'bld':self,'opt':self}
+		self.logger=None
+	def __hash__(self):
+		return id(self)
+	def load(self,tool_list,*k,**kw):
+		tools=Utils.to_list(tool_list)
+		path=Utils.to_list(kw.get('tooldir',''))
+		for t in tools:
+			module=load_tool(t,path)
+			fun=getattr(module,kw.get('name',self.fun),None)
+			if fun:
+				fun(self)
+	def execute(self):
+		global g_module
+		self.recurse([os.path.dirname(g_module.root_path)])
+	def pre_recurse(self,node):
+		self.stack_path.append(self.cur_script)
+		self.cur_script=node
+		self.path=node.parent
+	def post_recurse(self,node):
+		self.cur_script=self.stack_path.pop()
+		if self.cur_script:
+			self.path=self.cur_script.parent
+	def recurse(self,dirs,name=None,mandatory=True,once=True):
+		try:
+			cache=self.recurse_cache
+		except AttributeError:
+			cache=self.recurse_cache={}
+		for d in Utils.to_list(dirs):
+			if not os.path.isabs(d):
+				d=os.path.join(self.path.abspath(),d)
+			WSCRIPT=os.path.join(d,WSCRIPT_FILE)
+			WSCRIPT_FUN=WSCRIPT+'_'+(name or self.fun)
+			node=self.root.find_node(WSCRIPT_FUN)
+			if node and(not once or node not in cache):
+				cache[node]=True
+				self.pre_recurse(node)
+				try:
+					function_code=node.read('rU')
+					exec(compile(function_code,node.abspath(),'exec'),self.exec_dict)
+				finally:
+					self.post_recurse(node)
+			elif not node:
+				node=self.root.find_node(WSCRIPT)
+				tup=(node,name or self.fun)
+				if node and(not once or tup not in cache):
+					cache[tup]=True
+					self.pre_recurse(node)
+					try:
+						wscript_module=load_module(node.abspath())
+						user_function=getattr(wscript_module,(name or self.fun),None)
+						if not user_function:
+							if not mandatory:
+								continue
+							raise Errors.WafError('No function %s defined in %s'%(name or self.fun,node.abspath()))
+						user_function(self)
+					finally:
+						self.post_recurse(node)
+				elif not node:
+					if not mandatory:
+						continue
+					raise Errors.WafError('No wscript file in directory %s'%d)
+	def exec_command(self,cmd,**kw):
+		subprocess=Utils.subprocess
+		kw['shell']=isinstance(cmd,str)
+		Logs.debug('runner: %r'%cmd)
+		Logs.debug('runner_env: kw=%s'%kw)
+		if self.logger:
+			self.logger.info(cmd)
+		if'stdout'not in kw:
+			kw['stdout']=subprocess.PIPE
+		if'stderr'not in kw:
+			kw['stderr']=subprocess.PIPE
+		try:
+			if kw['stdout']or kw['stderr']:
+				p=subprocess.Popen(cmd,**kw)
+				(out,err)=p.communicate()
+				ret=p.returncode
+			else:
+				out,err=(None,None)
+				ret=subprocess.Popen(cmd,**kw).wait()
+		except Exception ,e:
+			raise Errors.WafError('Execution failure: %s'%str(e),ex=e)
+		if out:
+			if not isinstance(out,str):
+				out=out.decode(sys.stdout.encoding or'iso8859-1')
+			if self.logger:
+				self.logger.debug('out: %s'%out)
+			else:
+				sys.stdout.write(out)
+		if err:
+			if not isinstance(err,str):
+				err=err.decode(sys.stdout.encoding or'iso8859-1')
+			if self.logger:
+				self.logger.error('err: %s'%err)
+			else:
+				sys.stderr.write(err)
+		return ret
+	def cmd_and_log(self,cmd,**kw):
+		subprocess=Utils.subprocess
+		kw['shell']=isinstance(cmd,str)
+		Logs.debug('runner: %r'%cmd)
+		if'quiet'in kw:
+			quiet=kw['quiet']
+			del kw['quiet']
+		else:
+			quiet=None
+		if'output'in kw:
+			to_ret=kw['output']
+			del kw['output']
+		else:
+			to_ret=STDOUT
+		kw['stdout']=kw['stderr']=subprocess.PIPE
+		if quiet is None:
+			self.to_log(cmd)
+		try:
+			p=subprocess.Popen(cmd,**kw)
+			(out,err)=p.communicate()
+		except Exception ,e:
+			raise Errors.WafError('Execution failure: %s'%str(e),ex=e)
+		if not isinstance(out,str):
+			out=out.decode(sys.stdout.encoding or'iso8859-1')
+		if not isinstance(err,str):
+			err=err.decode(sys.stdout.encoding or'iso8859-1')
+		if out and quiet!=STDOUT and quiet!=BOTH:
+			self.to_log('out: %s'%out)
+		if err and quiet!=STDERR and quiet!=BOTH:
+			self.to_log('err: %s'%err)
+		if p.returncode:
+			e=Errors.WafError('Command %r returned %r'%(cmd,p.returncode))
+			e.returncode=p.returncode
+			e.stderr=err
+			e.stdout=out
+			raise e
+		if to_ret==BOTH:
+			return(out,err)
+		elif to_ret==STDERR:
+			return err
+		return out
+	def fatal(self,msg,ex=None):
+		if self.logger:
+			self.logger.info('from %s: %s'%(self.path.abspath(),msg))
+		try:
+			msg='%s\n(complete log in %s)'%(msg,self.logger.handlers[0].baseFilename)
+		except Exception:
+			pass
+		raise self.errors.ConfigurationError(msg,ex=ex)
+	def to_log(self,msg):
+		if not msg:
+			return
+		if self.logger:
+			self.logger.info(msg)
+		else:
+			sys.stderr.write(str(msg))
+			sys.stderr.flush()
+	def msg(self,msg,result,color=None):
+		self.start_msg(msg)
+		if not isinstance(color,str):
+			color=result and'GREEN'or'YELLOW'
+		self.end_msg(result,color)
+	def start_msg(self,msg):
+		try:
+			if self.in_msg:
+				self.in_msg+=1
+				return
+		except AttributeError:
+			self.in_msg=0
+		self.in_msg+=1
+		try:
+			self.line_just=max(self.line_just,len(msg))
+		except AttributeError:
+			self.line_just=max(40,len(msg))
+		for x in(self.line_just*'-',msg):
+			self.to_log(x)
+		Logs.pprint('NORMAL',"%s :"%msg.ljust(self.line_just),sep='')
+	def end_msg(self,result,color=None):
+		self.in_msg-=1
+		if self.in_msg:
+			return
+		defcolor='GREEN'
+		if result==True:
+			msg='ok'
+		elif result==False:
+			msg='not found'
+			defcolor='YELLOW'
+		else:
+			msg=str(result)
+		self.to_log(msg)
+		Logs.pprint(color or defcolor,msg)
+	def load_special_tools(self,var,ban=[]):
+		global waf_dir
+		lst=self.root.find_node(waf_dir).find_node('waflib/extras').ant_glob(var)
+		for x in lst:
+			if not x.name in ban:
+				load_tool(x.name.replace('.py',''))
+cache_modules={}
+def load_module(path):
+	try:
+		return cache_modules[path]
+	except KeyError:
+		pass
+	module=imp.new_module(WSCRIPT_FILE)
+	try:
+		code=Utils.readf(path,m='rU')
+	except(IOError,OSError):
+		raise Errors.WafError('Could not read the file %r'%path)
+	module_dir=os.path.dirname(path)
+	sys.path.insert(0,module_dir)
+	exec(compile(code,path,'exec'),module.__dict__)
+	sys.path.remove(module_dir)
+	cache_modules[path]=module
+	return module
+def load_tool(tool,tooldir=None):
+	if tool=='java':
+		tool='javaw'
+	elif tool=='compiler_cc':
+		tool='compiler_c'
+	else:
+		tool=tool.replace('++','xx')
+	if tooldir:
+		assert isinstance(tooldir,list)
+		sys.path=tooldir+sys.path
+		try:
+			__import__(tool)
+			ret=sys.modules[tool]
+			Context.tools[tool]=ret
+			return ret
+		finally:
+			for d in tooldir:
+				sys.path.remove(d)
+	else:
+		global waf_dir
+		try:
+			os.stat(os.path.join(waf_dir,'waflib','extras',tool+'.py'))
+		except OSError:
+			try:
+				os.stat(os.path.join(waf_dir,'waflib','Tools',tool+'.py'))
+			except OSError:
+				d=tool
+			else:
+				d='waflib.Tools.%s'%tool
+		else:
+			d='waflib.extras.%s'%tool
+		__import__(d)
+		ret=sys.modules[d]
+		Context.tools[tool]=ret
+		return ret
Index: waflib/Errors.py
===================================================================
--- waflib/Errors.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Errors.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,37 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import traceback,sys
+class WafError(Exception):
+	def __init__(self,msg='',ex=None):
+		self.msg=msg
+		assert not isinstance(msg,Exception)
+		self.stack=[]
+		if ex:
+			if not msg:
+				self.msg=str(ex)
+			if isinstance(ex,WafError):
+				self.stack=ex.stack
+			else:
+				self.stack=traceback.extract_tb(sys.exc_info()[2])
+		self.stack+=traceback.extract_stack()[:-1]
+		self.verbose_msg=''.join(traceback.format_list(self.stack))
+	def __str__(self):
+		return str(self.msg)
+class BuildError(WafError):
+	def __init__(self,error_tasks=[]):
+		self.tasks=error_tasks
+		WafError.__init__(self,self.format_error())
+	def format_error(self):
+		lst=['Build failed']
+		for tsk in self.tasks:
+			txt=tsk.format_error()
+			if txt:lst.append(txt)
+		return'\n'.join(lst)
+class ConfigurationError(WafError):
+	pass
+class TaskRescan(WafError):
+	pass
+class TaskNotReady(WafError):
+	pass
Index: waflib/Logs.py
===================================================================
--- waflib/Logs.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Logs.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,176 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import os,re,traceback,sys
+try:
+	import threading
+except ImportError:
+	pass
+else:
+	wlock=threading.Lock()
+	class sync_stream(object):
+		def __init__(self,stream):
+			self.stream=stream
+			self.encoding=self.stream.encoding
+		def write(self,txt):
+			try:
+				wlock.acquire()
+				self.stream.write(txt)
+				self.stream.flush()
+			finally:
+				wlock.release()
+		def fileno(self):
+			return self.stream.fileno()
+		def flush(self):
+			self.stream.flush()
+		def isatty(self):
+			return self.stream.isatty()
+	_nocolor=os.environ.get('NOCOLOR','no')not in('no','0','false')
+	try:
+		if not _nocolor:
+			import waflib.ansiterm
+	except ImportError:
+		pass
+	if not os.environ.get('NOSYNC',False):
+		if id(sys.stdout)==id(sys.__stdout__):
+			sys.stdout=sync_stream(sys.stdout)
+			sys.stderr=sync_stream(sys.stderr)
+import logging
+LOG_FORMAT="%(asctime)s %(c1)s%(zone)s%(c2)s %(message)s"
+HOUR_FORMAT="%H:%M:%S"
+zones=''
+verbose=0
+colors_lst={'USE':True,'BOLD':'\x1b[01;1m','RED':'\x1b[01;31m','GREEN':'\x1b[32m','YELLOW':'\x1b[33m','PINK':'\x1b[35m','BLUE':'\x1b[01;34m','CYAN':'\x1b[36m','NORMAL':'\x1b[0m','cursor_on':'\x1b[?25h','cursor_off':'\x1b[?25l',}
+got_tty=not os.environ.get('TERM','dumb')in['dumb','emacs']
+if got_tty:
+	try:
+		got_tty=sys.stderr.isatty()and sys.stdout.isatty()
+	except AttributeError:
+		got_tty=False
+if(not got_tty and os.environ.get('TERM','dumb')!='msys')or _nocolor:
+	colors_lst['USE']=False
+def get_term_cols():
+	return 80
+try:
+	import struct,fcntl,termios
+except ImportError:
+	pass
+else:
+	if got_tty:
+		def get_term_cols_real():
+			dummy_lines,cols=struct.unpack("HHHH",fcntl.ioctl(sys.stderr.fileno(),termios.TIOCGWINSZ,struct.pack("HHHH",0,0,0,0)))[:2]
+			return cols
+		try:
+			get_term_cols_real()
+		except Exception:
+			pass
+		else:
+			get_term_cols=get_term_cols_real
+get_term_cols.__doc__="""
+	Get the console width in characters.
+
+	:return: the number of characters per line
+	:rtype: int
+	"""
+def get_color(cl):
+	if not colors_lst['USE']:return''
+	return colors_lst.get(cl,'')
+class color_dict(object):
+	def __getattr__(self,a):
+		return get_color(a)
+	def __call__(self,a):
+		return get_color(a)
+colors=color_dict()
+re_log=re.compile(r'(\w+): (.*)',re.M)
+class log_filter(logging.Filter):
+	def __init__(self,name=None):
+		pass
+	def filter(self,rec):
+		rec.c1=colors.PINK
+		rec.c2=colors.NORMAL
+		rec.zone=rec.module
+		if rec.levelno>=logging.INFO:
+			if rec.levelno>=logging.ERROR:
+				rec.c1=colors.RED
+			elif rec.levelno>=logging.WARNING:
+				rec.c1=colors.YELLOW
+			else:
+				rec.c1=colors.GREEN
+			return True
+		m=re_log.match(rec.msg)
+		if m:
+			rec.zone=m.group(1)
+			rec.msg=m.group(2)
+		if zones:
+			return getattr(rec,'zone','')in zones or'*'in zones
+		elif not verbose>2:
+			return False
+		return True
+class formatter(logging.Formatter):
+	def __init__(self):
+		logging.Formatter.__init__(self,LOG_FORMAT,HOUR_FORMAT)
+	def format(self,rec):
+		if rec.levelno>=logging.WARNING or rec.levelno==logging.INFO:
+			try:
+				msg=rec.msg.decode('utf-8')
+			except Exception:
+				msg=rec.msg
+			return'%s%s%s'%(rec.c1,msg,rec.c2)
+		return logging.Formatter.format(self,rec)
+log=None
+def debug(*k,**kw):
+	if verbose:
+		k=list(k)
+		k[0]=k[0].replace('\n',' ')
+		global log
+		log.debug(*k,**kw)
+def error(*k,**kw):
+	global log
+	log.error(*k,**kw)
+	if verbose>2:
+		st=traceback.extract_stack()
+		if st:
+			st=st[:-1]
+			buf=[]
+			for filename,lineno,name,line in st:
+				buf.append('  File "%s", line %d, in %s'%(filename,lineno,name))
+				if line:
+					buf.append('	%s'%line.strip())
+			if buf:log.error("\n".join(buf))
+def warn(*k,**kw):
+	global log
+	log.warn(*k,**kw)
+def info(*k,**kw):
+	global log
+	log.info(*k,**kw)
+def init_log():
+	global log
+	log=logging.getLogger('waflib')
+	log.handlers=[]
+	log.filters=[]
+	hdlr=logging.StreamHandler()
+	hdlr.setFormatter(formatter())
+	log.addHandler(hdlr)
+	log.addFilter(log_filter())
+	log.setLevel(logging.DEBUG)
+def make_logger(path,name):
+	logger=logging.getLogger(name)
+	hdlr=logging.FileHandler(path,'w')
+	formatter=logging.Formatter('%(message)s')
+	hdlr.setFormatter(formatter)
+	logger.addHandler(hdlr)
+	logger.setLevel(logging.DEBUG)
+	return logger
+def make_mem_logger(name,to_log,size=10000):
+	from logging.handlers import MemoryHandler
+	logger=logging.getLogger(name)
+	hdlr=MemoryHandler(size,target=to_log)
+	formatter=logging.Formatter('%(message)s')
+	hdlr.setFormatter(formatter)
+	logger.addHandler(hdlr)
+	logger.memhandler=hdlr
+	logger.setLevel(logging.DEBUG)
+	return logger
+def pprint(col,str,label='',sep='\n'):
+	sys.stderr.write("%s%s%s %s%s"%(colors(col),str,colors.NORMAL,label,sep))
Index: waflib/Node.py
===================================================================
--- waflib/Node.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Node.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,466 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import os,re,sys,shutil
+from waflib import Utils,Errors
+exclude_regs='''
+**/*~
+**/#*#
+**/.#*
+**/%*%
+**/._*
+**/CVS
+**/CVS/**
+**/.cvsignore
+**/SCCS
+**/SCCS/**
+**/vssver.scc
+**/.svn
+**/.svn/**
+**/BitKeeper
+**/.git
+**/.git/**
+**/.gitignore
+**/.bzr
+**/.bzrignore
+**/.bzr/**
+**/.hg
+**/.hg/**
+**/_MTN
+**/_MTN/**
+**/.arch-ids
+**/{arch}
+**/_darcs
+**/_darcs/**
+**/.DS_Store'''
+def split_path(path):
+	return path.split('/')
+def split_path_cygwin(path):
+	if path.startswith('//'):
+		ret=path.split('/')[2:]
+		ret[0]='/'+ret[0]
+		return ret
+	return path.split('/')
+re_sp=re.compile('[/\\\\]')
+def split_path_win32(path):
+	if path.startswith('\\\\'):
+		ret=re.split(re_sp,path)[2:]
+		ret[0]='\\'+ret[0]
+		return ret
+	return re.split(re_sp,path)
+if sys.platform=='cygwin':
+	split_path=split_path_cygwin
+elif Utils.is_win32:
+	split_path=split_path_win32
+class Node(object):
+	__slots__=('name','sig','children','parent','cache_abspath','cache_isdir','cache_sig')
+	def __init__(self,name,parent):
+		self.name=name
+		self.parent=parent
+		if parent:
+			if name in parent.children:
+				raise Errors.WafError('node %s exists in the parent files %r already'%(name,parent))
+			parent.children[name]=self
+	def __setstate__(self,data):
+		self.name=data[0]
+		self.parent=data[1]
+		if data[2]is not None:
+			self.children=data[2]
+		if data[3]is not None:
+			self.sig=data[3]
+	def __getstate__(self):
+		return(self.name,self.parent,getattr(self,'children',None),getattr(self,'sig',None))
+	def __str__(self):
+		return self.name
+	def __repr__(self):
+		return self.abspath()
+	def __hash__(self):
+		return id(self)
+	def __eq__(self,node):
+		return id(self)==id(node)
+	def __copy__(self):
+		raise Errors.WafError('nodes are not supposed to be copied')
+	def read(self,flags='r',encoding='ISO8859-1'):
+		return Utils.readf(self.abspath(),flags,encoding)
+	def write(self,data,flags='w',encoding='ISO8859-1'):
+		Utils.writef(self.abspath(),data,flags,encoding)
+	def chmod(self,val):
+		os.chmod(self.abspath(),val)
+	def delete(self):
+		try:
+			if getattr(self,'children',None):
+				shutil.rmtree(self.abspath())
+			else:
+				os.unlink(self.abspath())
+		except OSError:
+			pass
+		self.evict()
+	def evict(self):
+		del self.parent.children[self.name]
+	def suffix(self):
+		k=max(0,self.name.rfind('.'))
+		return self.name[k:]
+	def height(self):
+		d=self
+		val=-1
+		while d:
+			d=d.parent
+			val+=1
+		return val
+	def listdir(self):
+		lst=Utils.listdir(self.abspath())
+		lst.sort()
+		return lst
+	def mkdir(self):
+		if getattr(self,'cache_isdir',None):
+			return
+		try:
+			self.parent.mkdir()
+		except OSError:
+			pass
+		if self.name:
+			try:
+				os.makedirs(self.abspath())
+			except OSError:
+				pass
+			if not os.path.isdir(self.abspath()):
+				raise Errors.WafError('Could not create the directory %s'%self.abspath())
+			try:
+				self.children
+			except AttributeError:
+				self.children={}
+		self.cache_isdir=True
+	def find_node(self,lst):
+		if isinstance(lst,str):
+			lst=[x for x in split_path(lst)if x and x!='.']
+		cur=self
+		for x in lst:
+			if x=='..':
+				cur=cur.parent or cur
+				continue
+			try:
+				ch=cur.children
+			except AttributeError:
+				cur.children={}
+			else:
+				try:
+					cur=cur.children[x]
+					continue
+				except KeyError:
+					pass
+			cur=self.__class__(x,cur)
+			try:
+				os.stat(cur.abspath())
+			except OSError:
+				cur.evict()
+				return None
+		ret=cur
+		try:
+			os.stat(ret.abspath())
+		except OSError:
+			ret.evict()
+			return None
+		try:
+			while not getattr(cur.parent,'cache_isdir',None):
+				cur=cur.parent
+				cur.cache_isdir=True
+		except AttributeError:
+			pass
+		return ret
+	def make_node(self,lst):
+		if isinstance(lst,str):
+			lst=[x for x in split_path(lst)if x and x!='.']
+		cur=self
+		for x in lst:
+			if x=='..':
+				cur=cur.parent or cur
+				continue
+			if getattr(cur,'children',{}):
+				if x in cur.children:
+					cur=cur.children[x]
+					continue
+			else:
+				cur.children={}
+			cur=self.__class__(x,cur)
+		return cur
+	def search_node(self,lst):
+		if isinstance(lst,str):
+			lst=[x for x in split_path(lst)if x and x!='.']
+		cur=self
+		for x in lst:
+			if x=='..':
+				cur=cur.parent or cur
+			else:
+				try:
+					cur=cur.children[x]
+				except(AttributeError,KeyError):
+					return None
+		return cur
+	def path_from(self,node):
+		c1=self
+		c2=node
+		c1h=c1.height()
+		c2h=c2.height()
+		lst=[]
+		up=0
+		while c1h>c2h:
+			lst.append(c1.name)
+			c1=c1.parent
+			c1h-=1
+		while c2h>c1h:
+			up+=1
+			c2=c2.parent
+			c2h-=1
+		while id(c1)!=id(c2):
+			lst.append(c1.name)
+			up+=1
+			c1=c1.parent
+			c2=c2.parent
+		for i in range(up):
+			lst.append('..')
+		lst.reverse()
+		return os.sep.join(lst)or'.'
+	def abspath(self):
+		try:
+			return self.cache_abspath
+		except AttributeError:
+			pass
+		if os.sep=='/':
+			if not self.parent:
+				val=os.sep
+			elif not self.parent.name:
+				val=os.sep+self.name
+			else:
+				val=self.parent.abspath()+os.sep+self.name
+		else:
+			if not self.parent:
+				val=''
+			elif not self.parent.name:
+				val=self.name+os.sep
+			else:
+				val=self.parent.abspath().rstrip(os.sep)+os.sep+self.name
+		self.cache_abspath=val
+		return val
+	def is_child_of(self,node):
+		p=self
+		diff=self.height()-node.height()
+		while diff>0:
+			diff-=1
+			p=p.parent
+		return id(p)==id(node)
+	def ant_iter(self,accept=None,maxdepth=25,pats=[],dir=False,src=True,remove=True):
+		dircont=self.listdir()
+		dircont.sort()
+		try:
+			lst=set(self.children.keys())
+		except AttributeError:
+			self.children={}
+		else:
+			if remove:
+				for x in lst-set(dircont):
+					self.children[x].evict()
+		for name in dircont:
+			npats=accept(name,pats)
+			if npats and npats[0]:
+				accepted=[]in npats[0]
+				node=self.make_node([name])
+				isdir=os.path.isdir(node.abspath())
+				if accepted:
+					if isdir:
+						if dir:
+							yield node
+					else:
+						if src:
+							yield node
+				if getattr(node,'cache_isdir',None)or isdir:
+					node.cache_isdir=True
+					if maxdepth:
+						for k in node.ant_iter(accept=accept,maxdepth=maxdepth-1,pats=npats,dir=dir,src=src,remove=remove):
+							yield k
+		raise StopIteration
+	def ant_glob(self,*k,**kw):
+		src=kw.get('src',True)
+		dir=kw.get('dir',False)
+		excl=kw.get('excl',exclude_regs)
+		incl=k and k[0]or kw.get('incl','**')
+		reflags=kw.get('ignorecase',0)and re.I
+		def to_pat(s):
+			lst=Utils.to_list(s)
+			ret=[]
+			for x in lst:
+				x=x.replace('\\','/').replace('//','/')
+				if x.endswith('/'):
+					x+='**'
+				lst2=x.split('/')
+				accu=[]
+				for k in lst2:
+					if k=='**':
+						accu.append(k)
+					else:
+						k=k.replace('.','[.]').replace('*','.*').replace('?','.').replace('+','\\+')
+						k='^%s$'%k
+						try:
+							accu.append(re.compile(k,flags=reflags))
+						except Exception ,e:
+							raise Errors.WafError("Invalid pattern: %s"%k,e)
+				ret.append(accu)
+			return ret
+		def filtre(name,nn):
+			ret=[]
+			for lst in nn:
+				if not lst:
+					pass
+				elif lst[0]=='**':
+					ret.append(lst)
+					if len(lst)>1:
+						if lst[1].match(name):
+							ret.append(lst[2:])
+					else:
+						ret.append([])
+				elif lst[0].match(name):
+					ret.append(lst[1:])
+			return ret
+		def accept(name,pats):
+			nacc=filtre(name,pats[0])
+			nrej=filtre(name,pats[1])
+			if[]in nrej:
+				nacc=[]
+			return[nacc,nrej]
+		ret=[x for x in self.ant_iter(accept=accept,pats=[to_pat(incl),to_pat(excl)],maxdepth=25,dir=dir,src=src,remove=kw.get('remove',True))]
+		if kw.get('flat',False):
+			return' '.join([x.path_from(self)for x in ret])
+		return ret
+	def is_src(self):
+		cur=self
+		x=id(self.ctx.srcnode)
+		y=id(self.ctx.bldnode)
+		while cur.parent:
+			if id(cur)==y:
+				return False
+			if id(cur)==x:
+				return True
+			cur=cur.parent
+		return False
+	def is_bld(self):
+		cur=self
+		y=id(self.ctx.bldnode)
+		while cur.parent:
+			if id(cur)==y:
+				return True
+			cur=cur.parent
+		return False
+	def get_src(self):
+		cur=self
+		x=id(self.ctx.srcnode)
+		y=id(self.ctx.bldnode)
+		lst=[]
+		while cur.parent:
+			if id(cur)==y:
+				lst.reverse()
+				return self.ctx.srcnode.make_node(lst)
+			if id(cur)==x:
+				return self
+			lst.append(cur.name)
+			cur=cur.parent
+		return self
+	def get_bld(self):
+		cur=self
+		x=id(self.ctx.srcnode)
+		y=id(self.ctx.bldnode)
+		lst=[]
+		while cur.parent:
+			if id(cur)==y:
+				return self
+			if id(cur)==x:
+				lst.reverse()
+				return self.ctx.bldnode.make_node(lst)
+			lst.append(cur.name)
+			cur=cur.parent
+		lst.reverse()
+		if lst and Utils.is_win32 and len(lst[0])==2 and lst[0].endswith(':'):
+			lst[0]=lst[0][0]
+		return self.ctx.bldnode.make_node(['__root__']+lst)
+	def find_resource(self,lst):
+		if isinstance(lst,str):
+			lst=[x for x in split_path(lst)if x and x!='.']
+		node=self.get_bld().search_node(lst)
+		if not node:
+			self=self.get_src()
+			node=self.find_node(lst)
+		if node:
+			if os.path.isdir(node.abspath()):
+				return None
+		return node
+	def find_or_declare(self,lst):
+		if isinstance(lst,str):
+			lst=[x for x in split_path(lst)if x and x!='.']
+		node=self.get_bld().search_node(lst)
+		if node:
+			if not os.path.isfile(node.abspath()):
+				node.sig=None
+				node.parent.mkdir()
+			return node
+		self=self.get_src()
+		node=self.find_node(lst)
+		if node:
+			if not os.path.isfile(node.abspath()):
+				node.sig=None
+				node.parent.mkdir()
+			return node
+		node=self.get_bld().make_node(lst)
+		node.parent.mkdir()
+		return node
+	def find_dir(self,lst):
+		if isinstance(lst,str):
+			lst=[x for x in split_path(lst)if x and x!='.']
+		node=self.find_node(lst)
+		try:
+			if not os.path.isdir(node.abspath()):
+				return None
+		except(OSError,AttributeError):
+			return None
+		return node
+	def change_ext(self,ext,ext_in=None):
+		name=self.name
+		if ext_in is None:
+			k=name.rfind('.')
+			if k>=0:
+				name=name[:k]+ext
+			else:
+				name=name+ext
+		else:
+			name=name[:-len(ext_in)]+ext
+		return self.parent.find_or_declare([name])
+	def nice_path(self,env=None):
+		return self.path_from(self.ctx.launch_node())
+	def bldpath(self):
+		return self.path_from(self.ctx.bldnode)
+	def srcpath(self):
+		return self.path_from(self.ctx.srcnode)
+	def relpath(self):
+		cur=self
+		x=id(self.ctx.bldnode)
+		while cur.parent:
+			if id(cur)==x:
+				return self.bldpath()
+			cur=cur.parent
+		return self.srcpath()
+	def bld_dir(self):
+		return self.parent.bldpath()
+	def bld_base(self):
+		s=os.path.splitext(self.name)[0]
+		return self.bld_dir()+os.sep+s
+	def get_bld_sig(self):
+		try:
+			return self.cache_sig
+		except AttributeError:
+			pass
+		if not self.is_bld()or self.ctx.bldnode is self.ctx.srcnode:
+			self.sig=Utils.h_file(self.abspath())
+		self.cache_sig=ret=self.sig
+		return ret
+	search=search_node
+pickle_lock=Utils.threading.Lock()
+class Nod3(Node):
+	pass
Index: waflib/Options.py
===================================================================
--- waflib/Options.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Options.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,135 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import os,tempfile,optparse,sys,re
+from waflib import Logs,Utils,Context
+cmds='distclean configure build install clean uninstall check dist distcheck'.split()
+options={}
+commands=[]
+lockfile=os.environ.get('WAFLOCK','.lock-waf_%s_build'%sys.platform)
+try:cache_global=os.path.abspath(os.environ['WAFCACHE'])
+except KeyError:cache_global=''
+platform=Utils.unversioned_sys_platform()
+class opt_parser(optparse.OptionParser):
+	def __init__(self,ctx):
+		optparse.OptionParser.__init__(self,conflict_handler="resolve",version='waf %s (%s)'%(Context.WAFVERSION,Context.WAFREVISION))
+		self.formatter.width=Logs.get_term_cols()
+		p=self.add_option
+		self.ctx=ctx
+		jobs=ctx.jobs()
+		p('-j','--jobs',dest='jobs',default=jobs,type='int',help='amount of parallel jobs (%r)'%jobs)
+		p('-k','--keep',dest='keep',default=0,action='count',help='keep running happily even if errors are found')
+		p('-v','--verbose',dest='verbose',default=0,action='count',help='verbosity level -v -vv or -vvv [default: 0]')
+		p('--nocache',dest='nocache',default=False,action='store_true',help='ignore the WAFCACHE (if set)')
+		p('--zones',dest='zones',default='',action='store',help='debugging zones (task_gen, deps, tasks, etc)')
+		gr=optparse.OptionGroup(self,'configure options')
+		self.add_option_group(gr)
+		gr.add_option('-o','--out',action='store',default='',help='build dir for the project',dest='out')
+		gr.add_option('-t','--top',action='store',default='',help='src dir for the project',dest='top')
+		default_prefix=os.environ.get('PREFIX')
+		if not default_prefix:
+			if platform=='win32':
+				d=tempfile.gettempdir()
+				default_prefix=d[0].upper()+d[1:]
+			else:
+				default_prefix='/usr/local/'
+		gr.add_option('--prefix',dest='prefix',default=default_prefix,help='installation prefix [default: %r]'%default_prefix)
+		gr.add_option('--download',dest='download',default=False,action='store_true',help='try to download the tools if missing')
+		gr=optparse.OptionGroup(self,'build and install options')
+		self.add_option_group(gr)
+		gr.add_option('-p','--progress',dest='progress_bar',default=0,action='count',help='-p: progress bar; -pp: ide output')
+		gr.add_option('--targets',dest='targets',default='',action='store',help='task generators, e.g. "target1,target2"')
+		gr=optparse.OptionGroup(self,'step options')
+		self.add_option_group(gr)
+		gr.add_option('--files',dest='files',default='',action='store',help='files to process, by regexp, e.g. "*/main.c,*/test/main.o"')
+		default_destdir=os.environ.get('DESTDIR','')
+		gr=optparse.OptionGroup(self,'install/uninstall options')
+		self.add_option_group(gr)
+		gr.add_option('--destdir',help='installation root [default: %r]'%default_destdir,default=default_destdir,dest='destdir')
+		gr.add_option('-f','--force',dest='force',default=False,action='store_true',help='force file installation')
+		gr.add_option('--distcheck-args',help='arguments to pass to distcheck',default=None,action='store')
+	def get_usage(self):
+		cmds_str={}
+		for cls in Context.classes:
+			if not cls.cmd or cls.cmd=='options':
+				continue
+			s=cls.__doc__ or''
+			cmds_str[cls.cmd]=s
+		if Context.g_module:
+			for(k,v)in Context.g_module.__dict__.items():
+				if k in['options','init','shutdown']:
+					continue
+				if type(v)is type(Context.create_context):
+					if v.__doc__ and not k.startswith('_'):
+						cmds_str[k]=v.__doc__
+		just=0
+		for k in cmds_str:
+			just=max(just,len(k))
+		lst=['  %s: %s'%(k.ljust(just),v)for(k,v)in cmds_str.items()]
+		lst.sort()
+		ret='\n'.join(lst)
+		return'''waf [commands] [options]
+
+Main commands (example: ./waf build -j4)
+%s
+'''%ret
+class OptionsContext(Context.Context):
+	cmd='options'
+	fun='options'
+	def __init__(self,**kw):
+		super(OptionsContext,self).__init__(**kw)
+		self.parser=opt_parser(self)
+		self.option_groups={}
+	def jobs(self):
+		count=int(os.environ.get('JOBS',0))
+		if count<1:
+			if'NUMBER_OF_PROCESSORS'in os.environ:
+				count=int(os.environ.get('NUMBER_OF_PROCESSORS',1))
+			else:
+				if hasattr(os,'sysconf_names'):
+					if'SC_NPROCESSORS_ONLN'in os.sysconf_names:
+						count=int(os.sysconf('SC_NPROCESSORS_ONLN'))
+					elif'SC_NPROCESSORS_CONF'in os.sysconf_names:
+						count=int(os.sysconf('SC_NPROCESSORS_CONF'))
+				if not count and os.name not in('nt','java'):
+					try:
+						tmp=self.cmd_and_log(['sysctl','-n','hw.ncpu'],quiet=0)
+					except Exception:
+						pass
+					else:
+						if re.match('^[0-9]+$',tmp):
+							count=int(tmp)
+		if count<1:
+			count=1
+		elif count>1024:
+			count=1024
+		return count
+	def add_option(self,*k,**kw):
+		return self.parser.add_option(*k,**kw)
+	def add_option_group(self,*k,**kw):
+		try:
+			gr=self.option_groups[k[0]]
+		except KeyError:
+			gr=self.parser.add_option_group(*k,**kw)
+		self.option_groups[k[0]]=gr
+		return gr
+	def get_option_group(self,opt_str):
+		try:
+			return self.option_groups[opt_str]
+		except KeyError:
+			for group in self.parser.option_groups:
+				if group.title==opt_str:
+					return group
+			return None
+	def parse_args(self,_args=None):
+		global options,commands
+		(options,leftover_args)=self.parser.parse_args(args=_args)
+		commands=leftover_args
+		if options.destdir:
+			options.destdir=os.path.abspath(os.path.expanduser(options.destdir))
+		if options.verbose>=1:
+			self.load('errcheck')
+	def execute(self):
+		super(OptionsContext,self).execute()
+		self.parse_args()
Index: waflib/Runner.py
===================================================================
--- waflib/Runner.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Runner.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,197 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import random,atexit
+try:
+	from queue import Queue
+except ImportError:
+	from Queue import Queue
+from waflib import Utils,Task,Errors,Logs
+GAP=10
+class TaskConsumer(Utils.threading.Thread):
+	def __init__(self):
+		Utils.threading.Thread.__init__(self)
+		self.ready=Queue()
+		self.setDaemon(1)
+		self.start()
+	def run(self):
+		try:
+			self.loop()
+		except Exception:
+			pass
+	def loop(self):
+		while 1:
+			tsk=self.ready.get()
+			if not isinstance(tsk,Task.TaskBase):
+				tsk(self)
+			else:
+				tsk.process()
+pool=Queue()
+def get_pool():
+	try:
+		return pool.get(False)
+	except Exception:
+		return TaskConsumer()
+def put_pool(x):
+	pool.put(x)
+def _free_resources():
+	global pool
+	lst=[]
+	while pool.qsize():
+		lst.append(pool.get())
+	for x in lst:
+		x.ready.put(None)
+	for x in lst:
+		x.join()
+	pool=None
+atexit.register(_free_resources)
+class Parallel(object):
+	def __init__(self,bld,j=2):
+		self.numjobs=j
+		self.bld=bld
+		self.outstanding=[]
+		self.frozen=[]
+		self.out=Queue(0)
+		self.count=0
+		self.processed=1
+		self.stop=False
+		self.error=[]
+		self.biter=None
+		self.dirty=False
+	def get_next_task(self):
+		if not self.outstanding:
+			return None
+		return self.outstanding.pop(0)
+	def postpone(self,tsk):
+		if random.randint(0,1):
+			self.frozen.insert(0,tsk)
+		else:
+			self.frozen.append(tsk)
+	def refill_task_list(self):
+		while self.count>self.numjobs*GAP:
+			self.get_out()
+		while not self.outstanding:
+			if self.count:
+				self.get_out()
+			elif self.frozen:
+				try:
+					cond=self.deadlock==self.processed
+				except AttributeError:
+					pass
+				else:
+					if cond:
+						msg='check the build order for the tasks'
+						for tsk in self.frozen:
+							if not tsk.run_after:
+								msg='check the methods runnable_status'
+								break
+						lst=[]
+						for tsk in self.frozen:
+							lst.append('%s\t-> %r'%(repr(tsk),[id(x)for x in tsk.run_after]))
+						raise Errors.WafError('Deadlock detected: %s%s'%(msg,''.join(lst)))
+				self.deadlock=self.processed
+			if self.frozen:
+				self.outstanding+=self.frozen
+				self.frozen=[]
+			elif not self.count:
+				self.outstanding.extend(self.biter.next())
+				self.total=self.bld.total()
+				break
+	def add_more_tasks(self,tsk):
+		if getattr(tsk,'more_tasks',None):
+			self.outstanding+=tsk.more_tasks
+			self.total+=len(tsk.more_tasks)
+	def get_out(self):
+		tsk=self.out.get()
+		if not self.stop:
+			self.add_more_tasks(tsk)
+		self.count-=1
+		self.dirty=True
+		return tsk
+	def error_handler(self,tsk):
+		if not self.bld.keep:
+			self.stop=True
+		self.error.append(tsk)
+	def add_task(self,tsk):
+		try:
+			self.pool
+		except AttributeError:
+			self.init_task_pool()
+		self.ready.put(tsk)
+	def init_task_pool(self):
+		pool=self.pool=[get_pool()for i in range(self.numjobs)]
+		self.ready=Queue(0)
+		def setq(consumer):
+			consumer.ready=self.ready
+		for x in pool:
+			x.ready.put(setq)
+		return pool
+	def free_task_pool(self):
+		def setq(consumer):
+			consumer.ready=Queue(0)
+			self.out.put(self)
+		try:
+			pool=self.pool
+		except AttributeError:
+			pass
+		else:
+			for x in pool:
+				self.ready.put(setq)
+			for x in pool:
+				self.get_out()
+			for x in pool:
+				put_pool(x)
+			self.pool=[]
+	def start(self):
+		self.total=self.bld.total()
+		while not self.stop:
+			self.refill_task_list()
+			tsk=self.get_next_task()
+			if not tsk:
+				if self.count:
+					continue
+				else:
+					break
+			if tsk.hasrun:
+				self.processed+=1
+				continue
+			if self.stop:
+				break
+			try:
+				st=tsk.runnable_status()
+			except Exception:
+				self.processed+=1
+				tsk.err_msg=Utils.ex_stack()
+				if not self.stop and self.bld.keep:
+					tsk.hasrun=Task.SKIPPED
+					if self.bld.keep==1:
+						if Logs.verbose>1 or not self.error:
+							self.error.append(tsk)
+						self.stop=True
+					else:
+						if Logs.verbose>1:
+							self.error.append(tsk)
+					continue
+				tsk.hasrun=Task.EXCEPTION
+				self.error_handler(tsk)
+				continue
+			if st==Task.ASK_LATER:
+				self.postpone(tsk)
+			elif st==Task.SKIP_ME:
+				self.processed+=1
+				tsk.hasrun=Task.SKIPPED
+				self.add_more_tasks(tsk)
+			else:
+				tsk.position=(self.processed,self.total)
+				self.count+=1
+				tsk.master=self
+				self.processed+=1
+				if self.numjobs==1:
+					tsk.process()
+				else:
+					self.add_task(tsk)
+		while self.error and self.count:
+			self.get_out()
+		assert(self.count==0 or self.stop)
+		self.free_task_pool()
Index: waflib/Scripting.py
===================================================================
--- waflib/Scripting.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Scripting.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,373 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import os,shlex,shutil,traceback,errno,sys,stat
+from waflib import Utils,Configure,Logs,Options,ConfigSet,Context,Errors,Build,Node
+build_dir_override=None
+no_climb_commands=['configure']
+default_cmd="build"
+def waf_entry_point(current_directory,version,wafdir):
+	Logs.init_log()
+	if Context.WAFVERSION!=version:
+		Logs.error('Waf script %r and library %r do not match (directory %r)'%(version,Context.WAFVERSION,wafdir))
+		sys.exit(1)
+	if'--version'in sys.argv:
+		Context.run_dir=current_directory
+		ctx=Context.create_context('options')
+		ctx.curdir=current_directory
+		ctx.parse_args()
+		sys.exit(0)
+	Context.waf_dir=wafdir
+	Context.launch_dir=current_directory
+	no_climb=os.environ.get('NOCLIMB',None)
+	if not no_climb:
+		for k in no_climb_commands:
+			if k in sys.argv:
+				no_climb=True
+				break
+	cur=current_directory
+	while cur:
+		lst=os.listdir(cur)
+		if Options.lockfile in lst:
+			env=ConfigSet.ConfigSet()
+			try:
+				env.load(os.path.join(cur,Options.lockfile))
+				ino=os.stat(cur)[stat.ST_INO]
+			except Exception:
+				pass
+			else:
+				for x in[env.run_dir,env.top_dir,env.out_dir]:
+					if Utils.is_win32:
+						if cur==x:
+							load=True
+							break
+					else:
+						try:
+							ino2=os.stat(x)[stat.ST_INO]
+						except OSError:
+							pass
+						else:
+							if ino==ino2:
+								load=True
+								break
+				else:
+					Logs.warn('invalid lock file in %s'%cur)
+					load=False
+				if load:
+					Context.run_dir=env.run_dir
+					Context.top_dir=env.top_dir
+					Context.out_dir=env.out_dir
+					break
+		if not Context.run_dir:
+			if Context.WSCRIPT_FILE in lst:
+				Context.run_dir=cur
+		next=os.path.dirname(cur)
+		if next==cur:
+			break
+		cur=next
+		if no_climb:
+			break
+	if not Context.run_dir:
+		if'-h'in sys.argv or'--help'in sys.argv:
+			Logs.warn('No wscript file found: the help message may be incomplete')
+			Context.run_dir=current_directory
+			ctx=Context.create_context('options')
+			ctx.curdir=current_directory
+			ctx.parse_args()
+			sys.exit(0)
+		Logs.error('Waf: Run from a directory containing a file named %r'%Context.WSCRIPT_FILE)
+		sys.exit(1)
+	try:
+		os.chdir(Context.run_dir)
+	except OSError:
+		Logs.error('Waf: The folder %r is unreadable'%Context.run_dir)
+		sys.exit(1)
+	try:
+		set_main_module(Context.run_dir+os.sep+Context.WSCRIPT_FILE)
+	except Errors.WafError ,e:
+		Logs.pprint('RED',e.verbose_msg)
+		Logs.error(str(e))
+		sys.exit(1)
+	except Exception ,e:
+		Logs.error('Waf: The wscript in %r is unreadable'%Context.run_dir,e)
+		traceback.print_exc(file=sys.stdout)
+		sys.exit(2)
+	try:
+		run_commands()
+	except Errors.WafError ,e:
+		if Logs.verbose>1:
+			Logs.pprint('RED',e.verbose_msg)
+		Logs.error(e.msg)
+		sys.exit(1)
+	except SystemExit:
+		raise
+	except Exception ,e:
+		traceback.print_exc(file=sys.stdout)
+		sys.exit(2)
+	except KeyboardInterrupt:
+		Logs.pprint('RED','Interrupted')
+		sys.exit(68)
+def set_main_module(file_path):
+	Context.g_module=Context.load_module(file_path)
+	Context.g_module.root_path=file_path
+	def set_def(obj):
+		name=obj.__name__
+		if not name in Context.g_module.__dict__:
+			setattr(Context.g_module,name,obj)
+	for k in[update,dist,distclean,distcheck,update]:
+		set_def(k)
+	if not'init'in Context.g_module.__dict__:
+		Context.g_module.init=Utils.nada
+	if not'shutdown'in Context.g_module.__dict__:
+		Context.g_module.shutdown=Utils.nada
+	if not'options'in Context.g_module.__dict__:
+		Context.g_module.options=Utils.nada
+def parse_options():
+	Context.create_context('options').execute()
+	if not Options.commands:
+		Options.commands=[default_cmd]
+	Options.commands=[x for x in Options.commands if x!='options']
+	Logs.verbose=Options.options.verbose
+	Logs.init_log()
+	if Options.options.zones:
+		Logs.zones=Options.options.zones.split(',')
+		if not Logs.verbose:
+			Logs.verbose=1
+	elif Logs.verbose>0:
+		Logs.zones=['runner']
+	if Logs.verbose>2:
+		Logs.zones=['*']
+def run_command(cmd_name):
+	ctx=Context.create_context(cmd_name)
+	ctx.log_timer=Utils.Timer()
+	ctx.options=Options.options
+	ctx.cmd=cmd_name
+	ctx.execute()
+	return ctx
+def run_commands():
+	parse_options()
+	run_command('init')
+	while Options.commands:
+		cmd_name=Options.commands.pop(0)
+		ctx=run_command(cmd_name)
+		Logs.info('%r finished successfully (%s)'%(cmd_name,str(ctx.log_timer)))
+	run_command('shutdown')
+def _can_distclean(name):
+	for k in'.o .moc .exe'.split():
+		if name.endswith(k):
+			return True
+	return False
+def distclean_dir(dirname):
+	for(root,dirs,files)in os.walk(dirname):
+		for f in files:
+			if _can_distclean(f):
+				fname=root+os.sep+f
+				try:
+					os.unlink(fname)
+				except OSError:
+					Logs.warn('Could not remove %r'%fname)
+	for x in[Context.DBFILE,'config.log']:
+		try:
+			os.unlink(x)
+		except OSError:
+			pass
+	try:
+		shutil.rmtree('c4che')
+	except OSError:
+		pass
+def distclean(ctx):
+	'''removes the build directory'''
+	lst=os.listdir('.')
+	for f in lst:
+		if f==Options.lockfile:
+			try:
+				proj=ConfigSet.ConfigSet(f)
+			except IOError:
+				Logs.warn('Could not read %r'%f)
+				continue
+			if proj['out_dir']!=proj['top_dir']:
+				try:
+					shutil.rmtree(proj['out_dir'])
+				except IOError:
+					pass
+				except OSError ,e:
+					if e.errno!=errno.ENOENT:
+						Logs.warn('project %r cannot be removed'%proj[Context.OUT])
+			else:
+				distclean_dir(proj['out_dir'])
+			for k in(proj['out_dir'],proj['top_dir'],proj['run_dir']):
+				try:
+					os.remove(os.path.join(k,Options.lockfile))
+				except OSError ,e:
+					if e.errno!=errno.ENOENT:
+						Logs.warn('file %r cannot be removed'%f)
+		if f.startswith('.waf')and not Options.commands:
+			shutil.rmtree(f,ignore_errors=True)
+class Dist(Context.Context):
+	'''creates an archive containing the project source code'''
+	cmd='dist'
+	fun='dist'
+	algo='tar.bz2'
+	ext_algo={}
+	def execute(self):
+		self.recurse([os.path.dirname(Context.g_module.root_path)])
+		self.archive()
+	def archive(self):
+		import tarfile
+		arch_name=self.get_arch_name()
+		try:
+			self.base_path
+		except AttributeError:
+			self.base_path=self.path
+		node=self.base_path.make_node(arch_name)
+		try:
+			node.delete()
+		except Exception:
+			pass
+		files=self.get_files()
+		if self.algo.startswith('tar.'):
+			tar=tarfile.open(arch_name,'w:'+self.algo.replace('tar.',''))
+			for x in files:
+				self.add_tar_file(x,tar)
+			tar.close()
+		elif self.algo=='zip':
+			import zipfile
+			zip=zipfile.ZipFile(arch_name,'w',compression=zipfile.ZIP_DEFLATED)
+			for x in files:
+				archive_name=self.get_base_name()+'/'+x.path_from(self.base_path)
+				zip.write(x.abspath(),archive_name,zipfile.ZIP_DEFLATED)
+			zip.close()
+		else:
+			self.fatal('Valid algo types are tar.bz2, tar.gz or zip')
+		try:
+			from hashlib import sha1 as sha
+		except ImportError:
+			from sha import sha
+		try:
+			digest=" (sha=%r)"%sha(node.read()).hexdigest()
+		except Exception:
+			digest=''
+		Logs.info('New archive created: %s%s'%(self.arch_name,digest))
+	def get_tar_path(self,node):
+		return node.abspath()
+	def add_tar_file(self,x,tar):
+		p=self.get_tar_path(x)
+		tinfo=tar.gettarinfo(name=p,arcname=self.get_tar_prefix()+'/'+x.path_from(self.base_path))
+		tinfo.uid=0
+		tinfo.gid=0
+		tinfo.uname='root'
+		tinfo.gname='root'
+		fu=None
+		try:
+			fu=open(p,'rb')
+			tar.addfile(tinfo,fileobj=fu)
+		finally:
+			if fu:
+				fu.close()
+	def get_tar_prefix(self):
+		try:
+			return self.tar_prefix
+		except AttributeError:
+			return self.get_base_name()
+	def get_arch_name(self):
+		try:
+			self.arch_name
+		except AttributeError:
+			self.arch_name=self.get_base_name()+'.'+self.ext_algo.get(self.algo,self.algo)
+		return self.arch_name
+	def get_base_name(self):
+		try:
+			self.base_name
+		except AttributeError:
+			appname=getattr(Context.g_module,Context.APPNAME,'noname')
+			version=getattr(Context.g_module,Context.VERSION,'1.0')
+			self.base_name=appname+'-'+version
+		return self.base_name
+	def get_excl(self):
+		try:
+			return self.excl
+		except AttributeError:
+			self.excl=Node.exclude_regs+' **/waf-1.7.* **/.waf-1.7* **/waf3-1.7.* **/.waf3-1.7* **/*~ **/*.rej **/*.orig **/*.pyc **/*.pyo **/*.bak **/*.swp **/.lock-w*'
+			nd=self.root.find_node(Context.out_dir)
+			if nd:
+				self.excl+=' '+nd.path_from(self.base_path)
+			return self.excl
+	def get_files(self):
+		try:
+			files=self.files
+		except AttributeError:
+			files=self.base_path.ant_glob('**/*',excl=self.get_excl())
+		return files
+def dist(ctx):
+	'''makes a tarball for redistributing the sources'''
+	pass
+class DistCheck(Dist):
+	fun='distcheck'
+	cmd='distcheck'
+	def execute(self):
+		self.recurse([os.path.dirname(Context.g_module.root_path)])
+		self.archive()
+		self.check()
+	def check(self):
+		import tempfile,tarfile
+		t=None
+		try:
+			t=tarfile.open(self.get_arch_name())
+			for x in t:
+				t.extract(x)
+		finally:
+			if t:
+				t.close()
+		cfg=[]
+		if Options.options.distcheck_args:
+			cfg=shlex.split(Options.options.distcheck_args)
+		else:
+			cfg=[x for x in sys.argv if x.startswith('-')]
+		instdir=tempfile.mkdtemp('.inst',self.get_base_name())
+		ret=Utils.subprocess.Popen([sys.argv[0],'configure','install','uninstall','--destdir='+instdir]+cfg,cwd=self.get_base_name()).wait()
+		if ret:
+			raise Errors.WafError('distcheck failed with code %i'%ret)
+		if os.path.exists(instdir):
+			raise Errors.WafError('distcheck succeeded, but files were left in %s'%instdir)
+		shutil.rmtree(self.get_base_name())
+def distcheck(ctx):
+	'''checks if the project compiles (tarball from 'dist')'''
+	pass
+def update(ctx):
+	'''updates the plugins from the *waflib/extras* directory'''
+	lst=Options.options.files.split(',')
+	if not lst:
+		lst=[x for x in Utils.listdir(Context.waf_dir+'/waflib/extras')if x.endswith('.py')]
+	for x in lst:
+		tool=x.replace('.py','')
+		try:
+			Configure.download_tool(tool,force=True,ctx=ctx)
+		except Errors.WafError:
+			Logs.error('Could not find the tool %s in the remote repository'%x)
+def autoconfigure(execute_method):
+	def execute(self):
+		if not Configure.autoconfig:
+			return execute_method(self)
+		env=ConfigSet.ConfigSet()
+		do_config=False
+		try:
+			env.load(os.path.join(Context.top_dir,Options.lockfile))
+		except Exception:
+			Logs.warn('Configuring the project')
+			do_config=True
+		else:
+			if env.run_dir!=Context.run_dir:
+				do_config=True
+			else:
+				h=0
+				for f in env['files']:
+					h=hash((h,Utils.readf(f,'rb')))
+				do_config=h!=env.hash
+		if do_config:
+			Options.commands.insert(0,self.cmd)
+			Options.commands.insert(0,'configure')
+			return
+		return execute_method(self)
+	return execute
+Build.BuildContext.execute=autoconfigure(Build.BuildContext.execute)
Index: waflib/Task.py
===================================================================
--- waflib/Task.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Task.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,677 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import os,shutil,re,tempfile
+from waflib import Utils,Logs,Errors
+NOT_RUN=0
+MISSING=1
+CRASHED=2
+EXCEPTION=3
+SKIPPED=8
+SUCCESS=9
+ASK_LATER=-1
+SKIP_ME=-2
+RUN_ME=-3
+COMPILE_TEMPLATE_SHELL='''
+def f(tsk):
+	env = tsk.env
+	gen = tsk.generator
+	bld = gen.bld
+	wd = getattr(tsk, 'cwd', None)
+	p = env.get_flat
+	tsk.last_cmd = cmd = \'\'\' %s \'\'\' % s
+	return tsk.exec_command(cmd, cwd=wd, env=env.env or None)
+'''
+COMPILE_TEMPLATE_NOSHELL='''
+def f(tsk):
+	env = tsk.env
+	gen = tsk.generator
+	bld = gen.bld
+	wd = getattr(tsk, 'cwd', None)
+	def to_list(xx):
+		if isinstance(xx, str): return [xx]
+		return xx
+	tsk.last_cmd = lst = []
+	%s
+	lst = [x for x in lst if x]
+	return tsk.exec_command(lst, cwd=wd, env=env.env or None)
+'''
+def cache_outputs(cls):
+	m1=cls.run
+	def run(self):
+		bld=self.generator.bld
+		if bld.cache_global and not bld.nocache:
+			if self.can_retrieve_cache():
+				return 0
+		return m1(self)
+	cls.run=run
+	m2=cls.post_run
+	def post_run(self):
+		bld=self.generator.bld
+		ret=m2(self)
+		if bld.cache_global and not bld.nocache:
+			self.put_files_cache()
+		return ret
+	cls.post_run=post_run
+	return cls
+classes={}
+class store_task_type(type):
+	def __init__(cls,name,bases,dict):
+		super(store_task_type,cls).__init__(name,bases,dict)
+		name=cls.__name__
+		if name.endswith('_task'):
+			name=name.replace('_task','')
+		if name!='evil'and name!='TaskBase':
+			global classes
+			if getattr(cls,'run_str',None):
+				(f,dvars)=compile_fun(cls.run_str,cls.shell)
+				cls.hcode=cls.run_str
+				cls.run_str=None
+				cls.run=f
+				cls.vars=list(set(cls.vars+dvars))
+				cls.vars.sort()
+			elif getattr(cls,'run',None)and not'hcode'in cls.__dict__:
+				cls.hcode=Utils.h_fun(cls.run)
+			if not getattr(cls,'nocache',None):
+				cls=cache_outputs(cls)
+			getattr(cls,'register',classes)[name]=cls
+evil=store_task_type('evil',(object,),{})
+class TaskBase(evil):
+	color='GREEN'
+	ext_in=[]
+	ext_out=[]
+	before=[]
+	after=[]
+	hcode=''
+	def __init__(self,*k,**kw):
+		self.hasrun=NOT_RUN
+		try:
+			self.generator=kw['generator']
+		except KeyError:
+			self.generator=self
+	def __repr__(self):
+		return'\n\t{task %r: %s %s}'%(self.__class__.__name__,id(self),str(getattr(self,'fun','')))
+	def __str__(self):
+		if hasattr(self,'fun'):
+			return'executing: %s\n'%self.fun.__name__
+		return self.__class__.__name__+'\n'
+	def __hash__(self):
+		return id(self)
+	def exec_command(self,cmd,**kw):
+		bld=self.generator.bld
+		try:
+			if not kw.get('cwd',None):
+				kw['cwd']=bld.cwd
+		except AttributeError:
+			bld.cwd=kw['cwd']=bld.variant_dir
+		return bld.exec_command(cmd,**kw)
+	def runnable_status(self):
+		return RUN_ME
+	def process(self):
+		m=self.master
+		if m.stop:
+			m.out.put(self)
+			return
+		try:
+			del self.generator.bld.task_sigs[self.uid()]
+		except KeyError:
+			pass
+		try:
+			self.generator.bld.returned_tasks.append(self)
+			self.log_display(self.generator.bld)
+			ret=self.run()
+		except Exception:
+			self.err_msg=Utils.ex_stack()
+			self.hasrun=EXCEPTION
+			m.error_handler(self)
+			m.out.put(self)
+			return
+		if ret:
+			self.err_code=ret
+			self.hasrun=CRASHED
+		else:
+			try:
+				self.post_run()
+			except Errors.WafError:
+				pass
+			except Exception:
+				self.err_msg=Utils.ex_stack()
+				self.hasrun=EXCEPTION
+			else:
+				self.hasrun=SUCCESS
+		if self.hasrun!=SUCCESS:
+			m.error_handler(self)
+		m.out.put(self)
+	def run(self):
+		if hasattr(self,'fun'):
+			return self.fun(self)
+		return 0
+	def post_run(self):
+		pass
+	def log_display(self,bld):
+		bld.to_log(self.display())
+	def display(self):
+		col1=Logs.colors(self.color)
+		col2=Logs.colors.NORMAL
+		master=self.master
+		def cur():
+			tmp=-1
+			if hasattr(master,'ready'):
+				tmp-=master.ready.qsize()
+			return master.processed+tmp
+		if self.generator.bld.progress_bar==1:
+			return self.generator.bld.progress_line(cur(),master.total,col1,col2)
+		if self.generator.bld.progress_bar==2:
+			ela=str(self.generator.bld.timer)
+			try:
+				ins=','.join([n.name for n in self.inputs])
+			except AttributeError:
+				ins=''
+			try:
+				outs=','.join([n.name for n in self.outputs])
+			except AttributeError:
+				outs=''
+			return'|Total %s|Current %s|Inputs %s|Outputs %s|Time %s|\n'%(master.total,cur(),ins,outs,ela)
+		s=str(self)
+		if not s:
+			return None
+		total=master.total
+		n=len(str(total))
+		fs='[%%%dd/%%%dd] %%s%%s%%s'%(n,n)
+		return fs%(cur(),total,col1,s,col2)
+	def attr(self,att,default=None):
+		ret=getattr(self,att,self)
+		if ret is self:return getattr(self.__class__,att,default)
+		return ret
+	def hash_constraints(self):
+		cls=self.__class__
+		tup=(str(cls.before),str(cls.after),str(cls.ext_in),str(cls.ext_out),cls.__name__,cls.hcode)
+		h=hash(tup)
+		return h
+	def format_error(self):
+		msg=getattr(self,'last_cmd','')
+		name=getattr(self.generator,'name','')
+		if getattr(self,"err_msg",None):
+			return self.err_msg
+		elif not self.hasrun:
+			return'task in %r was not executed for some reason: %r'%(name,self)
+		elif self.hasrun==CRASHED:
+			try:
+				return' -> task in %r failed (exit status %r): %r\n%r'%(name,self.err_code,self,msg)
+			except AttributeError:
+				return' -> task in %r failed: %r\n%r'%(name,self,msg)
+		elif self.hasrun==MISSING:
+			return' -> missing files in %r: %r\n%r'%(name,self,msg)
+		else:
+			return'invalid status for task in %r: %r'%(name,self.hasrun)
+	def colon(self,var1,var2):
+		tmp=self.env[var1]
+		if isinstance(var2,str):
+			it=self.env[var2]
+		else:
+			it=var2
+		if isinstance(tmp,str):
+			return[tmp%x for x in it]
+		else:
+			if Logs.verbose and not tmp and it:
+				Logs.warn('Missing env variable %r for task %r (generator %r)'%(var1,self,self.generator))
+			lst=[]
+			for y in it:
+				lst.extend(tmp)
+				lst.append(y)
+			return lst
+class Task(TaskBase):
+	vars=[]
+	shell=False
+	def __init__(self,*k,**kw):
+		TaskBase.__init__(self,*k,**kw)
+		self.env=kw['env']
+		self.inputs=[]
+		self.outputs=[]
+		self.dep_nodes=[]
+		self.run_after=set([])
+	def __str__(self):
+		env=self.env
+		src_str=' '.join([a.nice_path()for a in self.inputs])
+		tgt_str=' '.join([a.nice_path()for a in self.outputs])
+		if self.outputs:sep=' -> '
+		else:sep=''
+		return'%s: %s%s%s\n'%(self.__class__.__name__.replace('_task',''),src_str,sep,tgt_str)
+	def __repr__(self):
+		try:
+			ins=",".join([x.name for x in self.inputs])
+			outs=",".join([x.name for x in self.outputs])
+		except AttributeError:
+			ins=",".join([str(x)for x in self.inputs])
+			outs=",".join([str(x)for x in self.outputs])
+		return"".join(['\n\t{task %r: '%id(self),self.__class__.__name__," ",ins," -> ",outs,'}'])
+	def uid(self):
+		try:
+			return self.uid_
+		except AttributeError:
+			m=Utils.md5()
+			up=m.update
+			up(self.__class__.__name__)
+			for x in self.inputs+self.outputs:
+				up(x.abspath())
+			self.uid_=m.digest()
+			return self.uid_
+	def set_inputs(self,inp):
+		if isinstance(inp,list):self.inputs+=inp
+		else:self.inputs.append(inp)
+	def set_outputs(self,out):
+		if isinstance(out,list):self.outputs+=out
+		else:self.outputs.append(out)
+	def set_run_after(self,task):
+		assert isinstance(task,TaskBase)
+		self.run_after.add(task)
+	def signature(self):
+		try:return self.cache_sig
+		except AttributeError:pass
+		self.m=Utils.md5()
+		self.m.update(self.hcode)
+		self.sig_explicit_deps()
+		self.sig_vars()
+		if self.scan:
+			try:
+				self.sig_implicit_deps()
+			except Errors.TaskRescan:
+				return self.signature()
+		ret=self.cache_sig=self.m.digest()
+		return ret
+	def runnable_status(self):
+		for t in self.run_after:
+			if not t.hasrun:
+				return ASK_LATER
+		bld=self.generator.bld
+		try:
+			new_sig=self.signature()
+		except Errors.TaskNotReady:
+			return ASK_LATER
+		key=self.uid()
+		try:
+			prev_sig=bld.task_sigs[key]
+		except KeyError:
+			Logs.debug("task: task %r must run as it was never run before or the task code changed"%self)
+			return RUN_ME
+		for node in self.outputs:
+			try:
+				if node.sig!=new_sig:
+					return RUN_ME
+			except AttributeError:
+				Logs.debug("task: task %r must run as the output nodes do not exist"%self)
+				return RUN_ME
+		if new_sig!=prev_sig:
+			return RUN_ME
+		return SKIP_ME
+	def post_run(self):
+		bld=self.generator.bld
+		sig=self.signature()
+		for node in self.outputs:
+			try:
+				os.stat(node.abspath())
+			except OSError:
+				self.hasrun=MISSING
+				self.err_msg='-> missing file: %r'%node.abspath()
+				raise Errors.WafError(self.err_msg)
+			node.sig=sig
+		bld.task_sigs[self.uid()]=self.cache_sig
+	def sig_explicit_deps(self):
+		bld=self.generator.bld
+		upd=self.m.update
+		for x in self.inputs+self.dep_nodes:
+			try:
+				upd(x.get_bld_sig())
+			except(AttributeError,TypeError):
+				raise Errors.WafError('Missing node signature for %r (required by %r)'%(x,self))
+		if bld.deps_man:
+			additional_deps=bld.deps_man
+			for x in self.inputs+self.outputs:
+				try:
+					d=additional_deps[id(x)]
+				except KeyError:
+					continue
+				for v in d:
+					if isinstance(v,bld.root.__class__):
+						try:
+							v=v.get_bld_sig()
+						except AttributeError:
+							raise Errors.WafError('Missing node signature for %r (required by %r)'%(v,self))
+					elif hasattr(v,'__call__'):
+						v=v()
+					upd(v)
+		return self.m.digest()
+	def sig_vars(self):
+		bld=self.generator.bld
+		env=self.env
+		upd=self.m.update
+		act_sig=bld.hash_env_vars(env,self.__class__.vars)
+		upd(act_sig)
+		dep_vars=getattr(self,'dep_vars',None)
+		if dep_vars:
+			upd(bld.hash_env_vars(env,dep_vars))
+		return self.m.digest()
+	scan=None
+	def sig_implicit_deps(self):
+		bld=self.generator.bld
+		key=self.uid()
+		prev=bld.task_sigs.get((key,'imp'),[])
+		if prev:
+			try:
+				if prev==self.compute_sig_implicit_deps():
+					return prev
+			except Exception:
+				for x in bld.node_deps.get(self.uid(),[]):
+					if x.is_child_of(bld.srcnode):
+						try:
+							os.stat(x.abspath())
+						except OSError:
+							try:
+								del x.parent.children[x.name]
+							except KeyError:
+								pass
+			del bld.task_sigs[(key,'imp')]
+			raise Errors.TaskRescan('rescan')
+		(nodes,names)=self.scan()
+		if Logs.verbose:
+			Logs.debug('deps: scanner for %s returned %s %s'%(str(self),str(nodes),str(names)))
+		bld.node_deps[key]=nodes
+		bld.raw_deps[key]=names
+		self.are_implicit_nodes_ready()
+		try:
+			bld.task_sigs[(key,'imp')]=sig=self.compute_sig_implicit_deps()
+		except Exception:
+			if Logs.verbose:
+				for k in bld.node_deps.get(self.uid(),[]):
+					try:
+						k.get_bld_sig()
+					except Exception:
+						Logs.warn('Missing signature for node %r (may cause rebuilds)'%k)
+		else:
+			return sig
+	def compute_sig_implicit_deps(self):
+		upd=self.m.update
+		bld=self.generator.bld
+		self.are_implicit_nodes_ready()
+		for k in bld.node_deps.get(self.uid(),[]):
+			upd(k.get_bld_sig())
+		return self.m.digest()
+	def are_implicit_nodes_ready(self):
+		bld=self.generator.bld
+		try:
+			cache=bld.dct_implicit_nodes
+		except AttributeError:
+			bld.dct_implicit_nodes=cache={}
+		try:
+			dct=cache[bld.cur]
+		except KeyError:
+			dct=cache[bld.cur]={}
+			for tsk in bld.cur_tasks:
+				for x in tsk.outputs:
+					dct[x]=tsk
+		modified=False
+		for x in bld.node_deps.get(self.uid(),[]):
+			if x in dct:
+				self.run_after.add(dct[x])
+				modified=True
+		if modified:
+			for tsk in self.run_after:
+				if not tsk.hasrun:
+					raise Errors.TaskNotReady('not ready')
+	def can_retrieve_cache(self):
+		if not getattr(self,'outputs',None):
+			return None
+		sig=self.signature()
+		ssig=Utils.to_hex(self.uid())+Utils.to_hex(sig)
+		dname=os.path.join(self.generator.bld.cache_global,ssig)
+		try:
+			t1=os.stat(dname).st_mtime
+		except OSError:
+			return None
+		for node in self.outputs:
+			orig=os.path.join(dname,node.name)
+			try:
+				shutil.copy2(orig,node.abspath())
+				os.utime(orig,None)
+			except(OSError,IOError):
+				Logs.debug('task: failed retrieving file')
+				return None
+		try:
+			t2=os.stat(dname).st_mtime
+		except OSError:
+			return None
+		if t1!=t2:
+			return None
+		for node in self.outputs:
+			node.sig=sig
+			if self.generator.bld.progress_bar<1:
+				self.generator.bld.to_log('restoring from cache %r\n'%node.abspath())
+		self.cached=True
+		return True
+	def put_files_cache(self):
+		if getattr(self,'cached',None):
+			return None
+		if not getattr(self,'outputs',None):
+			return None
+		sig=self.signature()
+		ssig=Utils.to_hex(self.uid())+Utils.to_hex(sig)
+		dname=os.path.join(self.generator.bld.cache_global,ssig)
+		tmpdir=tempfile.mkdtemp(prefix=self.generator.bld.cache_global+os.sep+'waf')
+		try:
+			shutil.rmtree(dname)
+		except Exception:
+			pass
+		try:
+			for node in self.outputs:
+				dest=os.path.join(tmpdir,node.name)
+				shutil.copy2(node.abspath(),dest)
+		except(OSError,IOError):
+			try:
+				shutil.rmtree(tmpdir)
+			except Exception:
+				pass
+		else:
+			try:
+				os.rename(tmpdir,dname)
+			except OSError:
+				try:
+					shutil.rmtree(tmpdir)
+				except Exception:
+					pass
+			else:
+				try:
+					os.chmod(dname,Utils.O755)
+				except Exception:
+					pass
+def is_before(t1,t2):
+	to_list=Utils.to_list
+	for k in to_list(t2.ext_in):
+		if k in to_list(t1.ext_out):
+			return 1
+	if t1.__class__.__name__ in to_list(t2.after):
+		return 1
+	if t2.__class__.__name__ in to_list(t1.before):
+		return 1
+	return 0
+def set_file_constraints(tasks):
+	ins=Utils.defaultdict(set)
+	outs=Utils.defaultdict(set)
+	for x in tasks:
+		for a in getattr(x,'inputs',[])+getattr(x,'dep_nodes',[]):
+			ins[id(a)].add(x)
+		for a in getattr(x,'outputs',[]):
+			outs[id(a)].add(x)
+	links=set(ins.keys()).intersection(outs.keys())
+	for k in links:
+		for a in ins[k]:
+			a.run_after.update(outs[k])
+def set_precedence_constraints(tasks):
+	cstr_groups=Utils.defaultdict(list)
+	for x in tasks:
+		h=x.hash_constraints()
+		cstr_groups[h].append(x)
+	keys=list(cstr_groups.keys())
+	maxi=len(keys)
+	for i in range(maxi):
+		t1=cstr_groups[keys[i]][0]
+		for j in range(i+1,maxi):
+			t2=cstr_groups[keys[j]][0]
+			if is_before(t1,t2):
+				a=i
+				b=j
+			elif is_before(t2,t1):
+				a=j
+				b=i
+			else:
+				continue
+			aval=set(cstr_groups[keys[a]])
+			for x in cstr_groups[keys[b]]:
+				x.run_after.update(aval)
+def funex(c):
+	dc={}
+	exec(c,dc)
+	return dc['f']
+reg_act=re.compile(r"(?P<backslash>\\)|(?P<dollar>\$\$)|(?P<subst>\$\{(?P<var>\w+)(?P<code>.*?)\})",re.M)
+def compile_fun_shell(line):
+	extr=[]
+	def repl(match):
+		g=match.group
+		if g('dollar'):return"$"
+		elif g('backslash'):return'\\\\'
+		elif g('subst'):extr.append((g('var'),g('code')));return"%s"
+		return None
+	line=reg_act.sub(repl,line)or line
+	parm=[]
+	dvars=[]
+	app=parm.append
+	for(var,meth)in extr:
+		if var=='SRC':
+			if meth:app('tsk.inputs%s'%meth)
+			else:app('" ".join([a.path_from(bld.bldnode) for a in tsk.inputs])')
+		elif var=='TGT':
+			if meth:app('tsk.outputs%s'%meth)
+			else:app('" ".join([a.path_from(bld.bldnode) for a in tsk.outputs])')
+		elif meth:
+			if meth.startswith(':'):
+				m=meth[1:]
+				if m=='SRC':
+					m='[a.path_from(bld.bldnode) for a in tsk.inputs]'
+				elif m=='TGT':
+					m='[a.path_from(bld.bldnode) for a in tsk.outputs]'
+				elif m[:3]not in('tsk','gen','bld'):
+					dvars.extend([var,meth[1:]])
+					m='%r'%m
+				app('" ".join(tsk.colon(%r, %s))'%(var,m))
+			else:
+				app('%s%s'%(var,meth))
+		else:
+			if not var in dvars:dvars.append(var)
+			app("p('%s')"%var)
+	if parm:parm="%% (%s) "%(',\n\t\t'.join(parm))
+	else:parm=''
+	c=COMPILE_TEMPLATE_SHELL%(line,parm)
+	Logs.debug('action: %s'%c.strip().splitlines())
+	return(funex(c),dvars)
+def compile_fun_noshell(line):
+	extr=[]
+	def repl(match):
+		g=match.group
+		if g('dollar'):return"$"
+		elif g('subst'):extr.append((g('var'),g('code')));return"<<|@|>>"
+		return None
+	line2=reg_act.sub(repl,line)
+	params=line2.split('<<|@|>>')
+	assert(extr)
+	buf=[]
+	dvars=[]
+	app=buf.append
+	for x in range(len(extr)):
+		params[x]=params[x].strip()
+		if params[x]:
+			app("lst.extend(%r)"%params[x].split())
+		(var,meth)=extr[x]
+		if var=='SRC':
+			if meth:app('lst.append(tsk.inputs%s)'%meth)
+			else:app("lst.extend([a.path_from(bld.bldnode) for a in tsk.inputs])")
+		elif var=='TGT':
+			if meth:app('lst.append(tsk.outputs%s)'%meth)
+			else:app("lst.extend([a.path_from(bld.bldnode) for a in tsk.outputs])")
+		elif meth:
+			if meth.startswith(':'):
+				m=meth[1:]
+				if m=='SRC':
+					m='[a.path_from(bld.bldnode) for a in tsk.inputs]'
+				elif m=='TGT':
+					m='[a.path_from(bld.bldnode) for a in tsk.outputs]'
+				elif m[:3]not in('tsk','gen','bld'):
+					dvars.extend([var,m])
+					m='%r'%m
+				app('lst.extend(tsk.colon(%r, %s))'%(var,m))
+			else:
+				app('lst.extend(gen.to_list(%s%s))'%(var,meth))
+		else:
+			app('lst.extend(to_list(env[%r]))'%var)
+			if not var in dvars:dvars.append(var)
+	if extr:
+		if params[-1]:
+			app("lst.extend(%r)"%params[-1].split())
+	fun=COMPILE_TEMPLATE_NOSHELL%"\n\t".join(buf)
+	Logs.debug('action: %s'%fun.strip().splitlines())
+	return(funex(fun),dvars)
+def compile_fun(line,shell=False):
+	if line.find('<')>0 or line.find('>')>0 or line.find('&&')>0:
+		shell=True
+	if shell:
+		return compile_fun_shell(line)
+	else:
+		return compile_fun_noshell(line)
+def task_factory(name,func=None,vars=None,color='GREEN',ext_in=[],ext_out=[],before=[],after=[],shell=False,scan=None):
+	params={'vars':vars or[],'color':color,'name':name,'ext_in':Utils.to_list(ext_in),'ext_out':Utils.to_list(ext_out),'before':Utils.to_list(before),'after':Utils.to_list(after),'shell':shell,'scan':scan,}
+	if isinstance(func,str):
+		params['run_str']=func
+	else:
+		params['run']=func
+	cls=type(Task)(name,(Task,),params)
+	global classes
+	classes[name]=cls
+	return cls
+def always_run(cls):
+	old=cls.runnable_status
+	def always(self):
+		ret=old(self)
+		if ret==SKIP_ME:
+			ret=RUN_ME
+		return ret
+	cls.runnable_status=always
+	return cls
+def update_outputs(cls):
+	old_post_run=cls.post_run
+	def post_run(self):
+		old_post_run(self)
+		for node in self.outputs:
+			node.sig=Utils.h_file(node.abspath())
+			self.generator.bld.task_sigs[node.abspath()]=self.uid()
+	cls.post_run=post_run
+	old_runnable_status=cls.runnable_status
+	def runnable_status(self):
+		status=old_runnable_status(self)
+		if status!=RUN_ME:
+			return status
+		try:
+			bld=self.generator.bld
+			prev_sig=bld.task_sigs[self.uid()]
+			if prev_sig==self.signature():
+				for x in self.outputs:
+					if not x.sig or bld.task_sigs[x.abspath()]!=self.uid():
+						return RUN_ME
+				return SKIP_ME
+		except KeyError:
+			pass
+		except IndexError:
+			pass
+		except AttributeError:
+			pass
+		return RUN_ME
+	cls.runnable_status=runnable_status
+	return cls
Index: waflib/TaskGen.py
===================================================================
--- waflib/TaskGen.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/TaskGen.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,400 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import copy,re,os
+from waflib import Task,Utils,Logs,Errors,ConfigSet,Node
+feats=Utils.defaultdict(set)
+class task_gen(object):
+	mappings={}
+	prec=Utils.defaultdict(list)
+	def __init__(self,*k,**kw):
+		self.source=''
+		self.target=''
+		self.meths=[]
+		self.prec=Utils.defaultdict(list)
+		self.mappings={}
+		self.features=[]
+		self.tasks=[]
+		if not'bld'in kw:
+			self.env=ConfigSet.ConfigSet()
+			self.idx=0
+			self.path=None
+		else:
+			self.bld=kw['bld']
+			self.env=self.bld.env.derive()
+			self.path=self.bld.path
+			try:
+				self.idx=self.bld.idx[id(self.path)]=self.bld.idx.get(id(self.path),0)+1
+			except AttributeError:
+				self.bld.idx={}
+				self.idx=self.bld.idx[id(self.path)]=1
+		for key,val in kw.items():
+			setattr(self,key,val)
+	def __str__(self):
+		return"<task_gen %r declared in %s>"%(self.name,self.path.abspath())
+	def __repr__(self):
+		lst=[]
+		for x in self.__dict__.keys():
+			if x not in['env','bld','compiled_tasks','tasks']:
+				lst.append("%s=%s"%(x,repr(getattr(self,x))))
+		return"bld(%s) in %s"%(", ".join(lst),self.path.abspath())
+	def get_name(self):
+		try:
+			return self._name
+		except AttributeError:
+			if isinstance(self.target,list):
+				lst=[str(x)for x in self.target]
+				name=self._name=','.join(lst)
+			else:
+				name=self._name=str(self.target)
+			return name
+	def set_name(self,name):
+		self._name=name
+	name=property(get_name,set_name)
+	def to_list(self,val):
+		if isinstance(val,str):return val.split()
+		else:return val
+	def post(self):
+		if getattr(self,'posted',None):
+			return False
+		self.posted=True
+		keys=set(self.meths)
+		self.features=Utils.to_list(self.features)
+		for x in self.features+['*']:
+			st=feats[x]
+			if not st:
+				if not x in Task.classes:
+					Logs.warn('feature %r does not exist - bind at least one method to it'%x)
+			keys.update(list(st))
+		prec={}
+		prec_tbl=self.prec or task_gen.prec
+		for x in prec_tbl:
+			if x in keys:
+				prec[x]=prec_tbl[x]
+		tmp=[]
+		for a in keys:
+			for x in prec.values():
+				if a in x:break
+			else:
+				tmp.append(a)
+		tmp.sort()
+		out=[]
+		while tmp:
+			e=tmp.pop()
+			if e in keys:out.append(e)
+			try:
+				nlst=prec[e]
+			except KeyError:
+				pass
+			else:
+				del prec[e]
+				for x in nlst:
+					for y in prec:
+						if x in prec[y]:
+							break
+					else:
+						tmp.append(x)
+		if prec:
+			raise Errors.WafError('Cycle detected in the method execution %r'%prec)
+		out.reverse()
+		self.meths=out
+		Logs.debug('task_gen: posting %s %d'%(self,id(self)))
+		for x in out:
+			try:
+				v=getattr(self,x)
+			except AttributeError:
+				raise Errors.WafError('%r is not a valid task generator method'%x)
+			Logs.debug('task_gen: -> %s (%d)'%(x,id(self)))
+			v()
+		Logs.debug('task_gen: posted %s'%self.name)
+		return True
+	def get_hook(self,node):
+		name=node.name
+		for k in self.mappings:
+			if name.endswith(k):
+				return self.mappings[k]
+		for k in task_gen.mappings:
+			if name.endswith(k):
+				return task_gen.mappings[k]
+		raise Errors.WafError("File %r has no mapping in %r (did you forget to load a waf tool?)"%(node,task_gen.mappings.keys()))
+	def create_task(self,name,src=None,tgt=None):
+		task=Task.classes[name](env=self.env.derive(),generator=self)
+		if src:
+			task.set_inputs(src)
+		if tgt:
+			task.set_outputs(tgt)
+		self.tasks.append(task)
+		return task
+	def clone(self,env):
+		newobj=self.bld()
+		for x in self.__dict__:
+			if x in['env','bld']:
+				continue
+			elif x in['path','features']:
+				setattr(newobj,x,getattr(self,x))
+			else:
+				setattr(newobj,x,copy.copy(getattr(self,x)))
+		newobj.posted=False
+		if isinstance(env,str):
+			newobj.env=self.bld.all_envs[env].derive()
+		else:
+			newobj.env=env.derive()
+		return newobj
+def declare_chain(name='',rule=None,reentrant=None,color='BLUE',ext_in=[],ext_out=[],before=[],after=[],decider=None,scan=None,install_path=None,shell=False):
+	ext_in=Utils.to_list(ext_in)
+	ext_out=Utils.to_list(ext_out)
+	if not name:
+		name=rule
+	cls=Task.task_factory(name,rule,color=color,ext_in=ext_in,ext_out=ext_out,before=before,after=after,scan=scan,shell=shell)
+	def x_file(self,node):
+		ext=decider and decider(self,node)or cls.ext_out
+		if ext_in:
+			_ext_in=ext_in[0]
+		tsk=self.create_task(name,node)
+		cnt=0
+		keys=list(self.mappings.keys())+list(self.__class__.mappings.keys())
+		for x in ext:
+			k=node.change_ext(x,ext_in=_ext_in)
+			tsk.outputs.append(k)
+			if reentrant!=None:
+				if cnt<int(reentrant):
+					self.source.append(k)
+			else:
+				for y in keys:
+					if k.name.endswith(y):
+						self.source.append(k)
+						break
+			cnt+=1
+		if install_path:
+			self.bld.install_files(install_path,tsk.outputs)
+		return tsk
+	for x in cls.ext_in:
+		task_gen.mappings[x]=x_file
+	return x_file
+def taskgen_method(func):
+	setattr(task_gen,func.__name__,func)
+	return func
+def feature(*k):
+	def deco(func):
+		setattr(task_gen,func.__name__,func)
+		for name in k:
+			feats[name].update([func.__name__])
+		return func
+	return deco
+def before_method(*k):
+	def deco(func):
+		setattr(task_gen,func.__name__,func)
+		for fun_name in k:
+			if not func.__name__ in task_gen.prec[fun_name]:
+				task_gen.prec[fun_name].append(func.__name__)
+		return func
+	return deco
+before=before_method
+def after_method(*k):
+	def deco(func):
+		setattr(task_gen,func.__name__,func)
+		for fun_name in k:
+			if not fun_name in task_gen.prec[func.__name__]:
+				task_gen.prec[func.__name__].append(fun_name)
+		return func
+	return deco
+after=after_method
+def extension(*k):
+	def deco(func):
+		setattr(task_gen,func.__name__,func)
+		for x in k:
+			task_gen.mappings[x]=func
+		return func
+	return deco
+@taskgen_method
+def to_nodes(self,lst,path=None):
+	tmp=[]
+	path=path or self.path
+	find=path.find_resource
+	if isinstance(lst,self.path.__class__):
+		lst=[lst]
+	for x in Utils.to_list(lst):
+		if isinstance(x,str):
+			node=find(x)
+		else:
+			node=x
+		if not node:
+			raise Errors.WafError("source not found: %r in %r"%(x,self))
+		tmp.append(node)
+	return tmp
+@feature('*')
+def process_source(self):
+	self.source=self.to_nodes(getattr(self,'source',[]))
+	for node in self.source:
+		self.get_hook(node)(self,node)
+@feature('*')
+@before_method('process_source')
+def process_rule(self):
+	if not getattr(self,'rule',None):
+		return
+	name=str(getattr(self,'name',None)or self.target or getattr(self.rule,'__name__',self.rule))
+	try:
+		cache=self.bld.cache_rule_attr
+	except AttributeError:
+		cache=self.bld.cache_rule_attr={}
+	cls=None
+	if getattr(self,'cache_rule','True'):
+		try:
+			cls=cache[(name,self.rule)]
+		except KeyError:
+			pass
+	if not cls:
+		cls=Task.task_factory(name,self.rule,getattr(self,'vars',[]),shell=getattr(self,'shell',True),color=getattr(self,'color','BLUE'),scan=getattr(self,'scan',None))
+		if getattr(self,'scan',None):
+			cls.scan=self.scan
+		elif getattr(self,'deps',None):
+			def scan(self):
+				nodes=[]
+				for x in self.generator.to_list(getattr(self.generator,'deps',None)):
+					node=self.generator.path.find_resource(x)
+					if not node:
+						self.generator.bld.fatal('Could not find %r (was it declared?)'%x)
+					nodes.append(node)
+				return[nodes,[]]
+			cls.scan=scan
+		if getattr(self,'update_outputs',None):
+			Task.update_outputs(cls)
+		if getattr(self,'always',None):
+			Task.always_run(cls)
+		for x in['after','before','ext_in','ext_out']:
+			setattr(cls,x,getattr(self,x,[]))
+		if getattr(self,'cache_rule','True'):
+			cache[(name,self.rule)]=cls
+	tsk=self.create_task(name)
+	if getattr(self,'target',None):
+		if isinstance(self.target,str):
+			self.target=self.target.split()
+		if not isinstance(self.target,list):
+			self.target=[self.target]
+		for x in self.target:
+			if isinstance(x,str):
+				tsk.outputs.append(self.path.find_or_declare(x))
+			else:
+				x.parent.mkdir()
+				tsk.outputs.append(x)
+		if getattr(self,'install_path',None):
+			self.bld.install_files(self.install_path,tsk.outputs)
+	if getattr(self,'source',None):
+		tsk.inputs=self.to_nodes(self.source)
+		self.source=[]
+	if getattr(self,'cwd',None):
+		tsk.cwd=self.cwd
+@feature('seq')
+def sequence_order(self):
+	if self.meths and self.meths[-1]!='sequence_order':
+		self.meths.append('sequence_order')
+		return
+	if getattr(self,'seq_start',None):
+		return
+	if getattr(self.bld,'prev',None):
+		self.bld.prev.post()
+		for x in self.bld.prev.tasks:
+			for y in self.tasks:
+				y.set_run_after(x)
+	self.bld.prev=self
+re_m4=re.compile('@(\w+)@',re.M)
+class subst_pc(Task.Task):
+	def run(self):
+		if getattr(self.generator,'is_copy',None):
+			self.outputs[0].write(self.inputs[0].read('rb'),'wb')
+			if getattr(self.generator,'chmod',None):
+				os.chmod(self.outputs[0].abspath(),self.generator.chmod)
+			return
+		code=self.inputs[0].read(encoding=getattr(self.generator,'encoding','ISO8859-1'))
+		if getattr(self.generator,'subst_fun',None):
+			code=self.generator.subst_fun(self,code)
+			if code:
+				self.outputs[0].write(code,encoding=getattr(self.generator,'encoding','ISO8859-1'))
+			return
+		code=code.replace('%','%%')
+		lst=[]
+		def repl(match):
+			g=match.group
+			if g(1):
+				lst.append(g(1))
+				return"%%(%s)s"%g(1)
+			return''
+		code=re_m4.sub(repl,code)
+		try:
+			d=self.generator.dct
+		except AttributeError:
+			d={}
+			for x in lst:
+				tmp=getattr(self.generator,x,'')or self.env.get_flat(x)or self.env.get_flat(x.upper())
+				d[x]=str(tmp)
+		code=code%d
+		self.outputs[0].write(code,encoding=getattr(self.generator,'encoding','ISO8859-1'))
+		self.generator.bld.raw_deps[self.uid()]=self.dep_vars=lst
+		try:delattr(self,'cache_sig')
+		except AttributeError:pass
+		if getattr(self.generator,'chmod',None):
+			os.chmod(self.outputs[0].abspath(),self.generator.chmod)
+	def sig_vars(self):
+		bld=self.generator.bld
+		env=self.env
+		upd=self.m.update
+		if getattr(self.generator,'subst_fun',None):
+			upd(Utils.h_fun(self.generator.subst_fun))
+		vars=self.generator.bld.raw_deps.get(self.uid(),[])
+		act_sig=bld.hash_env_vars(env,vars)
+		upd(act_sig)
+		lst=[getattr(self.generator,x,'')for x in vars]
+		upd(Utils.h_list(lst))
+		return self.m.digest()
+@extension('.pc.in')
+def add_pcfile(self,node):
+	tsk=self.create_task('subst_pc',node,node.change_ext('.pc','.pc.in'))
+	self.bld.install_files(getattr(self,'install_path','${LIBDIR}/pkgconfig/'),tsk.outputs)
+class subst(subst_pc):
+	pass
+@feature('subst')
+@before_method('process_source','process_rule')
+def process_subst(self):
+	src=Utils.to_list(getattr(self,'source',[]))
+	if isinstance(src,Node.Node):
+		src=[src]
+	tgt=Utils.to_list(getattr(self,'target',[]))
+	if isinstance(tgt,Node.Node):
+		tgt=[tgt]
+	if len(src)!=len(tgt):
+		raise Errors.WafError('invalid number of source/target for %r'%self)
+	for x,y in zip(src,tgt):
+		if not x or not y:
+			raise Errors.WafError('null source or target for %r'%self)
+		a,b=None,None
+		if isinstance(x,str)and isinstance(y,str)and x==y:
+			a=self.path.find_node(x)
+			b=self.path.get_bld().make_node(y)
+			if not os.path.isfile(b.abspath()):
+				b.sig=None
+				b.parent.mkdir()
+		else:
+			if isinstance(x,str):
+				a=self.path.find_resource(x)
+			elif isinstance(x,Node.Node):
+				a=x
+			if isinstance(y,str):
+				b=self.path.find_or_declare(y)
+			elif isinstance(y,Node.Node):
+				b=y
+		if not a:
+			raise Errors.WafError('cound not find %r for %r'%(x,self))
+		has_constraints=False
+		tsk=self.create_task('subst',a,b)
+		for k in('after','before','ext_in','ext_out'):
+			val=getattr(self,k,None)
+			if val:
+				has_constraints=True
+				setattr(tsk,k,val)
+		if not has_constraints and b.name.endswith('.h'):
+			tsk.before=[k for k in('c','cxx')if k in Task.classes]
+		inst_to=getattr(self,'install_path',None)
+		if inst_to:
+			self.bld.install_files(inst_to,b,chmod=getattr(self,'chmod',Utils.O644))
+	self.source=[]
Index: waflib/Tools/__init__.py
===================================================================
--- waflib/Tools/__init__.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/__init__.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,4 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
Index: waflib/Tools/ar.py
===================================================================
--- waflib/Tools/ar.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/ar.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,11 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+from waflib.Configure import conf
+@conf
+def find_ar(conf):
+	conf.load('ar')
+def configure(conf):
+	conf.find_program('ar',var='AR')
+	conf.env.ARFLAGS='rcs'
Index: waflib/Tools/asm.py
===================================================================
--- waflib/Tools/asm.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/asm.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,25 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import os,sys
+from waflib import Task,Utils
+import waflib.Task
+from waflib.Tools.ccroot import link_task,stlink_task
+from waflib.TaskGen import extension,feature
+class asm(Task.Task):
+	color='BLUE'
+	run_str='${AS} ${ASFLAGS} ${ASMPATH_ST:INCPATHS} ${AS_SRC_F}${SRC} ${AS_TGT_F}${TGT}'
+@extension('.s','.S','.asm','.ASM','.spp','.SPP')
+def asm_hook(self,node):
+	return self.create_compiled_task('asm',node)
+class asmprogram(link_task):
+	run_str='${ASLINK} ${ASLINKFLAGS} ${ASLNK_TGT_F}${TGT} ${ASLNK_SRC_F}${SRC}'
+	ext_out=['.bin']
+	inst_to='${BINDIR}'
+class asmshlib(asmprogram):
+	inst_to='${LIBDIR}'
+class asmstlib(stlink_task):
+	pass
+def configure(conf):
+	conf.env['ASMPATH_ST']='-I%s'
Index: waflib/Tools/bison.py
===================================================================
--- waflib/Tools/bison.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/bison.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,28 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+from waflib import Task
+from waflib.TaskGen import extension
+class bison(Task.Task):
+	color='BLUE'
+	run_str='${BISON} ${BISONFLAGS} ${SRC[0].abspath()} -o ${TGT[0].name}'
+	ext_out=['.h']
+@extension('.y','.yc','.yy')
+def big_bison(self,node):
+	has_h='-d'in self.env['BISONFLAGS']
+	outs=[]
+	if node.name.endswith('.yc'):
+		outs.append(node.change_ext('.tab.cc'))
+		if has_h:
+			outs.append(node.change_ext('.tab.hh'))
+	else:
+		outs.append(node.change_ext('.tab.c'))
+		if has_h:
+			outs.append(node.change_ext('.tab.h'))
+	tsk=self.create_task('bison',node,outs)
+	tsk.cwd=node.parent.get_bld().abspath()
+	self.source.append(outs[0])
+def configure(conf):
+	conf.find_program('bison',var='BISON')
+	conf.env.BISONFLAGS=['-d']
Index: waflib/Tools/c.py
===================================================================
--- waflib/Tools/c.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/c.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,24 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+from waflib import TaskGen,Task,Utils
+from waflib.Tools import c_preproc
+from waflib.Tools.ccroot import link_task,stlink_task
+@TaskGen.extension('.c')
+def c_hook(self,node):
+	return self.create_compiled_task('c',node)
+class c(Task.Task):
+	run_str='${CC} ${ARCH_ST:ARCH} ${CFLAGS} ${CPPFLAGS} ${FRAMEWORKPATH_ST:FRAMEWORKPATH} ${CPPPATH_ST:INCPATHS} ${DEFINES_ST:DEFINES} ${CC_SRC_F}${SRC} ${CC_TGT_F}${TGT}'
+	vars=['CCDEPS']
+	ext_in=['.h']
+	scan=c_preproc.scan
+class cprogram(link_task):
+	run_str='${LINK_CC} ${LINKFLAGS} ${CCLNK_SRC_F}${SRC} ${CCLNK_TGT_F}${TGT[0].abspath()} ${RPATH_ST:RPATH} ${FRAMEWORKPATH_ST:FRAMEWORKPATH} ${FRAMEWORK_ST:FRAMEWORK} ${ARCH_ST:ARCH} ${STLIB_MARKER} ${STLIBPATH_ST:STLIBPATH} ${STLIB_ST:STLIB} ${SHLIB_MARKER} ${LIBPATH_ST:LIBPATH} ${LIB_ST:LIB}'
+	ext_out=['.bin']
+	vars=['LINKDEPS']
+	inst_to='${BINDIR}'
+class cshlib(cprogram):
+	inst_to='${LIBDIR}'
+class cstlib(stlink_task):
+	pass
Index: waflib/Tools/c_aliases.py
===================================================================
--- waflib/Tools/c_aliases.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/c_aliases.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,55 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import os,sys,re
+from waflib import Utils,Build
+from waflib.Configure import conf
+def get_extensions(lst):
+	ret=[]
+	for x in Utils.to_list(lst):
+		try:
+			if not isinstance(x,str):
+				x=x.name
+			ret.append(x[x.rfind('.')+1:])
+		except Exception:
+			pass
+	return ret
+def sniff_features(**kw):
+	exts=get_extensions(kw['source'])
+	type=kw['_type']
+	feats=[]
+	if'cxx'in exts or'cpp'in exts or'c++'in exts or'cc'in exts or'C'in exts:
+		feats.append('cxx')
+	if'c'in exts or'vala'in exts:
+		feats.append('c')
+	if'd'in exts:
+		feats.append('d')
+	if'java'in exts:
+		feats.append('java')
+	if'java'in exts:
+		return'java'
+	if type in['program','shlib','stlib']:
+		for x in feats:
+			if x in['cxx','d','c']:
+				feats.append(x+type)
+	return feats
+def set_features(kw,_type):
+	kw['_type']=_type
+	kw['features']=Utils.to_list(kw.get('features',[]))+Utils.to_list(sniff_features(**kw))
+@conf
+def program(bld,*k,**kw):
+	set_features(kw,'program')
+	return bld(*k,**kw)
+@conf
+def shlib(bld,*k,**kw):
+	set_features(kw,'shlib')
+	return bld(*k,**kw)
+@conf
+def stlib(bld,*k,**kw):
+	set_features(kw,'stlib')
+	return bld(*k,**kw)
+@conf
+def objects(bld,*k,**kw):
+	set_features(kw,'objects')
+	return bld(*k,**kw)
Index: waflib/Tools/c_config.py
===================================================================
--- waflib/Tools/c_config.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/c_config.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,728 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import os,re,shlex,sys
+from waflib import Build,Utils,Task,Options,Logs,Errors,ConfigSet,Runner
+from waflib.TaskGen import after_method,feature
+from waflib.Configure import conf
+WAF_CONFIG_H='config.h'
+DEFKEYS='define_key'
+INCKEYS='include_key'
+cfg_ver={'atleast-version':'>=','exact-version':'==','max-version':'<=',}
+SNIP_FUNCTION='''
+int main(int argc, char **argv) {
+	void *p;
+	(void)argc; (void)argv;
+	p=(void*)(%s);
+	return 0;
+}
+'''
+SNIP_TYPE='''
+int main(int argc, char **argv) {
+	(void)argc; (void)argv;
+	if ((%(type_name)s *) 0) return 0;
+	if (sizeof (%(type_name)s)) return 0;
+	return 1;
+}
+'''
+SNIP_EMPTY_PROGRAM='''
+int main(int argc, char **argv) {
+	(void)argc; (void)argv;
+	return 0;
+}
+'''
+SNIP_FIELD='''
+int main(int argc, char **argv) {
+	char *off;
+	(void)argc; (void)argv;
+	off = (char*) &((%(type_name)s*)0)->%(field_name)s;
+	return (size_t) off < sizeof(%(type_name)s);
+}
+'''
+MACRO_TO_DESTOS={'__linux__':'linux','__GNU__':'gnu','__FreeBSD__':'freebsd','__NetBSD__':'netbsd','__OpenBSD__':'openbsd','__sun':'sunos','__hpux':'hpux','__sgi':'irix','_AIX':'aix','__CYGWIN__':'cygwin','__MSYS__':'msys','_UWIN':'uwin','_WIN64':'win32','_WIN32':'win32','__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__':'darwin','__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__':'darwin','__QNX__':'qnx','__native_client__':'nacl'}
+MACRO_TO_DEST_CPU={'__x86_64__':'x86_64','__amd64__':'x86_64','__i386__':'x86','__ia64__':'ia','__mips__':'mips','__sparc__':'sparc','__alpha__':'alpha','__aarch64__':'aarch64','__thumb__':'thumb','__arm__':'arm','__hppa__':'hppa','__powerpc__':'powerpc','__ppc__':'powerpc','__convex__':'convex','__m68k__':'m68k','__s390x__':'s390x','__s390__':'s390','__sh__':'sh',}
+@conf
+def parse_flags(self,line,uselib_store,env=None,force_static=False):
+	assert(isinstance(line,str))
+	env=env or self.env
+	app=env.append_value
+	appu=env.append_unique
+	lex=shlex.shlex(line,posix=False)
+	lex.whitespace_split=True
+	lex.commenters=''
+	lst=list(lex)
+	uselib=uselib_store
+	while lst:
+		x=lst.pop(0)
+		st=x[:2]
+		ot=x[2:]
+		if st=='-I'or st=='/I':
+			if not ot:ot=lst.pop(0)
+			appu('INCLUDES_'+uselib,[ot])
+		elif st=='-include':
+			tmp=[x,lst.pop(0)]
+			app('CFLAGS',tmp)
+			app('CXXFLAGS',tmp)
+		elif st=='-D'or(env.CXX_NAME=='msvc'and st=='/D'):
+			if not ot:ot=lst.pop(0)
+			app('DEFINES_'+uselib,[ot])
+		elif st=='-l':
+			if not ot:ot=lst.pop(0)
+			prefix=force_static and'STLIB_'or'LIB_'
+			appu(prefix+uselib,[ot])
+		elif st=='-L':
+			if not ot:ot=lst.pop(0)
+			appu('LIBPATH_'+uselib,[ot])
+		elif x.startswith('/LIBPATH:'):
+			appu('LIBPATH_'+uselib,[x.replace('/LIBPATH:','')])
+		elif x=='-pthread'or x.startswith('+')or x.startswith('-std'):
+			app('CFLAGS_'+uselib,[x])
+			app('CXXFLAGS_'+uselib,[x])
+			app('LINKFLAGS_'+uselib,[x])
+		elif x=='-framework':
+			appu('FRAMEWORK_'+uselib,[lst.pop(0)])
+		elif x.startswith('-F'):
+			appu('FRAMEWORKPATH_'+uselib,[x[2:]])
+		elif x.startswith('-Wl'):
+			app('LINKFLAGS_'+uselib,[x])
+		elif x.startswith('-m')or x.startswith('-f')or x.startswith('-dynamic'):
+			app('CFLAGS_'+uselib,[x])
+			app('CXXFLAGS_'+uselib,[x])
+		elif x.startswith('-bundle'):
+			app('LINKFLAGS_'+uselib,[x])
+		elif x.startswith('-undefined'):
+			arg=lst.pop(0)
+			app('LINKFLAGS_'+uselib,[x,arg])
+		elif x.startswith('-arch')or x.startswith('-isysroot'):
+			tmp=[x,lst.pop(0)]
+			app('CFLAGS_'+uselib,tmp)
+			app('CXXFLAGS_'+uselib,tmp)
+			app('LINKFLAGS_'+uselib,tmp)
+		elif x.endswith('.a')or x.endswith('.so')or x.endswith('.dylib')or x.endswith('.lib'):
+			appu('LINKFLAGS_'+uselib,[x])
+@conf
+def ret_msg(self,f,kw):
+	if isinstance(f,str):
+		return f
+	return f(kw)
+@conf
+def validate_cfg(self,kw):
+	if not'path'in kw:
+		if not self.env.PKGCONFIG:
+			self.find_program('pkg-config',var='PKGCONFIG')
+		kw['path']=self.env.PKGCONFIG
+	if'atleast_pkgconfig_version'in kw:
+		if not'msg'in kw:
+			kw['msg']='Checking for pkg-config version >= %r'%kw['atleast_pkgconfig_version']
+		return
+	if not'okmsg'in kw:
+		kw['okmsg']='yes'
+	if not'errmsg'in kw:
+		kw['errmsg']='not found'
+	if'modversion'in kw:
+		if not'msg'in kw:
+			kw['msg']='Checking for %r version'%kw['modversion']
+		return
+	for x in cfg_ver.keys():
+		y=x.replace('-','_')
+		if y in kw:
+			if not'package'in kw:
+				raise ValueError('%s requires a package'%x)
+			if not'msg'in kw:
+				kw['msg']='Checking for %r %s %s'%(kw['package'],cfg_ver[x],kw[y])
+			return
+	if not'msg'in kw:
+		kw['msg']='Checking for %r'%(kw['package']or kw['path'])
+@conf
+def exec_cfg(self,kw):
+	def define_it():
+		self.define(self.have_define(kw.get('uselib_store',kw['package'])),1,0)
+	if'atleast_pkgconfig_version'in kw:
+		cmd=[kw['path'],'--atleast-pkgconfig-version=%s'%kw['atleast_pkgconfig_version']]
+		self.cmd_and_log(cmd)
+		if not'okmsg'in kw:
+			kw['okmsg']='yes'
+		return
+	for x in cfg_ver:
+		y=x.replace('-','_')
+		if y in kw:
+			self.cmd_and_log([kw['path'],'--%s=%s'%(x,kw[y]),kw['package']])
+			if not'okmsg'in kw:
+				kw['okmsg']='yes'
+			define_it()
+			break
+	if'modversion'in kw:
+		version=self.cmd_and_log([kw['path'],'--modversion',kw['modversion']]).strip()
+		self.define('%s_VERSION'%Utils.quote_define_name(kw.get('uselib_store',kw['modversion'])),version)
+		return version
+	lst=[kw['path']]
+	defi=kw.get('define_variable',None)
+	if not defi:
+		defi=self.env.PKG_CONFIG_DEFINES or{}
+	for key,val in defi.items():
+		lst.append('--define-variable=%s=%s'%(key,val))
+	if'variables'in kw:
+		env=kw.get('env',self.env)
+		uselib=kw.get('uselib_store',kw['package'].upper())
+		vars=Utils.to_list(kw['variables'])
+		for v in vars:
+			val=self.cmd_and_log(lst+['--variable='+v]).strip()
+			var='%s_%s'%(uselib,v)
+			env[var]=val
+		if not'okmsg'in kw:
+			kw['okmsg']='yes'
+		return
+	static=False
+	if'args'in kw:
+		args=Utils.to_list(kw['args'])
+		if'--static'in args or'--static-libs'in args:
+			static=True
+		lst+=args
+	lst.extend(Utils.to_list(kw['package']))
+	ret=self.cmd_and_log(lst)
+	if not'okmsg'in kw:
+		kw['okmsg']='yes'
+	define_it()
+	self.parse_flags(ret,kw.get('uselib_store',kw['package'].upper()),kw.get('env',self.env),force_static=static)
+	return ret
+@conf
+def check_cfg(self,*k,**kw):
+	if k:
+		lst=k[0].split()
+		kw['package']=lst[0]
+		kw['args']=' '.join(lst[1:])
+	self.validate_cfg(kw)
+	if'msg'in kw:
+		self.start_msg(kw['msg'])
+	ret=None
+	try:
+		ret=self.exec_cfg(kw)
+	except self.errors.WafError:
+		if'errmsg'in kw:
+			self.end_msg(kw['errmsg'],'YELLOW')
+		if Logs.verbose>1:
+			raise
+		else:
+			self.fatal('The configuration failed')
+	else:
+		kw['success']=ret
+		if'okmsg'in kw:
+			self.end_msg(self.ret_msg(kw['okmsg'],kw))
+	return ret
+@conf
+def validate_c(self,kw):
+	if not'env'in kw:
+		kw['env']=self.env.derive()
+	env=kw['env']
+	if not'compiler'in kw and not'features'in kw:
+		kw['compiler']='c'
+		if env['CXX_NAME']and Task.classes.get('cxx',None):
+			kw['compiler']='cxx'
+			if not self.env['CXX']:
+				self.fatal('a c++ compiler is required')
+		else:
+			if not self.env['CC']:
+				self.fatal('a c compiler is required')
+	if not'compile_mode'in kw:
+		kw['compile_mode']='c'
+		if'cxx'in Utils.to_list(kw.get('features',[]))or kw.get('compiler','')=='cxx':
+			kw['compile_mode']='cxx'
+	if not'type'in kw:
+		kw['type']='cprogram'
+	if not'features'in kw:
+		kw['features']=[kw['compile_mode'],kw['type']]
+	else:
+		kw['features']=Utils.to_list(kw['features'])
+	if not'compile_filename'in kw:
+		kw['compile_filename']='test.c'+((kw['compile_mode']=='cxx')and'pp'or'')
+	def to_header(dct):
+		if'header_name'in dct:
+			dct=Utils.to_list(dct['header_name'])
+			return''.join(['#include <%s>\n'%x for x in dct])
+		return''
+	if'framework_name'in kw:
+		fwkname=kw['framework_name']
+		if not'uselib_store'in kw:
+			kw['uselib_store']=fwkname.upper()
+		if not kw.get('no_header',False):
+			if not'header_name'in kw:
+				kw['header_name']=[]
+			fwk='%s/%s.h'%(fwkname,fwkname)
+			if kw.get('remove_dot_h',None):
+				fwk=fwk[:-2]
+			kw['header_name']=Utils.to_list(kw['header_name'])+[fwk]
+		kw['msg']='Checking for framework %s'%fwkname
+		kw['framework']=fwkname
+	if'function_name'in kw:
+		fu=kw['function_name']
+		if not'msg'in kw:
+			kw['msg']='Checking for function %s'%fu
+		kw['code']=to_header(kw)+SNIP_FUNCTION%fu
+		if not'uselib_store'in kw:
+			kw['uselib_store']=fu.upper()
+		if not'define_name'in kw:
+			kw['define_name']=self.have_define(fu)
+	elif'type_name'in kw:
+		tu=kw['type_name']
+		if not'header_name'in kw:
+			kw['header_name']='stdint.h'
+		if'field_name'in kw:
+			field=kw['field_name']
+			kw['code']=to_header(kw)+SNIP_FIELD%{'type_name':tu,'field_name':field}
+			if not'msg'in kw:
+				kw['msg']='Checking for field %s in %s'%(field,tu)
+			if not'define_name'in kw:
+				kw['define_name']=self.have_define((tu+'_'+field).upper())
+		else:
+			kw['code']=to_header(kw)+SNIP_TYPE%{'type_name':tu}
+			if not'msg'in kw:
+				kw['msg']='Checking for type %s'%tu
+			if not'define_name'in kw:
+				kw['define_name']=self.have_define(tu.upper())
+	elif'header_name'in kw:
+		if not'msg'in kw:
+			kw['msg']='Checking for header %s'%kw['header_name']
+		l=Utils.to_list(kw['header_name'])
+		assert len(l)>0,'list of headers in header_name is empty'
+		kw['code']=to_header(kw)+SNIP_EMPTY_PROGRAM
+		if not'uselib_store'in kw:
+			kw['uselib_store']=l[0].upper()
+		if not'define_name'in kw:
+			kw['define_name']=self.have_define(l[0])
+	if'lib'in kw:
+		if not'msg'in kw:
+			kw['msg']='Checking for library %s'%kw['lib']
+		if not'uselib_store'in kw:
+			kw['uselib_store']=kw['lib'].upper()
+	if'stlib'in kw:
+		if not'msg'in kw:
+			kw['msg']='Checking for static library %s'%kw['stlib']
+		if not'uselib_store'in kw:
+			kw['uselib_store']=kw['stlib'].upper()
+	if'fragment'in kw:
+		kw['code']=kw['fragment']
+		if not'msg'in kw:
+			kw['msg']='Checking for code snippet'
+		if not'errmsg'in kw:
+			kw['errmsg']='no'
+	for(flagsname,flagstype)in[('cxxflags','compiler'),('cflags','compiler'),('linkflags','linker')]:
+		if flagsname in kw:
+			if not'msg'in kw:
+				kw['msg']='Checking for %s flags %s'%(flagstype,kw[flagsname])
+			if not'errmsg'in kw:
+				kw['errmsg']='no'
+	if not'execute'in kw:
+		kw['execute']=False
+	if kw['execute']:
+		kw['features'].append('test_exec')
+	if not'errmsg'in kw:
+		kw['errmsg']='not found'
+	if not'okmsg'in kw:
+		kw['okmsg']='yes'
+	if not'code'in kw:
+		kw['code']=SNIP_EMPTY_PROGRAM
+	if self.env[INCKEYS]:
+		kw['code']='\n'.join(['#include <%s>'%x for x in self.env[INCKEYS]])+'\n'+kw['code']
+	if not kw.get('success'):kw['success']=None
+	if'define_name'in kw:
+		self.undefine(kw['define_name'])
+	assert'msg'in kw,'invalid parameters, read http://freehackers.org/~tnagy/wafbook/single.html#config_helpers_c'
+@conf
+def post_check(self,*k,**kw):
+	is_success=0
+	if kw['execute']:
+		if kw['success']is not None:
+			if kw.get('define_ret',False):
+				is_success=kw['success']
+			else:
+				is_success=(kw['success']==0)
+	else:
+		is_success=(kw['success']==0)
+	if'define_name'in kw:
+		if'header_name'in kw or'function_name'in kw or'type_name'in kw or'fragment'in kw:
+			if kw['execute']and kw.get('define_ret',None)and isinstance(is_success,str):
+				self.define(kw['define_name'],is_success,quote=kw.get('quote',1))
+			else:
+				self.define_cond(kw['define_name'],is_success)
+		else:
+			self.define_cond(kw['define_name'],is_success)
+	if'header_name'in kw:
+		if kw.get('auto_add_header_name',False):
+			self.env.append_value(INCKEYS,Utils.to_list(kw['header_name']))
+	if is_success and'uselib_store'in kw:
+		from waflib.Tools import ccroot
+		_vars=set([])
+		for x in kw['features']:
+			if x in ccroot.USELIB_VARS:
+				_vars|=ccroot.USELIB_VARS[x]
+		for k in _vars:
+			lk=k.lower()
+			if k=='INCLUDES':lk='includes'
+			if k=='DEFINES':lk='defines'
+			if lk in kw:
+				val=kw[lk]
+				if isinstance(val,str):
+					val=val.rstrip(os.path.sep)
+				self.env.append_unique(k+'_'+kw['uselib_store'],val)
+	return is_success
+@conf
+def check(self,*k,**kw):
+	self.validate_c(kw)
+	self.start_msg(kw['msg'])
+	ret=None
+	try:
+		ret=self.run_c_code(*k,**kw)
+	except self.errors.ConfigurationError:
+		self.end_msg(kw['errmsg'],'YELLOW')
+		if Logs.verbose>1:
+			raise
+		else:
+			self.fatal('The configuration failed')
+	else:
+		kw['success']=ret
+	ret=self.post_check(*k,**kw)
+	if not ret:
+		self.end_msg(kw['errmsg'],'YELLOW')
+		self.fatal('The configuration failed %r'%ret)
+	else:
+		self.end_msg(self.ret_msg(kw['okmsg'],kw))
+	return ret
+class test_exec(Task.Task):
+	color='PINK'
+	def run(self):
+		if getattr(self.generator,'rpath',None):
+			if getattr(self.generator,'define_ret',False):
+				self.generator.bld.retval=self.generator.bld.cmd_and_log([self.inputs[0].abspath()])
+			else:
+				self.generator.bld.retval=self.generator.bld.exec_command([self.inputs[0].abspath()])
+		else:
+			env=self.env.env or{}
+			env.update(dict(os.environ))
+			for var in('LD_LIBRARY_PATH','DYLD_LIBRARY_PATH','PATH'):
+				env[var]=self.inputs[0].parent.abspath()+os.path.pathsep+env.get(var,'')
+			if getattr(self.generator,'define_ret',False):
+				self.generator.bld.retval=self.generator.bld.cmd_and_log([self.inputs[0].abspath()],env=env)
+			else:
+				self.generator.bld.retval=self.generator.bld.exec_command([self.inputs[0].abspath()],env=env)
+@feature('test_exec')
+@after_method('apply_link')
+def test_exec_fun(self):
+	self.create_task('test_exec',self.link_task.outputs[0])
+CACHE_RESULTS=1
+COMPILE_ERRORS=2
+@conf
+def run_c_code(self,*k,**kw):
+	lst=[str(v)for(p,v)in kw.items()if p!='env']
+	h=Utils.h_list(lst)
+	dir=self.bldnode.abspath()+os.sep+(not Utils.is_win32 and'.'or'')+'conf_check_'+Utils.to_hex(h)
+	try:
+		os.makedirs(dir)
+	except OSError:
+		pass
+	try:
+		os.stat(dir)
+	except OSError:
+		self.fatal('cannot use the configuration test folder %r'%dir)
+	cachemode=getattr(Options.options,'confcache',None)
+	if cachemode==CACHE_RESULTS:
+		try:
+			proj=ConfigSet.ConfigSet(os.path.join(dir,'cache_run_c_code'))
+		except OSError:
+			pass
+		else:
+			ret=proj['cache_run_c_code']
+			if isinstance(ret,str)and ret.startswith('Test does not build'):
+				self.fatal(ret)
+			return ret
+	bdir=os.path.join(dir,'testbuild')
+	if not os.path.exists(bdir):
+		os.makedirs(bdir)
+	self.test_bld=bld=Build.BuildContext(top_dir=dir,out_dir=bdir)
+	bld.init_dirs()
+	bld.progress_bar=0
+	bld.targets='*'
+	if kw['compile_filename']:
+		node=bld.srcnode.make_node(kw['compile_filename'])
+		node.write(kw['code'])
+	bld.logger=self.logger
+	bld.all_envs.update(self.all_envs)
+	bld.env=kw['env']
+	o=bld(features=kw['features'],source=kw['compile_filename'],target='testprog')
+	for k,v in kw.items():
+		setattr(o,k,v)
+	self.to_log("==>\n%s\n<=="%kw['code'])
+	bld.targets='*'
+	ret=-1
+	try:
+		try:
+			bld.compile()
+		except Errors.WafError:
+			ret='Test does not build: %s'%Utils.ex_stack()
+			self.fatal(ret)
+		else:
+			ret=getattr(bld,'retval',0)
+	finally:
+		proj=ConfigSet.ConfigSet()
+		proj['cache_run_c_code']=ret
+		proj.store(os.path.join(dir,'cache_run_c_code'))
+	return ret
+@conf
+def check_cxx(self,*k,**kw):
+	kw['compiler']='cxx'
+	return self.check(*k,**kw)
+@conf
+def check_cc(self,*k,**kw):
+	kw['compiler']='c'
+	return self.check(*k,**kw)
+@conf
+def define(self,key,val,quote=True):
+	assert key and isinstance(key,str)
+	if val is True:
+		val=1
+	elif val in(False,None):
+		val=0
+	if isinstance(val,int)or isinstance(val,float):
+		s='%s=%s'
+	else:
+		s=quote and'%s="%s"'or'%s=%s'
+	app=s%(key,str(val))
+	ban=key+'='
+	lst=self.env['DEFINES']
+	for x in lst:
+		if x.startswith(ban):
+			lst[lst.index(x)]=app
+			break
+	else:
+		self.env.append_value('DEFINES',app)
+	self.env.append_unique(DEFKEYS,key)
+@conf
+def undefine(self,key):
+	assert key and isinstance(key,str)
+	ban=key+'='
+	lst=[x for x in self.env['DEFINES']if not x.startswith(ban)]
+	self.env['DEFINES']=lst
+	self.env.append_unique(DEFKEYS,key)
+@conf
+def define_cond(self,key,val):
+	assert key and isinstance(key,str)
+	if val:
+		self.define(key,1)
+	else:
+		self.undefine(key)
+@conf
+def is_defined(self,key):
+	assert key and isinstance(key,str)
+	ban=key+'='
+	for x in self.env['DEFINES']:
+		if x.startswith(ban):
+			return True
+	return False
+@conf
+def get_define(self,key):
+	assert key and isinstance(key,str)
+	ban=key+'='
+	for x in self.env['DEFINES']:
+		if x.startswith(ban):
+			return x[len(ban):]
+	return None
+@conf
+def have_define(self,key):
+	return(self.env.HAVE_PAT or'HAVE_%s')%Utils.quote_define_name(key)
+@conf
+def write_config_header(self,configfile='',guard='',top=False,env=None,defines=True,headers=False,remove=True,define_prefix=''):
+	if env:
+		Logs.warn('Cannot pass env to write_config_header')
+	if not configfile:configfile=WAF_CONFIG_H
+	waf_guard=guard or'W_%s_WAF'%Utils.quote_define_name(configfile)
+	node=top and self.bldnode or self.path.get_bld()
+	node=node.make_node(configfile)
+	node.parent.mkdir()
+	lst=['/* WARNING! All changes made to this file will be lost! */\n']
+	lst.append('#ifndef %s\n#define %s\n'%(waf_guard,waf_guard))
+	lst.append(self.get_config_header(defines,headers,define_prefix=define_prefix))
+	lst.append('\n#endif /* %s */\n'%waf_guard)
+	node.write('\n'.join(lst))
+	self.env.append_unique(Build.CFG_FILES,[node.abspath()])
+	if remove:
+		for key in self.env[DEFKEYS]:
+			self.undefine(key)
+		self.env[DEFKEYS]=[]
+@conf
+def get_config_header(self,defines=True,headers=False,define_prefix=''):
+	lst=[]
+	if headers:
+		for x in self.env[INCKEYS]:
+			lst.append('#include <%s>'%x)
+	if defines:
+		for x in self.env[DEFKEYS]:
+			if self.is_defined(x):
+				val=self.get_define(x)
+				lst.append('#define %s %s'%(define_prefix+x,val))
+			else:
+				lst.append('/* #undef %s */'%(define_prefix+x))
+	return"\n".join(lst)
+@conf
+def cc_add_flags(conf):
+	conf.add_os_flags('CPPFLAGS','CFLAGS')
+	conf.add_os_flags('CFLAGS')
+@conf
+def cxx_add_flags(conf):
+	conf.add_os_flags('CPPFLAGS','CXXFLAGS')
+	conf.add_os_flags('CXXFLAGS')
+@conf
+def link_add_flags(conf):
+	conf.add_os_flags('LINKFLAGS')
+	conf.add_os_flags('LDFLAGS','LINKFLAGS')
+@conf
+def cc_load_tools(conf):
+	if not conf.env.DEST_OS:
+		conf.env.DEST_OS=Utils.unversioned_sys_platform()
+	conf.load('c')
+@conf
+def cxx_load_tools(conf):
+	if not conf.env.DEST_OS:
+		conf.env.DEST_OS=Utils.unversioned_sys_platform()
+	conf.load('cxx')
+@conf
+def get_cc_version(conf,cc,gcc=False,icc=False):
+	cmd=cc+['-dM','-E','-']
+	env=conf.env.env or None
+	try:
+		p=Utils.subprocess.Popen(cmd,stdin=Utils.subprocess.PIPE,stdout=Utils.subprocess.PIPE,stderr=Utils.subprocess.PIPE,env=env)
+		p.stdin.write('\n')
+		out=p.communicate()[0]
+	except Exception:
+		conf.fatal('Could not determine the compiler version %r'%cmd)
+	if not isinstance(out,str):
+		out=out.decode(sys.stdout.encoding or'iso8859-1')
+	if gcc:
+		if out.find('__INTEL_COMPILER')>=0:
+			conf.fatal('The intel compiler pretends to be gcc')
+		if out.find('__GNUC__')<0:
+			conf.fatal('Could not determine the compiler type')
+	if icc and out.find('__INTEL_COMPILER')<0:
+		conf.fatal('Not icc/icpc')
+	k={}
+	if icc or gcc:
+		out=out.splitlines()
+		for line in out:
+			lst=shlex.split(line)
+			if len(lst)>2:
+				key=lst[1]
+				val=lst[2]
+				k[key]=val
+		def isD(var):
+			return var in k
+		def isT(var):
+			return var in k and k[var]!='0'
+		if not conf.env.DEST_OS:
+			conf.env.DEST_OS=''
+		for i in MACRO_TO_DESTOS:
+			if isD(i):
+				conf.env.DEST_OS=MACRO_TO_DESTOS[i]
+				break
+		else:
+			if isD('__APPLE__')and isD('__MACH__'):
+				conf.env.DEST_OS='darwin'
+			elif isD('__unix__'):
+				conf.env.DEST_OS='generic'
+		if isD('__ELF__'):
+			conf.env.DEST_BINFMT='elf'
+		elif isD('__WINNT__')or isD('__CYGWIN__'):
+			conf.env.DEST_BINFMT='pe'
+			conf.env.LIBDIR=conf.env['PREFIX']+'/bin'
+		elif isD('__APPLE__'):
+			conf.env.DEST_BINFMT='mac-o'
+		if not conf.env.DEST_BINFMT:
+			conf.env.DEST_BINFMT=Utils.destos_to_binfmt(conf.env.DEST_OS)
+		for i in MACRO_TO_DEST_CPU:
+			if isD(i):
+				conf.env.DEST_CPU=MACRO_TO_DEST_CPU[i]
+				break
+		Logs.debug('ccroot: dest platform: '+' '.join([conf.env[x]or'?'for x in('DEST_OS','DEST_BINFMT','DEST_CPU')]))
+		if icc:
+			ver=k['__INTEL_COMPILER']
+			conf.env['CC_VERSION']=(ver[:-2],ver[-2],ver[-1])
+		else:
+			if isD('__clang__'):
+				conf.env['CC_VERSION']=(k['__clang_major__'],k['__clang_minor__'],k['__clang_patchlevel__'])
+			else:
+				conf.env['CC_VERSION']=(k['__GNUC__'],k['__GNUC_MINOR__'],k['__GNUC_PATCHLEVEL__'])
+	return k
+@conf
+def get_xlc_version(conf,cc):
+	cmd=cc+['-qversion']
+	try:
+		out,err=conf.cmd_and_log(cmd,output=0)
+	except Errors.WafError:
+		conf.fatal('Could not find xlc %r'%cmd)
+	for v in(r"IBM XL C/C\+\+.* V(?P<major>\d*)\.(?P<minor>\d*)",):
+		version_re=re.compile(v,re.I).search
+		match=version_re(out or err)
+		if match:
+			k=match.groupdict()
+			conf.env['CC_VERSION']=(k['major'],k['minor'])
+			break
+	else:
+		conf.fatal('Could not determine the XLC version.')
+@conf
+def add_as_needed(self):
+	if self.env.DEST_BINFMT=='elf'and'gcc'in(self.env.CXX_NAME,self.env.CC_NAME):
+		self.env.append_unique('LINKFLAGS','--as-needed')
+class cfgtask(Task.TaskBase):
+	def display(self):
+		return''
+	def runnable_status(self):
+		return Task.RUN_ME
+	def uid(self):
+		return Utils.SIG_NIL
+	def run(self):
+		conf=self.conf
+		bld=Build.BuildContext(top_dir=conf.srcnode.abspath(),out_dir=conf.bldnode.abspath())
+		bld.env=conf.env
+		bld.init_dirs()
+		bld.in_msg=1
+		bld.logger=self.logger
+		try:
+			bld.check(**self.args)
+		except Exception:
+			return 1
+@conf
+def multicheck(self,*k,**kw):
+	self.start_msg(kw.get('msg','Executing %d configuration tests'%len(k)))
+	class par(object):
+		def __init__(self):
+			self.keep=False
+			self.cache_global=Options.cache_global
+			self.nocache=Options.options.nocache
+			self.returned_tasks=[]
+			self.task_sigs={}
+		def total(self):
+			return len(tasks)
+		def to_log(self,*k,**kw):
+			return
+	bld=par()
+	tasks=[]
+	for dct in k:
+		x=cfgtask(bld=bld)
+		tasks.append(x)
+		x.args=dct
+		x.bld=bld
+		x.conf=self
+		x.args=dct
+		x.logger=Logs.make_mem_logger(str(id(x)),self.logger)
+	def it():
+		yield tasks
+		while 1:
+			yield[]
+	p=Runner.Parallel(bld,Options.options.jobs)
+	p.biter=it()
+	p.start()
+	for x in tasks:
+		x.logger.memhandler.flush()
+	for x in tasks:
+		if x.hasrun!=Task.SUCCESS:
+			self.end_msg(kw.get('errmsg','no'),color='YELLOW')
+			self.fatal(kw.get('fatalmsg',None)or'One of the tests has failed, see the config.log for more information')
+	self.end_msg('ok')
Index: waflib/Tools/c_osx.py
===================================================================
--- waflib/Tools/c_osx.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/c_osx.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,120 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import os,shutil,sys,platform
+from waflib import TaskGen,Task,Build,Options,Utils,Errors
+from waflib.TaskGen import taskgen_method,feature,after_method,before_method
+app_info='''
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd">
+<plist version="0.9">
+<dict>
+	<key>CFBundlePackageType</key>
+	<string>APPL</string>
+	<key>CFBundleGetInfoString</key>
+	<string>Created by Waf</string>
+	<key>CFBundleSignature</key>
+	<string>????</string>
+	<key>NOTE</key>
+	<string>THIS IS A GENERATED FILE, DO NOT MODIFY</string>
+	<key>CFBundleExecutable</key>
+	<string>%s</string>
+</dict>
+</plist>
+'''
+@feature('c','cxx')
+def set_macosx_deployment_target(self):
+	if self.env['MACOSX_DEPLOYMENT_TARGET']:
+		os.environ['MACOSX_DEPLOYMENT_TARGET']=self.env['MACOSX_DEPLOYMENT_TARGET']
+	elif'MACOSX_DEPLOYMENT_TARGET'not in os.environ:
+		if Utils.unversioned_sys_platform()=='darwin':
+			os.environ['MACOSX_DEPLOYMENT_TARGET']='.'.join(platform.mac_ver()[0].split('.')[:2])
+@taskgen_method
+def create_bundle_dirs(self,name,out):
+	bld=self.bld
+	dir=out.parent.find_or_declare(name)
+	dir.mkdir()
+	macos=dir.find_or_declare(['Contents','MacOS'])
+	macos.mkdir()
+	return dir
+def bundle_name_for_output(out):
+	name=out.name
+	k=name.rfind('.')
+	if k>=0:
+		name=name[:k]+'.app'
+	else:
+		name=name+'.app'
+	return name
+@feature('cprogram','cxxprogram')
+@after_method('apply_link')
+def create_task_macapp(self):
+	if self.env['MACAPP']or getattr(self,'mac_app',False):
+		out=self.link_task.outputs[0]
+		name=bundle_name_for_output(out)
+		dir=self.create_bundle_dirs(name,out)
+		n1=dir.find_or_declare(['Contents','MacOS',out.name])
+		self.apptask=self.create_task('macapp',self.link_task.outputs,n1)
+		inst_to=getattr(self,'install_path','/Applications')+'/%s/Contents/MacOS/'%name
+		self.bld.install_files(inst_to,n1,chmod=Utils.O755)
+		if getattr(self,'mac_resources',None):
+			res_dir=n1.parent.parent.make_node('Resources')
+			inst_to=getattr(self,'install_path','/Applications')+'/%s/Resources'%name
+			for x in self.to_list(self.mac_resources):
+				node=self.path.find_node(x)
+				if not node:
+					raise Errors.WafError('Missing mac_resource %r in %r'%(x,self))
+				parent=node.parent
+				if os.path.isdir(node.abspath()):
+					nodes=node.ant_glob('**')
+				else:
+					nodes=[node]
+				for node in nodes:
+					rel=node.path_from(parent)
+					tsk=self.create_task('macapp',node,res_dir.make_node(rel))
+					self.bld.install_as(inst_to+'/%s'%rel,node)
+		if getattr(self.bld,'is_install',None):
+			self.install_task.hasrun=Task.SKIP_ME
+@feature('cprogram','cxxprogram')
+@after_method('apply_link')
+def create_task_macplist(self):
+	if self.env['MACAPP']or getattr(self,'mac_app',False):
+		out=self.link_task.outputs[0]
+		name=bundle_name_for_output(out)
+		dir=self.create_bundle_dirs(name,out)
+		n1=dir.find_or_declare(['Contents','Info.plist'])
+		self.plisttask=plisttask=self.create_task('macplist',[],n1)
+		if getattr(self,'mac_plist',False):
+			node=self.path.find_resource(self.mac_plist)
+			if node:
+				plisttask.inputs.append(node)
+			else:
+				plisttask.code=self.mac_plist
+		else:
+			plisttask.code=app_info%self.link_task.outputs[0].name
+		inst_to=getattr(self,'install_path','/Applications')+'/%s/Contents/'%name
+		self.bld.install_files(inst_to,n1)
+@feature('cshlib','cxxshlib')
+@before_method('apply_link','propagate_uselib_vars')
+def apply_bundle(self):
+	if self.env['MACBUNDLE']or getattr(self,'mac_bundle',False):
+		self.env['LINKFLAGS_cshlib']=self.env['LINKFLAGS_cxxshlib']=[]
+		self.env['cshlib_PATTERN']=self.env['cxxshlib_PATTERN']=self.env['macbundle_PATTERN']
+		use=self.use=self.to_list(getattr(self,'use',[]))
+		if not'MACBUNDLE'in use:
+			use.append('MACBUNDLE')
+app_dirs=['Contents','Contents/MacOS','Contents/Resources']
+class macapp(Task.Task):
+	color='PINK'
+	def run(self):
+		self.outputs[0].parent.mkdir()
+		shutil.copy2(self.inputs[0].srcpath(),self.outputs[0].abspath())
+class macplist(Task.Task):
+	color='PINK'
+	ext_in=['.bin']
+	def run(self):
+		if getattr(self,'code',None):
+			txt=self.code
+		else:
+			txt=self.inputs[0].read()
+		self.outputs[0].write(txt)
Index: waflib/Tools/c_preproc.py
===================================================================
--- waflib/Tools/c_preproc.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/c_preproc.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,604 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import re,string,traceback
+from waflib import Logs,Utils,Errors
+from waflib.Logs import debug,error
+class PreprocError(Errors.WafError):
+	pass
+POPFILE='-'
+recursion_limit=150
+go_absolute=False
+standard_includes=['/usr/include']
+if Utils.is_win32:
+	standard_includes=[]
+use_trigraphs=0
+strict_quotes=0
+g_optrans={'not':'!','and':'&&','bitand':'&','and_eq':'&=','or':'||','bitor':'|','or_eq':'|=','xor':'^','xor_eq':'^=','compl':'~',}
+re_lines=re.compile('^[ \t]*(#|%:)[ \t]*(ifdef|ifndef|if|else|elif|endif|include|import|define|undef|pragma)[ \t]*(.*)\r*$',re.IGNORECASE|re.MULTILINE)
+re_mac=re.compile("^[a-zA-Z_]\w*")
+re_fun=re.compile('^[a-zA-Z_][a-zA-Z0-9_]*[(]')
+re_pragma_once=re.compile('^\s*once\s*',re.IGNORECASE)
+re_nl=re.compile('\\\\\r*\n',re.MULTILINE)
+re_cpp=re.compile(r"""(/\*[^*]*\*+([^/*][^*]*\*+)*/)|//[^\n]*|("(\\.|[^"\\])*"|'(\\.|[^'\\])*'|.[^/"'\\]*)""",re.MULTILINE)
+trig_def=[('??'+a,b)for a,b in zip("=-/!'()<>",r'#~\|^[]{}')]
+chr_esc={'0':0,'a':7,'b':8,'t':9,'n':10,'f':11,'v':12,'r':13,'\\':92,"'":39}
+NUM='i'
+OP='O'
+IDENT='T'
+STR='s'
+CHAR='c'
+tok_types=[NUM,STR,IDENT,OP]
+exp_types=[r"""0[xX](?P<hex>[a-fA-F0-9]+)(?P<qual1>[uUlL]*)|L*?'(?P<char>(\\.|[^\\'])+)'|(?P<n1>\d+)[Ee](?P<exp0>[+-]*?\d+)(?P<float0>[fFlL]*)|(?P<n2>\d*\.\d+)([Ee](?P<exp1>[+-]*?\d+))?(?P<float1>[fFlL]*)|(?P<n4>\d+\.\d*)([Ee](?P<exp2>[+-]*?\d+))?(?P<float2>[fFlL]*)|(?P<oct>0*)(?P<n0>\d+)(?P<qual2>[uUlL]*)""",r'L?"([^"\\]|\\.)*"',r'[a-zA-Z_]\w*',r'%:%:|<<=|>>=|\.\.\.|<<|<%|<:|<=|>>|>=|\+\+|\+=|--|->|-=|\*=|/=|%:|%=|%>|==|&&|&=|\|\||\|=|\^=|:>|!=|##|[\(\)\{\}\[\]<>\?\|\^\*\+&=:!#;,%/\-\?\~\.]',]
+re_clexer=re.compile('|'.join(["(?P<%s>%s)"%(name,part)for name,part in zip(tok_types,exp_types)]),re.M)
+accepted='a'
+ignored='i'
+undefined='u'
+skipped='s'
+def repl(m):
+	s=m.group(1)
+	if s:
+		return' '
+	return m.group(3)or''
+def filter_comments(filename):
+	code=Utils.readf(filename)
+	if use_trigraphs:
+		for(a,b)in trig_def:code=code.split(a).join(b)
+	code=re_nl.sub('',code)
+	code=re_cpp.sub(repl,code)
+	return[(m.group(2),m.group(3))for m in re.finditer(re_lines,code)]
+prec={}
+ops=['* / %','+ -','<< >>','< <= >= >','== !=','& | ^','&& ||',',']
+for x in range(len(ops)):
+	syms=ops[x]
+	for u in syms.split():
+		prec[u]=x
+def trimquotes(s):
+	if not s:return''
+	s=s.rstrip()
+	if s[0]=="'"and s[-1]=="'":return s[1:-1]
+	return s
+def reduce_nums(val_1,val_2,val_op):
+	try:a=0+val_1
+	except TypeError:a=int(val_1)
+	try:b=0+val_2
+	except TypeError:b=int(val_2)
+	d=val_op
+	if d=='%':c=a%b
+	elif d=='+':c=a+b
+	elif d=='-':c=a-b
+	elif d=='*':c=a*b
+	elif d=='/':c=a/b
+	elif d=='^':c=a^b
+	elif d=='|':c=a|b
+	elif d=='||':c=int(a or b)
+	elif d=='&':c=a&b
+	elif d=='&&':c=int(a and b)
+	elif d=='==':c=int(a==b)
+	elif d=='!=':c=int(a!=b)
+	elif d=='<=':c=int(a<=b)
+	elif d=='<':c=int(a<b)
+	elif d=='>':c=int(a>b)
+	elif d=='>=':c=int(a>=b)
+	elif d=='^':c=int(a^b)
+	elif d=='<<':c=a<<b
+	elif d=='>>':c=a>>b
+	else:c=0
+	return c
+def get_num(lst):
+	if not lst:raise PreprocError("empty list for get_num")
+	(p,v)=lst[0]
+	if p==OP:
+		if v=='(':
+			count_par=1
+			i=1
+			while i<len(lst):
+				(p,v)=lst[i]
+				if p==OP:
+					if v==')':
+						count_par-=1
+						if count_par==0:
+							break
+					elif v=='(':
+						count_par+=1
+				i+=1
+			else:
+				raise PreprocError("rparen expected %r"%lst)
+			(num,_)=get_term(lst[1:i])
+			return(num,lst[i+1:])
+		elif v=='+':
+			return get_num(lst[1:])
+		elif v=='-':
+			num,lst=get_num(lst[1:])
+			return(reduce_nums('-1',num,'*'),lst)
+		elif v=='!':
+			num,lst=get_num(lst[1:])
+			return(int(not int(num)),lst)
+		elif v=='~':
+			num,lst=get_num(lst[1:])
+			return(~int(num),lst)
+		else:
+			raise PreprocError("Invalid op token %r for get_num"%lst)
+	elif p==NUM:
+		return v,lst[1:]
+	elif p==IDENT:
+		return 0,lst[1:]
+	else:
+		raise PreprocError("Invalid token %r for get_num"%lst)
+def get_term(lst):
+	if not lst:raise PreprocError("empty list for get_term")
+	num,lst=get_num(lst)
+	if not lst:
+		return(num,[])
+	(p,v)=lst[0]
+	if p==OP:
+		if v==',':
+			return get_term(lst[1:])
+		elif v=='?':
+			count_par=0
+			i=1
+			while i<len(lst):
+				(p,v)=lst[i]
+				if p==OP:
+					if v==')':
+						count_par-=1
+					elif v=='(':
+						count_par+=1
+					elif v==':':
+						if count_par==0:
+							break
+				i+=1
+			else:
+				raise PreprocError("rparen expected %r"%lst)
+			if int(num):
+				return get_term(lst[1:i])
+			else:
+				return get_term(lst[i+1:])
+		else:
+			num2,lst=get_num(lst[1:])
+			if not lst:
+				num2=reduce_nums(num,num2,v)
+				return get_term([(NUM,num2)]+lst)
+			p2,v2=lst[0]
+			if p2!=OP:
+				raise PreprocError("op expected %r"%lst)
+			if prec[v2]>=prec[v]:
+				num2=reduce_nums(num,num2,v)
+				return get_term([(NUM,num2)]+lst)
+			else:
+				num3,lst=get_num(lst[1:])
+				num3=reduce_nums(num2,num3,v2)
+				return get_term([(NUM,num),(p,v),(NUM,num3)]+lst)
+	raise PreprocError("cannot reduce %r"%lst)
+def reduce_eval(lst):
+	num,lst=get_term(lst)
+	return(NUM,num)
+def stringize(lst):
+	lst=[str(v2)for(p2,v2)in lst]
+	return"".join(lst)
+def paste_tokens(t1,t2):
+	p1=None
+	if t1[0]==OP and t2[0]==OP:
+		p1=OP
+	elif t1[0]==IDENT and(t2[0]==IDENT or t2[0]==NUM):
+		p1=IDENT
+	elif t1[0]==NUM and t2[0]==NUM:
+		p1=NUM
+	if not p1:
+		raise PreprocError('tokens do not make a valid paste %r and %r'%(t1,t2))
+	return(p1,t1[1]+t2[1])
+def reduce_tokens(lst,defs,ban=[]):
+	i=0
+	while i<len(lst):
+		(p,v)=lst[i]
+		if p==IDENT and v=="defined":
+			del lst[i]
+			if i<len(lst):
+				(p2,v2)=lst[i]
+				if p2==IDENT:
+					if v2 in defs:
+						lst[i]=(NUM,1)
+					else:
+						lst[i]=(NUM,0)
+				elif p2==OP and v2=='(':
+					del lst[i]
+					(p2,v2)=lst[i]
+					del lst[i]
+					if v2 in defs:
+						lst[i]=(NUM,1)
+					else:
+						lst[i]=(NUM,0)
+				else:
+					raise PreprocError("Invalid define expression %r"%lst)
+		elif p==IDENT and v in defs:
+			if isinstance(defs[v],str):
+				a,b=extract_macro(defs[v])
+				defs[v]=b
+			macro_def=defs[v]
+			to_add=macro_def[1]
+			if isinstance(macro_def[0],list):
+				del lst[i]
+				accu=to_add[:]
+				reduce_tokens(accu,defs,ban+[v])
+				for x in range(len(accu)):
+					lst.insert(i,accu[x])
+					i+=1
+			else:
+				args=[]
+				del lst[i]
+				if i>=len(lst):
+					raise PreprocError("expected '(' after %r (got nothing)"%v)
+				(p2,v2)=lst[i]
+				if p2!=OP or v2!='(':
+					raise PreprocError("expected '(' after %r"%v)
+				del lst[i]
+				one_param=[]
+				count_paren=0
+				while i<len(lst):
+					p2,v2=lst[i]
+					del lst[i]
+					if p2==OP and count_paren==0:
+						if v2=='(':
+							one_param.append((p2,v2))
+							count_paren+=1
+						elif v2==')':
+							if one_param:args.append(one_param)
+							break
+						elif v2==',':
+							if not one_param:raise PreprocError("empty param in funcall %s"%p)
+							args.append(one_param)
+							one_param=[]
+						else:
+							one_param.append((p2,v2))
+					else:
+						one_param.append((p2,v2))
+						if v2=='(':count_paren+=1
+						elif v2==')':count_paren-=1
+				else:
+					raise PreprocError('malformed macro')
+				accu=[]
+				arg_table=macro_def[0]
+				j=0
+				while j<len(to_add):
+					(p2,v2)=to_add[j]
+					if p2==OP and v2=='#':
+						if j+1<len(to_add)and to_add[j+1][0]==IDENT and to_add[j+1][1]in arg_table:
+							toks=args[arg_table[to_add[j+1][1]]]
+							accu.append((STR,stringize(toks)))
+							j+=1
+						else:
+							accu.append((p2,v2))
+					elif p2==OP and v2=='##':
+						if accu and j+1<len(to_add):
+							t1=accu[-1]
+							if to_add[j+1][0]==IDENT and to_add[j+1][1]in arg_table:
+								toks=args[arg_table[to_add[j+1][1]]]
+								if toks:
+									accu[-1]=paste_tokens(t1,toks[0])
+									accu.extend(toks[1:])
+								else:
+									accu.append((p2,v2))
+									accu.extend(toks)
+							elif to_add[j+1][0]==IDENT and to_add[j+1][1]=='__VA_ARGS__':
+								va_toks=[]
+								st=len(macro_def[0])
+								pt=len(args)
+								for x in args[pt-st+1:]:
+									va_toks.extend(x)
+									va_toks.append((OP,','))
+								if va_toks:va_toks.pop()
+								if len(accu)>1:
+									(p3,v3)=accu[-1]
+									(p4,v4)=accu[-2]
+									if v3=='##':
+										accu.pop()
+										if v4==','and pt<st:
+											accu.pop()
+								accu+=va_toks
+							else:
+								accu[-1]=paste_tokens(t1,to_add[j+1])
+							j+=1
+						else:
+							accu.append((p2,v2))
+					elif p2==IDENT and v2 in arg_table:
+						toks=args[arg_table[v2]]
+						reduce_tokens(toks,defs,ban+[v])
+						accu.extend(toks)
+					else:
+						accu.append((p2,v2))
+					j+=1
+				reduce_tokens(accu,defs,ban+[v])
+				for x in range(len(accu)-1,-1,-1):
+					lst.insert(i,accu[x])
+		i+=1
+def eval_macro(lst,defs):
+	reduce_tokens(lst,defs,[])
+	if not lst:raise PreprocError("missing tokens to evaluate")
+	(p,v)=reduce_eval(lst)
+	return int(v)!=0
+def extract_macro(txt):
+	t=tokenize(txt)
+	if re_fun.search(txt):
+		p,name=t[0]
+		p,v=t[1]
+		if p!=OP:raise PreprocError("expected open parenthesis")
+		i=1
+		pindex=0
+		params={}
+		prev='('
+		while 1:
+			i+=1
+			p,v=t[i]
+			if prev=='(':
+				if p==IDENT:
+					params[v]=pindex
+					pindex+=1
+					prev=p
+				elif p==OP and v==')':
+					break
+				else:
+					raise PreprocError("unexpected token (3)")
+			elif prev==IDENT:
+				if p==OP and v==',':
+					prev=v
+				elif p==OP and v==')':
+					break
+				else:
+					raise PreprocError("comma or ... expected")
+			elif prev==',':
+				if p==IDENT:
+					params[v]=pindex
+					pindex+=1
+					prev=p
+				elif p==OP and v=='...':
+					raise PreprocError("not implemented (1)")
+				else:
+					raise PreprocError("comma or ... expected (2)")
+			elif prev=='...':
+				raise PreprocError("not implemented (2)")
+			else:
+				raise PreprocError("unexpected else")
+		return(name,[params,t[i+1:]])
+	else:
+		(p,v)=t[0]
+		return(v,[[],t[1:]])
+re_include=re.compile('^\s*(<(?P<a>.*)>|"(?P<b>.*)")')
+def extract_include(txt,defs):
+	m=re_include.search(txt)
+	if m:
+		if m.group('a'):return'<',m.group('a')
+		if m.group('b'):return'"',m.group('b')
+	toks=tokenize(txt)
+	reduce_tokens(toks,defs,['waf_include'])
+	if not toks:
+		raise PreprocError("could not parse include %s"%txt)
+	if len(toks)==1:
+		if toks[0][0]==STR:
+			return'"',toks[0][1]
+	else:
+		if toks[0][1]=='<'and toks[-1][1]=='>':
+			return stringize(toks).lstrip('<').rstrip('>')
+	raise PreprocError("could not parse include %s."%txt)
+def parse_char(txt):
+	if not txt:raise PreprocError("attempted to parse a null char")
+	if txt[0]!='\\':
+		return ord(txt)
+	c=txt[1]
+	if c=='x':
+		if len(txt)==4 and txt[3]in string.hexdigits:return int(txt[2:],16)
+		return int(txt[2:],16)
+	elif c.isdigit():
+		if c=='0'and len(txt)==2:return 0
+		for i in 3,2,1:
+			if len(txt)>i and txt[1:1+i].isdigit():
+				return(1+i,int(txt[1:1+i],8))
+	else:
+		try:return chr_esc[c]
+		except KeyError:raise PreprocError("could not parse char literal '%s'"%txt)
+def tokenize(s):
+	return tokenize_private(s)[:]
+@Utils.run_once
+def tokenize_private(s):
+	ret=[]
+	for match in re_clexer.finditer(s):
+		m=match.group
+		for name in tok_types:
+			v=m(name)
+			if v:
+				if name==IDENT:
+					try:v=g_optrans[v];name=OP
+					except KeyError:
+						if v.lower()=="true":
+							v=1
+							name=NUM
+						elif v.lower()=="false":
+							v=0
+							name=NUM
+				elif name==NUM:
+					if m('oct'):v=int(v,8)
+					elif m('hex'):v=int(m('hex'),16)
+					elif m('n0'):v=m('n0')
+					else:
+						v=m('char')
+						if v:v=parse_char(v)
+						else:v=m('n2')or m('n4')
+				elif name==OP:
+					if v=='%:':v='#'
+					elif v=='%:%:':v='##'
+				elif name==STR:
+					v=v[1:-1]
+				ret.append((name,v))
+				break
+	return ret
+@Utils.run_once
+def define_name(line):
+	return re_mac.match(line).group(0)
+class c_parser(object):
+	def __init__(self,nodepaths=None,defines=None):
+		self.lines=[]
+		if defines is None:
+			self.defs={}
+		else:
+			self.defs=dict(defines)
+		self.state=[]
+		self.count_files=0
+		self.currentnode_stack=[]
+		self.nodepaths=nodepaths or[]
+		self.nodes=[]
+		self.names=[]
+		self.curfile=''
+		self.ban_includes=set([])
+	def cached_find_resource(self,node,filename):
+		try:
+			nd=node.ctx.cache_nd
+		except AttributeError:
+			nd=node.ctx.cache_nd={}
+		tup=(node,filename)
+		try:
+			return nd[tup]
+		except KeyError:
+			ret=node.find_resource(filename)
+			if ret:
+				if getattr(ret,'children',None):
+					ret=None
+				elif ret.is_child_of(node.ctx.bldnode):
+					tmp=node.ctx.srcnode.search_node(ret.path_from(node.ctx.bldnode))
+					if tmp and getattr(tmp,'children',None):
+						ret=None
+			nd[tup]=ret
+			return ret
+	def tryfind(self,filename):
+		self.curfile=filename
+		found=self.cached_find_resource(self.currentnode_stack[-1],filename)
+		for n in self.nodepaths:
+			if found:
+				break
+			found=self.cached_find_resource(n,filename)
+		if found:
+			self.nodes.append(found)
+			if filename[-4:]!='.moc':
+				self.addlines(found)
+		else:
+			if not filename in self.names:
+				self.names.append(filename)
+		return found
+	def addlines(self,node):
+		self.currentnode_stack.append(node.parent)
+		filepath=node.abspath()
+		self.count_files+=1
+		if self.count_files>recursion_limit:
+			raise PreprocError("recursion limit exceeded")
+		pc=self.parse_cache
+		debug('preproc: reading file %r',filepath)
+		try:
+			lns=pc[filepath]
+		except KeyError:
+			pass
+		else:
+			self.lines.extend(lns)
+			return
+		try:
+			lines=filter_comments(filepath)
+			lines.append((POPFILE,''))
+			lines.reverse()
+			pc[filepath]=lines
+			self.lines.extend(lines)
+		except IOError:
+			raise PreprocError("could not read the file %s"%filepath)
+		except Exception:
+			if Logs.verbose>0:
+				error("parsing %s failed"%filepath)
+				traceback.print_exc()
+	def start(self,node,env):
+		debug('preproc: scanning %s (in %s)',node.name,node.parent.name)
+		bld=node.ctx
+		try:
+			self.parse_cache=bld.parse_cache
+		except AttributeError:
+			bld.parse_cache={}
+			self.parse_cache=bld.parse_cache
+		self.addlines(node)
+		if env['DEFINES']:
+			try:
+				lst=['%s %s'%(x[0],trimquotes('='.join(x[1:])))for x in[y.split('=')for y in env['DEFINES']]]
+				lst.reverse()
+				self.lines.extend([('define',x)for x in lst])
+			except AttributeError:
+				pass
+		while self.lines:
+			(token,line)=self.lines.pop()
+			if token==POPFILE:
+				self.count_files-=1
+				self.currentnode_stack.pop()
+				continue
+			try:
+				ve=Logs.verbose
+				if ve:debug('preproc: line is %s - %s state is %s',token,line,self.state)
+				state=self.state
+				if token[:2]=='if':
+					state.append(undefined)
+				elif token=='endif':
+					state.pop()
+				if token[0]!='e':
+					if skipped in self.state or ignored in self.state:
+						continue
+				if token=='if':
+					ret=eval_macro(tokenize(line),self.defs)
+					if ret:state[-1]=accepted
+					else:state[-1]=ignored
+				elif token=='ifdef':
+					m=re_mac.match(line)
+					if m and m.group(0)in self.defs:state[-1]=accepted
+					else:state[-1]=ignored
+				elif token=='ifndef':
+					m=re_mac.match(line)
+					if m and m.group(0)in self.defs:state[-1]=ignored
+					else:state[-1]=accepted
+				elif token=='include'or token=='import':
+					(kind,inc)=extract_include(line,self.defs)
+					if inc in self.ban_includes:
+						continue
+					if token=='import':self.ban_includes.add(inc)
+					if ve:debug('preproc: include found %s    (%s) ',inc,kind)
+					if kind=='"'or not strict_quotes:
+						self.tryfind(inc)
+				elif token=='elif':
+					if state[-1]==accepted:
+						state[-1]=skipped
+					elif state[-1]==ignored:
+						if eval_macro(tokenize(line),self.defs):
+							state[-1]=accepted
+				elif token=='else':
+					if state[-1]==accepted:state[-1]=skipped
+					elif state[-1]==ignored:state[-1]=accepted
+				elif token=='define':
+					try:
+						self.defs[define_name(line)]=line
+					except Exception:
+						raise PreprocError("Invalid define line %s"%line)
+				elif token=='undef':
+					m=re_mac.match(line)
+					if m and m.group(0)in self.defs:
+						self.defs.__delitem__(m.group(0))
+				elif token=='pragma':
+					if re_pragma_once.match(line.lower()):
+						self.ban_includes.add(self.curfile)
+			except Exception ,e:
+				if Logs.verbose:
+					debug('preproc: line parsing failed (%s): %s %s',e,line,Utils.ex_stack())
+def scan(task):
+	global go_absolute
+	try:
+		incn=task.generator.includes_nodes
+	except AttributeError:
+		raise Errors.WafError('%r is missing a feature such as "c", "cxx" or "includes": '%task.generator)
+	if go_absolute:
+		nodepaths=incn+[task.generator.bld.root.find_dir(x)for x in standard_includes]
+	else:
+		nodepaths=[x for x in incn if x.is_child_of(x.ctx.srcnode)or x.is_child_of(x.ctx.bldnode)]
+	tmp=c_parser(nodepaths)
+	tmp.start(task.inputs[0],task.env)
+	if Logs.verbose:
+		debug('deps: deps for %r: %r; unresolved %r'%(task.inputs,tmp.nodes,tmp.names))
+	return(tmp.nodes,tmp.names)
Index: waflib/Tools/c_tests.py
===================================================================
--- waflib/Tools/c_tests.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/c_tests.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,153 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+from waflib import Task
+from waflib.Configure import conf
+from waflib.TaskGen import feature,before_method,after_method
+import sys
+LIB_CODE='''
+#ifdef _MSC_VER
+#define testEXPORT __declspec(dllexport)
+#else
+#define testEXPORT
+#endif
+testEXPORT int lib_func(void) { return 9; }
+'''
+MAIN_CODE='''
+#ifdef _MSC_VER
+#define testEXPORT __declspec(dllimport)
+#else
+#define testEXPORT
+#endif
+testEXPORT int lib_func(void);
+int main(int argc, char **argv) {
+	(void)argc; (void)argv;
+	return !(lib_func() == 9);
+}
+'''
+@feature('link_lib_test')
+@before_method('process_source')
+def link_lib_test_fun(self):
+	def write_test_file(task):
+		task.outputs[0].write(task.generator.code)
+	rpath=[]
+	if getattr(self,'add_rpath',False):
+		rpath=[self.bld.path.get_bld().abspath()]
+	mode=self.mode
+	m='%s %s'%(mode,mode)
+	ex=self.test_exec and'test_exec'or''
+	bld=self.bld
+	bld(rule=write_test_file,target='test.'+mode,code=LIB_CODE)
+	bld(rule=write_test_file,target='main.'+mode,code=MAIN_CODE)
+	bld(features='%sshlib'%m,source='test.'+mode,target='test')
+	bld(features='%sprogram %s'%(m,ex),source='main.'+mode,target='app',use='test',rpath=rpath)
+@conf
+def check_library(self,mode=None,test_exec=True):
+	if not mode:
+		mode='c'
+		if self.env.CXX:
+			mode='cxx'
+	self.check(compile_filename=[],features='link_lib_test',msg='Checking for libraries',mode=mode,test_exec=test_exec,)
+INLINE_CODE='''
+typedef int foo_t;
+static %s foo_t static_foo () {return 0; }
+%s foo_t foo () {
+	return 0;
+}
+'''
+INLINE_VALUES=['inline','__inline__','__inline']
+@conf
+def check_inline(self,**kw):
+	self.start_msg('Checking for inline')
+	if not'define_name'in kw:
+		kw['define_name']='INLINE_MACRO'
+	if not'features'in kw:
+		if self.env.CXX:
+			kw['features']=['cxx']
+		else:
+			kw['features']=['c']
+	for x in INLINE_VALUES:
+		kw['fragment']=INLINE_CODE%(x,x)
+		try:
+			self.check(**kw)
+		except self.errors.ConfigurationError:
+			continue
+		else:
+			self.end_msg(x)
+			if x!='inline':
+				self.define('inline',x,quote=False)
+			return x
+	self.fatal('could not use inline functions')
+LARGE_FRAGMENT='''#include <unistd.h>
+int main(int argc, char **argv) {
+	(void)argc; (void)argv;
+	return !(sizeof(off_t) >= 8);
+}
+'''
+@conf
+def check_large_file(self,**kw):
+	if not'define_name'in kw:
+		kw['define_name']='HAVE_LARGEFILE'
+	if not'execute'in kw:
+		kw['execute']=True
+	if not'features'in kw:
+		if self.env.CXX:
+			kw['features']=['cxx','cxxprogram']
+		else:
+			kw['features']=['c','cprogram']
+	kw['fragment']=LARGE_FRAGMENT
+	kw['msg']='Checking for large file support'
+	ret=True
+	try:
+		if self.env.DEST_BINFMT!='pe':
+			ret=self.check(**kw)
+	except self.errors.ConfigurationError:
+		pass
+	else:
+		if ret:
+			return True
+	kw['msg']='Checking for -D_FILE_OFFSET_BITS=64'
+	kw['defines']=['_FILE_OFFSET_BITS=64']
+	try:
+		ret=self.check(**kw)
+	except self.errors.ConfigurationError:
+		pass
+	else:
+		self.define('_FILE_OFFSET_BITS',64)
+		return ret
+	self.fatal('There is no support for large files')
+ENDIAN_FRAGMENT='''
+short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
+short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
+int use_ascii (int i) {
+	return ascii_mm[i] + ascii_ii[i];
+}
+short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
+short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
+int use_ebcdic (int i) {
+	return ebcdic_mm[i] + ebcdic_ii[i];
+}
+extern int foo;
+'''
+class grep_for_endianness(Task.Task):
+	color='PINK'
+	def run(self):
+		txt=self.inputs[0].read(flags='rb').decode('iso8859-1')
+		if txt.find('LiTTleEnDian')>-1:
+			self.generator.tmp.append('little')
+		elif txt.find('BIGenDianSyS')>-1:
+			self.generator.tmp.append('big')
+		else:
+			return-1
+@feature('grep_for_endianness')
+@after_method('process_source')
+def grep_for_endianness_fun(self):
+	self.create_task('grep_for_endianness',self.compiled_tasks[0].outputs[0])
+@conf
+def check_endianness(self):
+	tmp=[]
+	def check_msg(self):
+		return tmp[0]
+	self.check(fragment=ENDIAN_FRAGMENT,features='c grep_for_endianness',msg="Checking for endianness",define='ENDIANNESS',tmp=tmp,okmsg=check_msg)
+	return tmp[0]
Index: waflib/Tools/ccroot.py
===================================================================
--- waflib/Tools/ccroot.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/ccroot.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,391 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import os
+from waflib import Task,Utils,Node,Errors
+from waflib.TaskGen import after_method,before_method,feature,taskgen_method,extension
+from waflib.Tools import c_aliases,c_preproc,c_config,c_osx,c_tests
+from waflib.Configure import conf
+SYSTEM_LIB_PATHS=['/usr/lib64','/usr/lib','/usr/local/lib64','/usr/local/lib']
+USELIB_VARS=Utils.defaultdict(set)
+USELIB_VARS['c']=set(['INCLUDES','FRAMEWORKPATH','DEFINES','CPPFLAGS','CCDEPS','CFLAGS','ARCH'])
+USELIB_VARS['cxx']=set(['INCLUDES','FRAMEWORKPATH','DEFINES','CPPFLAGS','CXXDEPS','CXXFLAGS','ARCH'])
+USELIB_VARS['d']=set(['INCLUDES','DFLAGS'])
+USELIB_VARS['includes']=set(['INCLUDES','FRAMEWORKPATH','ARCH'])
+USELIB_VARS['cprogram']=USELIB_VARS['cxxprogram']=set(['LIB','STLIB','LIBPATH','STLIBPATH','LINKFLAGS','RPATH','LINKDEPS','FRAMEWORK','FRAMEWORKPATH','ARCH'])
+USELIB_VARS['cshlib']=USELIB_VARS['cxxshlib']=set(['LIB','STLIB','LIBPATH','STLIBPATH','LINKFLAGS','RPATH','LINKDEPS','FRAMEWORK','FRAMEWORKPATH','ARCH'])
+USELIB_VARS['cstlib']=USELIB_VARS['cxxstlib']=set(['ARFLAGS','LINKDEPS'])
+USELIB_VARS['dprogram']=set(['LIB','STLIB','LIBPATH','STLIBPATH','LINKFLAGS','RPATH','LINKDEPS'])
+USELIB_VARS['dshlib']=set(['LIB','STLIB','LIBPATH','STLIBPATH','LINKFLAGS','RPATH','LINKDEPS'])
+USELIB_VARS['dstlib']=set(['ARFLAGS','LINKDEPS'])
+USELIB_VARS['asm']=set(['ASFLAGS'])
+@taskgen_method
+def create_compiled_task(self,name,node):
+	out='%s.%d.o'%(node.name,self.idx)
+	task=self.create_task(name,node,node.parent.find_or_declare(out))
+	try:
+		self.compiled_tasks.append(task)
+	except AttributeError:
+		self.compiled_tasks=[task]
+	return task
+@taskgen_method
+def to_incnodes(self,inlst):
+	lst=[]
+	seen=set([])
+	for x in self.to_list(inlst):
+		if x in seen or not x:
+			continue
+		seen.add(x)
+		if isinstance(x,Node.Node):
+			lst.append(x)
+		else:
+			if os.path.isabs(x):
+				lst.append(self.bld.root.make_node(x)or x)
+			else:
+				if x[0]=='#':
+					p=self.bld.bldnode.make_node(x[1:])
+					v=self.bld.srcnode.make_node(x[1:])
+				else:
+					p=self.path.get_bld().make_node(x)
+					v=self.path.make_node(x)
+				if p.is_child_of(self.bld.bldnode):
+					p.mkdir()
+				lst.append(p)
+				lst.append(v)
+	return lst
+@feature('c','cxx','d','asm','fc','includes')
+@after_method('propagate_uselib_vars','process_source')
+def apply_incpaths(self):
+	lst=self.to_incnodes(self.to_list(getattr(self,'includes',[]))+self.env['INCLUDES'])
+	self.includes_nodes=lst
+	self.env['INCPATHS']=[x.abspath()for x in lst]
+class link_task(Task.Task):
+	color='YELLOW'
+	inst_to=None
+	chmod=Utils.O755
+	def add_target(self,target):
+		if isinstance(target,str):
+			pattern=self.env[self.__class__.__name__+'_PATTERN']
+			if not pattern:
+				pattern='%s'
+			folder,name=os.path.split(target)
+			if self.__class__.__name__.find('shlib')>0:
+				if self.env.DEST_BINFMT=='pe'and getattr(self.generator,'vnum',None):
+					name=name+'-'+self.generator.vnum.split('.')[0]
+			tmp=folder+os.sep+pattern%name
+			target=self.generator.path.find_or_declare(tmp)
+		self.set_outputs(target)
+class stlink_task(link_task):
+	run_str='${AR} ${ARFLAGS} ${AR_TGT_F}${TGT} ${AR_SRC_F}${SRC}'
+def rm_tgt(cls):
+	old=cls.run
+	def wrap(self):
+		try:os.remove(self.outputs[0].abspath())
+		except OSError:pass
+		return old(self)
+	setattr(cls,'run',wrap)
+rm_tgt(stlink_task)
+@feature('c','cxx','d','fc','asm')
+@after_method('process_source')
+def apply_link(self):
+	for x in self.features:
+		if x=='cprogram'and'cxx'in self.features:
+			x='cxxprogram'
+		elif x=='cshlib'and'cxx'in self.features:
+			x='cxxshlib'
+		if x in Task.classes:
+			if issubclass(Task.classes[x],link_task):
+				link=x
+				break
+	else:
+		return
+	objs=[t.outputs[0]for t in getattr(self,'compiled_tasks',[])]
+	self.link_task=self.create_task(link,objs)
+	self.link_task.add_target(self.target)
+	try:
+		inst_to=self.install_path
+	except AttributeError:
+		inst_to=self.link_task.__class__.inst_to
+	if inst_to:
+		self.install_task=self.bld.install_files(inst_to,self.link_task.outputs[:],env=self.env,chmod=self.link_task.chmod)
+@taskgen_method
+def use_rec(self,name,**kw):
+	if name in self.tmp_use_not or name in self.tmp_use_seen:
+		return
+	try:
+		y=self.bld.get_tgen_by_name(name)
+	except Errors.WafError:
+		self.uselib.append(name)
+		self.tmp_use_not.add(name)
+		return
+	self.tmp_use_seen.append(name)
+	y.post()
+	y.tmp_use_objects=objects=kw.get('objects',True)
+	y.tmp_use_stlib=stlib=kw.get('stlib',True)
+	try:
+		link_task=y.link_task
+	except AttributeError:
+		y.tmp_use_var=''
+	else:
+		objects=False
+		if not isinstance(link_task,stlink_task):
+			stlib=False
+			y.tmp_use_var='LIB'
+		else:
+			y.tmp_use_var='STLIB'
+	p=self.tmp_use_prec
+	for x in self.to_list(getattr(y,'use',[])):
+		try:
+			p[x].append(name)
+		except KeyError:
+			p[x]=[name]
+		self.use_rec(x,objects=objects,stlib=stlib)
+@feature('c','cxx','d','use','fc')
+@before_method('apply_incpaths','propagate_uselib_vars')
+@after_method('apply_link','process_source')
+def process_use(self):
+	use_not=self.tmp_use_not=set([])
+	self.tmp_use_seen=[]
+	use_prec=self.tmp_use_prec={}
+	self.uselib=self.to_list(getattr(self,'uselib',[]))
+	self.includes=self.to_list(getattr(self,'includes',[]))
+	names=self.to_list(getattr(self,'use',[]))
+	for x in names:
+		self.use_rec(x)
+	for x in use_not:
+		if x in use_prec:
+			del use_prec[x]
+	out=[]
+	tmp=[]
+	for x in self.tmp_use_seen:
+		for k in use_prec.values():
+			if x in k:
+				break
+		else:
+			tmp.append(x)
+	while tmp:
+		e=tmp.pop()
+		out.append(e)
+		try:
+			nlst=use_prec[e]
+		except KeyError:
+			pass
+		else:
+			del use_prec[e]
+			for x in nlst:
+				for y in use_prec:
+					if x in use_prec[y]:
+						break
+				else:
+					tmp.append(x)
+	if use_prec:
+		raise Errors.WafError('Cycle detected in the use processing %r'%use_prec)
+	out.reverse()
+	link_task=getattr(self,'link_task',None)
+	for x in out:
+		y=self.bld.get_tgen_by_name(x)
+		var=y.tmp_use_var
+		if var and link_task:
+			if var=='LIB'or y.tmp_use_stlib:
+				self.env.append_value(var,[y.target[y.target.rfind(os.sep)+1:]])
+				self.link_task.dep_nodes.extend(y.link_task.outputs)
+				tmp_path=y.link_task.outputs[0].parent.path_from(self.bld.bldnode)
+				self.env.append_value(var+'PATH',[tmp_path])
+		else:
+			if y.tmp_use_objects:
+				self.add_objects_from_tgen(y)
+		if getattr(y,'export_includes',None):
+			self.includes.extend(y.to_incnodes(y.export_includes))
+	for x in names:
+		try:
+			y=self.bld.get_tgen_by_name(x)
+		except Exception:
+			if not self.env['STLIB_'+x]and not x in self.uselib:
+				self.uselib.append(x)
+		else:
+			for k in self.to_list(getattr(y,'uselib',[])):
+				if not self.env['STLIB_'+k]and not k in self.uselib:
+					self.uselib.append(k)
+@taskgen_method
+def accept_node_to_link(self,node):
+	return not node.name.endswith('.pdb')
+@taskgen_method
+def add_objects_from_tgen(self,tg):
+	try:
+		link_task=self.link_task
+	except AttributeError:
+		pass
+	else:
+		for tsk in getattr(tg,'compiled_tasks',[]):
+			for x in tsk.outputs:
+				if self.accept_node_to_link(x):
+					link_task.inputs.append(x)
+@taskgen_method
+def get_uselib_vars(self):
+	_vars=set([])
+	for x in self.features:
+		if x in USELIB_VARS:
+			_vars|=USELIB_VARS[x]
+	return _vars
+@feature('c','cxx','d','fc','javac','cs','uselib','asm')
+@after_method('process_use')
+def propagate_uselib_vars(self):
+	_vars=self.get_uselib_vars()
+	env=self.env
+	for x in _vars:
+		y=x.lower()
+		env.append_unique(x,self.to_list(getattr(self,y,[])))
+	for x in self.features:
+		for var in _vars:
+			compvar='%s_%s'%(var,x)
+			env.append_value(var,env[compvar])
+	for x in self.to_list(getattr(self,'uselib',[])):
+		for v in _vars:
+			env.append_value(v,env[v+'_'+x])
+@feature('cshlib','cxxshlib','fcshlib')
+@after_method('apply_link')
+def apply_implib(self):
+	if not self.env.DEST_BINFMT=='pe':
+		return
+	dll=self.link_task.outputs[0]
+	if isinstance(self.target,Node.Node):
+		name=self.target.name
+	else:
+		name=os.path.split(self.target)[1]
+	implib=self.env['implib_PATTERN']%name
+	implib=dll.parent.find_or_declare(implib)
+	self.env.append_value('LINKFLAGS',self.env['IMPLIB_ST']%implib.bldpath())
+	self.link_task.outputs.append(implib)
+	if getattr(self,'defs',None)and self.env.DEST_BINFMT=='pe':
+		node=self.path.find_resource(self.defs)
+		if not node:
+			raise Errors.WafError('invalid def file %r'%self.defs)
+		if'msvc'in(self.env.CC_NAME,self.env.CXX_NAME):
+			self.env.append_value('LINKFLAGS','/def:%s'%node.path_from(self.bld.bldnode))
+			self.link_task.dep_nodes.append(node)
+		else:
+			self.link_task.inputs.append(node)
+	try:
+		inst_to=self.install_path
+	except AttributeError:
+		inst_to=self.link_task.__class__.inst_to
+	if not inst_to:
+		return
+	self.implib_install_task=self.bld.install_as('${LIBDIR}/%s'%implib.name,implib,self.env)
+@feature('cshlib','cxxshlib','dshlib','fcshlib','vnum')
+@after_method('apply_link','propagate_uselib_vars')
+def apply_vnum(self):
+	if not getattr(self,'vnum','')or os.name!='posix'or self.env.DEST_BINFMT not in('elf','mac-o'):
+		return
+	link=self.link_task
+	nums=self.vnum.split('.')
+	node=link.outputs[0]
+	libname=node.name
+	if libname.endswith('.dylib'):
+		name3=libname.replace('.dylib','.%s.dylib'%self.vnum)
+		name2=libname.replace('.dylib','.%s.dylib'%nums[0])
+	else:
+		name3=libname+'.'+self.vnum
+		name2=libname+'.'+nums[0]
+	if self.env.SONAME_ST:
+		v=self.env.SONAME_ST%name2
+		self.env.append_value('LINKFLAGS',v.split())
+	self.create_task('vnum',node,[node.parent.find_or_declare(name2),node.parent.find_or_declare(name3)])
+	if getattr(self,'install_task',None):
+		self.install_task.hasrun=Task.SKIP_ME
+		bld=self.bld
+		path=self.install_task.dest
+		t1=bld.install_as(path+os.sep+name3,node,env=self.env,chmod=self.link_task.chmod)
+		t2=bld.symlink_as(path+os.sep+name2,name3)
+		t3=bld.symlink_as(path+os.sep+libname,name3)
+		self.vnum_install_task=(t1,t2,t3)
+	if'-dynamiclib'in self.env['LINKFLAGS']:
+		try:
+			inst_to=self.install_path
+		except AttributeError:
+			inst_to=self.link_task.__class__.inst_to
+		if inst_to:
+			p=Utils.subst_vars(inst_to,self.env)
+			path=os.path.join(p,self.link_task.outputs[0].name)
+			self.env.append_value('LINKFLAGS',['-install_name',path])
+class vnum(Task.Task):
+	color='CYAN'
+	quient=True
+	ext_in=['.bin']
+	def run(self):
+		for x in self.outputs:
+			path=x.abspath()
+			try:
+				os.remove(path)
+			except OSError:
+				pass
+			try:
+				os.symlink(self.inputs[0].name,path)
+			except OSError:
+				return 1
+class fake_shlib(link_task):
+	def runnable_status(self):
+		for t in self.run_after:
+			if not t.hasrun:
+				return Task.ASK_LATER
+		for x in self.outputs:
+			x.sig=Utils.h_file(x.abspath())
+		return Task.SKIP_ME
+class fake_stlib(stlink_task):
+	def runnable_status(self):
+		for t in self.run_after:
+			if not t.hasrun:
+				return Task.ASK_LATER
+		for x in self.outputs:
+			x.sig=Utils.h_file(x.abspath())
+		return Task.SKIP_ME
+@conf
+def read_shlib(self,name,paths=[]):
+	return self(name=name,features='fake_lib',lib_paths=paths,lib_type='shlib')
+@conf
+def read_stlib(self,name,paths=[]):
+	return self(name=name,features='fake_lib',lib_paths=paths,lib_type='stlib')
+lib_patterns={'shlib':['lib%s.so','%s.so','lib%s.dylib','lib%s.dll','%s.dll'],'stlib':['lib%s.a','%s.a','lib%s.dll','%s.dll','lib%s.lib','%s.lib'],}
+@feature('fake_lib')
+def process_lib(self):
+	node=None
+	names=[x%self.name for x in lib_patterns[self.lib_type]]
+	for x in self.lib_paths+[self.path]+SYSTEM_LIB_PATHS:
+		if not isinstance(x,Node.Node):
+			x=self.bld.root.find_node(x)or self.path.find_node(x)
+			if not x:
+				continue
+		for y in names:
+			node=x.find_node(y)
+			if node:
+				node.sig=Utils.h_file(node.abspath())
+				break
+		else:
+			continue
+		break
+	else:
+		raise Errors.WafError('could not find library %r'%self.name)
+	self.link_task=self.create_task('fake_%s'%self.lib_type,[],[node])
+	self.target=self.name
+class fake_o(Task.Task):
+	def runnable_status(self):
+		return Task.SKIP_ME
+@extension('.o','.obj')
+def add_those_o_files(self,node):
+	tsk=self.create_task('fake_o',[],node)
+	try:
+		self.compiled_tasks.append(tsk)
+	except AttributeError:
+		self.compiled_tasks=[tsk]
+@feature('fake_obj')
+@before_method('process_source')
+def process_objs(self):
+	for node in self.to_nodes(self.source):
+		self.add_those_o_files(node)
+	self.source=[]
+@conf
+def read_object(self,obj):
+	if not isinstance(obj,self.path.__class__):
+		obj=self.path.find_resource(obj)
+	return self(features='fake_obj',source=obj,name=obj.name)
Index: waflib/Tools/compiler_c.py
===================================================================
--- waflib/Tools/compiler_c.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/compiler_c.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,39 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import os,sys,imp,types
+from waflib.Tools import ccroot
+from waflib import Utils,Configure
+from waflib.Logs import debug
+c_compiler={'win32':['msvc','gcc'],'cygwin':['gcc'],'darwin':['gcc'],'aix':['xlc','gcc'],'linux':['gcc','icc'],'sunos':['suncc','gcc'],'irix':['gcc','irixcc'],'hpux':['gcc'],'gnu':['gcc'],'java':['gcc','msvc','icc'],'default':['gcc'],}
+def configure(conf):
+	try:test_for_compiler=conf.options.check_c_compiler
+	except AttributeError:conf.fatal("Add options(opt): opt.load('compiler_c')")
+	for compiler in test_for_compiler.split():
+		conf.env.stash()
+		conf.start_msg('Checking for %r (c compiler)'%compiler)
+		try:
+			conf.load(compiler)
+		except conf.errors.ConfigurationError ,e:
+			conf.env.revert()
+			conf.end_msg(False)
+			debug('compiler_c: %r'%e)
+		else:
+			if conf.env['CC']:
+				conf.end_msg(conf.env.get_flat('CC'))
+				conf.env['COMPILER_CC']=compiler
+				break
+			conf.end_msg(False)
+	else:
+		conf.fatal('could not configure a c compiler!')
+def options(opt):
+	opt.load_special_tools('c_*.py',ban=['c_dumbpreproc.py'])
+	global c_compiler
+	build_platform=Utils.unversioned_sys_platform()
+	possible_compiler_list=c_compiler[build_platform in c_compiler and build_platform or'default']
+	test_for_compiler=' '.join(possible_compiler_list)
+	cc_compiler_opts=opt.add_option_group("C Compiler Options")
+	cc_compiler_opts.add_option('--check-c-compiler',default="%s"%test_for_compiler,help='On this platform (%s) the following C-Compiler will be checked by default: "%s"'%(build_platform,test_for_compiler),dest="check_c_compiler")
+	for x in test_for_compiler.split():
+		opt.load('%s'%x)
Index: waflib/Tools/compiler_cxx.py
===================================================================
--- waflib/Tools/compiler_cxx.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/compiler_cxx.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,39 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import os,sys,imp,types
+from waflib.Tools import ccroot
+from waflib import Utils,Configure
+from waflib.Logs import debug
+cxx_compiler={'win32':['msvc','g++'],'cygwin':['g++'],'darwin':['g++'],'aix':['xlc++','g++'],'linux':['g++','icpc'],'sunos':['sunc++','g++'],'irix':['g++'],'hpux':['g++'],'gnu':['g++'],'java':['g++','msvc','icpc'],'default':['g++']}
+def configure(conf):
+	try:test_for_compiler=conf.options.check_cxx_compiler
+	except AttributeError:conf.fatal("Add options(opt): opt.load('compiler_cxx')")
+	for compiler in test_for_compiler.split():
+		conf.env.stash()
+		conf.start_msg('Checking for %r (c++ compiler)'%compiler)
+		try:
+			conf.load(compiler)
+		except conf.errors.ConfigurationError ,e:
+			conf.env.revert()
+			conf.end_msg(False)
+			debug('compiler_cxx: %r'%e)
+		else:
+			if conf.env['CXX']:
+				conf.end_msg(conf.env.get_flat('CXX'))
+				conf.env['COMPILER_CXX']=compiler
+				break
+			conf.end_msg(False)
+	else:
+		conf.fatal('could not configure a c++ compiler!')
+def options(opt):
+	opt.load_special_tools('cxx_*.py')
+	global cxx_compiler
+	build_platform=Utils.unversioned_sys_platform()
+	possible_compiler_list=cxx_compiler[build_platform in cxx_compiler and build_platform or'default']
+	test_for_compiler=' '.join(possible_compiler_list)
+	cxx_compiler_opts=opt.add_option_group('C++ Compiler Options')
+	cxx_compiler_opts.add_option('--check-cxx-compiler',default="%s"%test_for_compiler,help='On this platform (%s) the following C++ Compiler will be checked by default: "%s"'%(build_platform,test_for_compiler),dest="check_cxx_compiler")
+	for x in test_for_compiler.split():
+		opt.load('%s'%x)
Index: waflib/Tools/compiler_d.py
===================================================================
--- waflib/Tools/compiler_d.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/compiler_d.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,29 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import os,sys,imp,types
+from waflib import Utils,Configure,Options,Logs
+def configure(conf):
+	for compiler in conf.options.dcheck.split(','):
+		conf.env.stash()
+		conf.start_msg('Checking for %r (d compiler)'%compiler)
+		try:
+			conf.load(compiler)
+		except conf.errors.ConfigurationError ,e:
+			conf.env.revert()
+			conf.end_msg(False)
+			Logs.debug('compiler_d: %r'%e)
+		else:
+			if conf.env.D:
+				conf.end_msg(conf.env.get_flat('D'))
+				conf.env['COMPILER_D']=compiler
+				break
+			conf.end_msg(False)
+	else:
+		conf.fatal('no suitable d compiler was found')
+def options(opt):
+	d_compiler_opts=opt.add_option_group('D Compiler Options')
+	d_compiler_opts.add_option('--check-d-compiler',default='gdc,dmd,ldc2',action='store',help='check for the compiler [Default:gdc,dmd,ldc2]',dest='dcheck')
+	for d_compiler in['gdc','dmd','ldc2']:
+		opt.load('%s'%d_compiler)
Index: waflib/Tools/compiler_fc.py
===================================================================
--- waflib/Tools/compiler_fc.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/compiler_fc.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,43 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import os,sys,imp,types
+from waflib import Utils,Configure,Options,Logs,Errors
+from waflib.Tools import fc
+fc_compiler={'win32':['gfortran','ifort'],'darwin':['gfortran','g95','ifort'],'linux':['gfortran','g95','ifort'],'java':['gfortran','g95','ifort'],'default':['gfortran'],'aix':['gfortran']}
+def __list_possible_compiler(platform):
+	try:
+		return fc_compiler[platform]
+	except KeyError:
+		return fc_compiler["default"]
+def configure(conf):
+	try:test_for_compiler=conf.options.check_fc
+	except AttributeError:conf.fatal("Add options(opt): opt.load('compiler_fc')")
+	for compiler in test_for_compiler.split():
+		conf.env.stash()
+		conf.start_msg('Checking for %r (fortran compiler)'%compiler)
+		try:
+			conf.load(compiler)
+		except conf.errors.ConfigurationError ,e:
+			conf.env.revert()
+			conf.end_msg(False)
+			Logs.debug('compiler_fortran: %r'%e)
+		else:
+			if conf.env['FC']:
+				conf.end_msg(conf.env.get_flat('FC'))
+				conf.env.COMPILER_FORTRAN=compiler
+				break
+			conf.end_msg(False)
+	else:
+		conf.fatal('could not configure a fortran compiler!')
+def options(opt):
+	opt.load_special_tools('fc_*.py')
+	build_platform=Utils.unversioned_sys_platform()
+	detected_platform=Options.platform
+	possible_compiler_list=__list_possible_compiler(detected_platform)
+	test_for_compiler=' '.join(possible_compiler_list)
+	fortran_compiler_opts=opt.add_option_group("Fortran Compiler Options")
+	fortran_compiler_opts.add_option('--check-fortran-compiler',default="%s"%test_for_compiler,help='On this platform (%s) the following Fortran Compiler will be checked by default: "%s"'%(detected_platform,test_for_compiler),dest="check_fc")
+	for compiler in test_for_compiler.split():
+		opt.load('%s'%compiler)
Index: waflib/Tools/cs.py
===================================================================
--- waflib/Tools/cs.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/cs.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,132 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+from waflib import Utils,Task,Options,Logs,Errors
+from waflib.TaskGen import before_method,after_method,feature
+from waflib.Tools import ccroot
+from waflib.Configure import conf
+import os,tempfile
+ccroot.USELIB_VARS['cs']=set(['CSFLAGS','ASSEMBLIES','RESOURCES'])
+ccroot.lib_patterns['csshlib']=['%s']
+@feature('cs')
+@before_method('process_source')
+def apply_cs(self):
+	cs_nodes=[]
+	no_nodes=[]
+	for x in self.to_nodes(self.source):
+		if x.name.endswith('.cs'):
+			cs_nodes.append(x)
+		else:
+			no_nodes.append(x)
+	self.source=no_nodes
+	bintype=getattr(self,'bintype',self.gen.endswith('.dll')and'library'or'exe')
+	self.cs_task=tsk=self.create_task('mcs',cs_nodes,self.path.find_or_declare(self.gen))
+	tsk.env.CSTYPE='/target:%s'%bintype
+	tsk.env.OUT='/out:%s'%tsk.outputs[0].abspath()
+	self.env.append_value('CSFLAGS','/platform:%s'%getattr(self,'platform','anycpu'))
+	inst_to=getattr(self,'install_path',bintype=='exe'and'${BINDIR}'or'${LIBDIR}')
+	if inst_to:
+		mod=getattr(self,'chmod',bintype=='exe'and Utils.O755 or Utils.O644)
+		self.install_task=self.bld.install_files(inst_to,self.cs_task.outputs[:],env=self.env,chmod=mod)
+@feature('cs')
+@after_method('apply_cs')
+def use_cs(self):
+	names=self.to_list(getattr(self,'use',[]))
+	get=self.bld.get_tgen_by_name
+	for x in names:
+		try:
+			y=get(x)
+		except Errors.WafError:
+			self.env.append_value('CSFLAGS','/reference:%s'%x)
+			continue
+		y.post()
+		tsk=getattr(y,'cs_task',None)or getattr(y,'link_task',None)
+		if not tsk:
+			self.bld.fatal('cs task has no link task for use %r'%self)
+		self.cs_task.dep_nodes.extend(tsk.outputs)
+		self.cs_task.set_run_after(tsk)
+		self.env.append_value('CSFLAGS','/reference:%s'%tsk.outputs[0].abspath())
+@feature('cs')
+@after_method('apply_cs','use_cs')
+def debug_cs(self):
+	csdebug=getattr(self,'csdebug',self.env.CSDEBUG)
+	if not csdebug:
+		return
+	node=self.cs_task.outputs[0]
+	if self.env.CS_NAME=='mono':
+		out=node.parent.find_or_declare(node.name+'.mdb')
+	else:
+		out=node.change_ext('.pdb')
+	self.cs_task.outputs.append(out)
+	try:
+		self.install_task.source.append(out)
+	except AttributeError:
+		pass
+	if csdebug=='pdbonly':
+		val=['/debug+','/debug:pdbonly']
+	elif csdebug=='full':
+		val=['/debug+','/debug:full']
+	else:
+		val=['/debug-']
+	self.env.append_value('CSFLAGS',val)
+class mcs(Task.Task):
+	color='YELLOW'
+	run_str='${MCS} ${CSTYPE} ${CSFLAGS} ${ASS_ST:ASSEMBLIES} ${RES_ST:RESOURCES} ${OUT} ${SRC}'
+	def exec_command(self,cmd,**kw):
+		bld=self.generator.bld
+		try:
+			if not kw.get('cwd',None):
+				kw['cwd']=bld.cwd
+		except AttributeError:
+			bld.cwd=kw['cwd']=bld.variant_dir
+		try:
+			tmp=None
+			if isinstance(cmd,list)and len(' '.join(cmd))>=8192:
+				program=cmd[0]
+				cmd=[self.quote_response_command(x)for x in cmd]
+				(fd,tmp)=tempfile.mkstemp()
+				os.write(fd,'\r\n'.join(i.replace('\\','\\\\')for i in cmd[1:]))
+				os.close(fd)
+				cmd=[program,'@'+tmp]
+			ret=self.generator.bld.exec_command(cmd,**kw)
+		finally:
+			if tmp:
+				try:
+					os.remove(tmp)
+				except OSError:
+					pass
+		return ret
+	def quote_response_command(self,flag):
+		if flag.lower()=='/noconfig':
+			return''
+		if flag.find(' ')>-1:
+			for x in('/r:','/reference:','/resource:','/lib:','/out:'):
+				if flag.startswith(x):
+					flag='%s"%s"'%(x,flag[len(x):])
+					break
+			else:
+				flag='"%s"'%flag
+		return flag
+def configure(conf):
+	csc=getattr(Options.options,'cscbinary',None)
+	if csc:
+		conf.env.MCS=csc
+	conf.find_program(['csc','mcs','gmcs'],var='MCS')
+	conf.env.ASS_ST='/r:%s'
+	conf.env.RES_ST='/resource:%s'
+	conf.env.CS_NAME='csc'
+	if str(conf.env.MCS).lower().find('mcs')>-1:
+		conf.env.CS_NAME='mono'
+def options(opt):
+	opt.add_option('--with-csc-binary',type='string',dest='cscbinary')
+class fake_csshlib(Task.Task):
+	color='YELLOW'
+	inst_to=None
+	def runnable_status(self):
+		for x in self.outputs:
+			x.sig=Utils.h_file(x.abspath())
+		return Task.SKIP_ME
+@conf
+def read_csshlib(self,name,paths=[]):
+	return self(name=name,features='fake_lib',lib_paths=paths,lib_type='csshlib')
Index: waflib/Tools/cxx.py
===================================================================
--- waflib/Tools/cxx.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/cxx.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,26 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+from waflib import TaskGen,Task,Utils
+from waflib.Tools import c_preproc
+from waflib.Tools.ccroot import link_task,stlink_task
+@TaskGen.extension('.cpp','.cc','.cxx','.C','.c++')
+def cxx_hook(self,node):
+	return self.create_compiled_task('cxx',node)
+if not'.c'in TaskGen.task_gen.mappings:
+	TaskGen.task_gen.mappings['.c']=TaskGen.task_gen.mappings['.cpp']
+class cxx(Task.Task):
+	run_str='${CXX} ${ARCH_ST:ARCH} ${CXXFLAGS} ${CPPFLAGS} ${FRAMEWORKPATH_ST:FRAMEWORKPATH} ${CPPPATH_ST:INCPATHS} ${DEFINES_ST:DEFINES} ${CXX_SRC_F}${SRC} ${CXX_TGT_F}${TGT}'
+	vars=['CXXDEPS']
+	ext_in=['.h']
+	scan=c_preproc.scan
+class cxxprogram(link_task):
+	run_str='${LINK_CXX} ${LINKFLAGS} ${CXXLNK_SRC_F}${SRC} ${CXXLNK_TGT_F}${TGT[0].abspath()} ${RPATH_ST:RPATH} ${FRAMEWORKPATH_ST:FRAMEWORKPATH} ${FRAMEWORK_ST:FRAMEWORK} ${ARCH_ST:ARCH} ${STLIB_MARKER} ${STLIBPATH_ST:STLIBPATH} ${STLIB_ST:STLIB} ${SHLIB_MARKER} ${LIBPATH_ST:LIBPATH} ${LIB_ST:LIB}'
+	vars=['LINKDEPS']
+	ext_out=['.bin']
+	inst_to='${BINDIR}'
+class cxxshlib(cxxprogram):
+	inst_to='${LIBDIR}'
+class cxxstlib(stlink_task):
+	pass
Index: waflib/Tools/d.py
===================================================================
--- waflib/Tools/d.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/d.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,54 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+from waflib import Utils,Task,Errors
+from waflib.TaskGen import taskgen_method,feature,extension
+from waflib.Tools import d_scan,d_config
+from waflib.Tools.ccroot import link_task,stlink_task
+class d(Task.Task):
+	color='GREEN'
+	run_str='${D} ${DFLAGS} ${DINC_ST:INCPATHS} ${D_SRC_F:SRC} ${D_TGT_F:TGT}'
+	scan=d_scan.scan
+class d_with_header(d):
+	run_str='${D} ${DFLAGS} ${DINC_ST:INCPATHS} ${D_HDR_F:tgt.outputs[1].bldpath()} ${D_SRC_F:SRC} ${D_TGT_F:tgt.outputs[0].bldpath()}'
+class d_header(Task.Task):
+	color='BLUE'
+	run_str='${D} ${D_HEADER} ${SRC}'
+class dprogram(link_task):
+	run_str='${D_LINKER} ${LINKFLAGS} ${DLNK_SRC_F}${SRC} ${DLNK_TGT_F:TGT} ${RPATH_ST:RPATH} ${DSTLIB_MARKER} ${DSTLIBPATH_ST:STLIBPATH} ${DSTLIB_ST:STLIB} ${DSHLIB_MARKER} ${DLIBPATH_ST:LIBPATH} ${DSHLIB_ST:LIB}'
+	inst_to='${BINDIR}'
+class dshlib(dprogram):
+	inst_to='${LIBDIR}'
+class dstlib(stlink_task):
+	pass
+@extension('.d','.di','.D')
+def d_hook(self,node):
+	ext=Utils.destos_to_binfmt(self.env.DEST_OS)=='pe'and'obj'or'o'
+	out='%s.%d.%s'%(node.name,self.idx,ext)
+	def create_compiled_task(self,name,node):
+		task=self.create_task(name,node,node.parent.find_or_declare(out))
+		try:
+			self.compiled_tasks.append(task)
+		except AttributeError:
+			self.compiled_tasks=[task]
+		return task
+	if getattr(self,'generate_headers',None):
+		tsk=create_compiled_task(self,'d_with_header',node)
+		tsk.outputs.append(node.change_ext(self.env['DHEADER_ext']))
+	else:
+		tsk=create_compiled_task(self,'d',node)
+	return tsk
+@taskgen_method
+def generate_header(self,filename):
+	try:
+		self.header_lst.append([filename,self.install_path])
+	except AttributeError:
+		self.header_lst=[[filename,self.install_path]]
+@feature('d')
+def process_header(self):
+	for i in getattr(self,'header_lst',[]):
+		node=self.path.find_resource(i[0])
+		if not node:
+			raise Errors.WafError('file %r not found on d obj'%i[0])
+		self.create_task('d_header',node,node.change_ext('.di'))
Index: waflib/Tools/d_config.py
===================================================================
--- waflib/Tools/d_config.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/d_config.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,52 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+from waflib import Utils
+from waflib.Configure import conf
+@conf
+def d_platform_flags(self):
+	v=self.env
+	if not v.DEST_OS:
+		v.DEST_OS=Utils.unversioned_sys_platform()
+	binfmt=Utils.destos_to_binfmt(self.env.DEST_OS)
+	if binfmt=='pe':
+		v['dprogram_PATTERN']='%s.exe'
+		v['dshlib_PATTERN']='lib%s.dll'
+		v['dstlib_PATTERN']='lib%s.a'
+	elif binfmt=='mac-o':
+		v['dprogram_PATTERN']='%s'
+		v['dshlib_PATTERN']='lib%s.dylib'
+		v['dstlib_PATTERN']='lib%s.a'
+	else:
+		v['dprogram_PATTERN']='%s'
+		v['dshlib_PATTERN']='lib%s.so'
+		v['dstlib_PATTERN']='lib%s.a'
+DLIB='''
+version(D_Version2) {
+	import std.stdio;
+	int main() {
+		writefln("phobos2");
+		return 0;
+	}
+} else {
+	version(Tango) {
+		import tango.stdc.stdio;
+		int main() {
+			printf("tango");
+			return 0;
+		}
+	} else {
+		import std.stdio;
+		int main() {
+			writefln("phobos1");
+			return 0;
+		}
+	}
+}
+'''
+@conf
+def check_dlibrary(self,execute=True):
+	ret=self.check_cc(features='d dprogram',fragment=DLIB,compile_filename='test.d',execute=execute,define_ret=True)
+	if execute:
+		self.env.DLIBRARY=ret.strip()
Index: waflib/Tools/d_scan.py
===================================================================
--- waflib/Tools/d_scan.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/d_scan.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,133 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import re
+from waflib import Utils,Logs
+def filter_comments(filename):
+	txt=Utils.readf(filename)
+	i=0
+	buf=[]
+	max=len(txt)
+	begin=0
+	while i<max:
+		c=txt[i]
+		if c=='"'or c=="'":
+			buf.append(txt[begin:i])
+			delim=c
+			i+=1
+			while i<max:
+				c=txt[i]
+				if c==delim:break
+				elif c=='\\':
+					i+=1
+				i+=1
+			i+=1
+			begin=i
+		elif c=='/':
+			buf.append(txt[begin:i])
+			i+=1
+			if i==max:break
+			c=txt[i]
+			if c=='+':
+				i+=1
+				nesting=1
+				c=None
+				while i<max:
+					prev=c
+					c=txt[i]
+					if prev=='/'and c=='+':
+						nesting+=1
+						c=None
+					elif prev=='+'and c=='/':
+						nesting-=1
+						if nesting==0:break
+						c=None
+					i+=1
+			elif c=='*':
+				i+=1
+				c=None
+				while i<max:
+					prev=c
+					c=txt[i]
+					if prev=='*'and c=='/':break
+					i+=1
+			elif c=='/':
+				i+=1
+				while i<max and txt[i]!='\n':
+					i+=1
+			else:
+				begin=i-1
+				continue
+			i+=1
+			begin=i
+			buf.append(' ')
+		else:
+			i+=1
+	buf.append(txt[begin:])
+	return buf
+class d_parser(object):
+	def __init__(self,env,incpaths):
+		self.allnames=[]
+		self.re_module=re.compile("module\s+([^;]+)")
+		self.re_import=re.compile("import\s+([^;]+)")
+		self.re_import_bindings=re.compile("([^:]+):(.*)")
+		self.re_import_alias=re.compile("[^=]+=(.+)")
+		self.env=env
+		self.nodes=[]
+		self.names=[]
+		self.incpaths=incpaths
+	def tryfind(self,filename):
+		found=0
+		for n in self.incpaths:
+			found=n.find_resource(filename.replace('.','/')+'.d')
+			if found:
+				self.nodes.append(found)
+				self.waiting.append(found)
+				break
+		if not found:
+			if not filename in self.names:
+				self.names.append(filename)
+	def get_strings(self,code):
+		self.module=''
+		lst=[]
+		mod_name=self.re_module.search(code)
+		if mod_name:
+			self.module=re.sub('\s+','',mod_name.group(1))
+		import_iterator=self.re_import.finditer(code)
+		if import_iterator:
+			for import_match in import_iterator:
+				import_match_str=re.sub('\s+','',import_match.group(1))
+				bindings_match=self.re_import_bindings.match(import_match_str)
+				if bindings_match:
+					import_match_str=bindings_match.group(1)
+				matches=import_match_str.split(',')
+				for match in matches:
+					alias_match=self.re_import_alias.match(match)
+					if alias_match:
+						match=alias_match.group(1)
+					lst.append(match)
+		return lst
+	def start(self,node):
+		self.waiting=[node]
+		while self.waiting:
+			nd=self.waiting.pop(0)
+			self.iter(nd)
+	def iter(self,node):
+		path=node.abspath()
+		code="".join(filter_comments(path))
+		names=self.get_strings(code)
+		for x in names:
+			if x in self.allnames:continue
+			self.allnames.append(x)
+			self.tryfind(x)
+def scan(self):
+	env=self.env
+	gruik=d_parser(env,self.generator.includes_nodes)
+	node=self.inputs[0]
+	gruik.start(node)
+	nodes=gruik.nodes
+	names=gruik.names
+	if Logs.verbose:
+		Logs.debug('deps: deps for %s: %r; unresolved %r'%(str(node),nodes,names))
+	return(nodes,names)
Index: waflib/Tools/dbus.py
===================================================================
--- waflib/Tools/dbus.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/dbus.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,29 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+from waflib import Task,Errors
+from waflib.TaskGen import taskgen_method,before_method
+@taskgen_method
+def add_dbus_file(self,filename,prefix,mode):
+	if not hasattr(self,'dbus_lst'):
+		self.dbus_lst=[]
+	if not'process_dbus'in self.meths:
+		self.meths.append('process_dbus')
+	self.dbus_lst.append([filename,prefix,mode])
+@before_method('apply_core')
+def process_dbus(self):
+	for filename,prefix,mode in getattr(self,'dbus_lst',[]):
+		node=self.path.find_resource(filename)
+		if not node:
+			raise Errors.WafError('file not found '+filename)
+		tsk=self.create_task('dbus_binding_tool',node,node.change_ext('.h'))
+		tsk.env.DBUS_BINDING_TOOL_PREFIX=prefix
+		tsk.env.DBUS_BINDING_TOOL_MODE=mode
+class dbus_binding_tool(Task.Task):
+	color='BLUE'
+	ext_out=['.h']
+	run_str='${DBUS_BINDING_TOOL} --prefix=${DBUS_BINDING_TOOL_PREFIX} --mode=${DBUS_BINDING_TOOL_MODE} --output=${TGT} ${SRC}'
+	shell=True
+def configure(conf):
+	dbus_binding_tool=conf.find_program('dbus-binding-tool',var='DBUS_BINDING_TOOL')
Index: waflib/Tools/dmd.py
===================================================================
--- waflib/Tools/dmd.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/dmd.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,51 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import sys
+from waflib.Tools import ar,d
+from waflib.Configure import conf
+@conf
+def find_dmd(conf):
+	conf.find_program(['dmd','dmd2','ldc'],var='D')
+	out=conf.cmd_and_log([conf.env.D,'--help'])
+	if out.find("D Compiler v")==-1:
+		out=conf.cmd_and_log([conf.env.D,'-version'])
+		if out.find("based on DMD v1.")==-1:
+			conf.fatal("detected compiler is not dmd/ldc")
+@conf
+def common_flags_ldc(conf):
+	v=conf.env
+	v['DFLAGS']=['-d-version=Posix']
+	v['LINKFLAGS']=[]
+	v['DFLAGS_dshlib']=['-relocation-model=pic']
+@conf
+def common_flags_dmd(conf):
+	v=conf.env
+	v['D_SRC_F']=['-c']
+	v['D_TGT_F']='-of%s'
+	v['D_LINKER']=v['D']
+	v['DLNK_SRC_F']=''
+	v['DLNK_TGT_F']='-of%s'
+	v['DINC_ST']='-I%s'
+	v['DSHLIB_MARKER']=v['DSTLIB_MARKER']=''
+	v['DSTLIB_ST']=v['DSHLIB_ST']='-L-l%s'
+	v['DSTLIBPATH_ST']=v['DLIBPATH_ST']='-L-L%s'
+	v['LINKFLAGS_dprogram']=['-quiet']
+	v['DFLAGS_dshlib']=['-fPIC']
+	v['LINKFLAGS_dshlib']=['-L-shared']
+	v['DHEADER_ext']='.di'
+	v.DFLAGS_d_with_header=['-H','-Hf']
+	v['D_HDR_F']='%s'
+def configure(conf):
+	conf.find_dmd()
+	if sys.platform=='win32':
+		out=conf.cmd_and_log([conf.env.D,'--help'])
+		if out.find("D Compiler v2.")>-1:
+			conf.fatal('dmd2 on Windows is not supported, use gdc or ldc2 instead')
+	conf.load('ar')
+	conf.load('d')
+	conf.common_flags_dmd()
+	conf.d_platform_flags()
+	if str(conf.env.D).find('ldc')>-1:
+		conf.common_flags_ldc()
Index: waflib/Tools/errcheck.py
===================================================================
--- waflib/Tools/errcheck.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/errcheck.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,161 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+typos={'feature':'features','sources':'source','targets':'target','include':'includes','export_include':'export_includes','define':'defines','importpath':'includes','installpath':'install_path','iscopy':'is_copy',}
+meths_typos=['__call__','program','shlib','stlib','objects']
+from waflib import Logs,Build,Node,Task,TaskGen,ConfigSet,Errors,Utils
+import waflib.Tools.ccroot
+def check_same_targets(self):
+	mp=Utils.defaultdict(list)
+	uids={}
+	def check_task(tsk):
+		if not isinstance(tsk,Task.Task):
+			return
+		for node in tsk.outputs:
+			mp[node].append(tsk)
+		try:
+			uids[tsk.uid()].append(tsk)
+		except KeyError:
+			uids[tsk.uid()]=[tsk]
+	for g in self.groups:
+		for tg in g:
+			try:
+				for tsk in tg.tasks:
+					check_task(tsk)
+			except AttributeError:
+				check_task(tg)
+	dupe=False
+	for(k,v)in mp.items():
+		if len(v)>1:
+			dupe=True
+			msg='* Node %r is created more than once%s. The task generators are:'%(k,Logs.verbose==1 and" (full message on 'waf -v -v')"or"")
+			Logs.error(msg)
+			for x in v:
+				if Logs.verbose>1:
+					Logs.error('  %d. %r'%(1+v.index(x),x.generator))
+				else:
+					Logs.error('  %d. %r in %r'%(1+v.index(x),x.generator.name,getattr(x.generator,'path',None)))
+	if not dupe:
+		for(k,v)in uids.items():
+			if len(v)>1:
+				Logs.error('* Several tasks use the same identifier. Please check the information on\n   http://docs.waf.googlecode.com/git/apidocs_16/Task.html#waflib.Task.Task.uid')
+				for tsk in v:
+					Logs.error('  - object %r (%r) defined in %r'%(tsk.__class__.__name__,tsk,tsk.generator))
+def check_invalid_constraints(self):
+	feat=set([])
+	for x in list(TaskGen.feats.values()):
+		feat.union(set(x))
+	for(x,y)in TaskGen.task_gen.prec.items():
+		feat.add(x)
+		feat.union(set(y))
+	ext=set([])
+	for x in TaskGen.task_gen.mappings.values():
+		ext.add(x.__name__)
+	invalid=ext&feat
+	if invalid:
+		Logs.error('The methods %r have invalid annotations:  @extension <-> @feature/@before_method/@after_method'%list(invalid))
+	for cls in list(Task.classes.values()):
+		for x in('before','after'):
+			for y in Utils.to_list(getattr(cls,x,[])):
+				if not Task.classes.get(y,None):
+					Logs.error('Erroneous order constraint %r=%r on task class %r'%(x,y,cls.__name__))
+		if getattr(cls,'rule',None):
+			Logs.error('Erroneous attribute "rule" on task class %r (rename to "run_str")'%cls.__name__)
+def replace(m):
+	oldcall=getattr(Build.BuildContext,m)
+	def call(self,*k,**kw):
+		ret=oldcall(self,*k,**kw)
+		for x in typos:
+			if x in kw:
+				if x=='iscopy'and'subst'in getattr(self,'features',''):
+					continue
+				err=True
+				Logs.error('Fix the typo %r -> %r on %r'%(x,typos[x],ret))
+		return ret
+	setattr(Build.BuildContext,m,call)
+def enhance_lib():
+	for m in meths_typos:
+		replace(m)
+	def ant_glob(self,*k,**kw):
+		if k:
+			lst=Utils.to_list(k[0])
+			for pat in lst:
+				if'..'in pat.split('/'):
+					Logs.error("In ant_glob pattern %r: '..' means 'two dots', not 'parent directory'"%k[0])
+		if kw.get('remove',True):
+			try:
+				if self.is_child_of(self.ctx.bldnode)and not kw.get('quiet',False):
+					Logs.error('Using ant_glob on the build folder (%r) is dangerous (quiet=True to disable this warning)'%self)
+			except AttributeError:
+				pass
+		return self.old_ant_glob(*k,**kw)
+	Node.Node.old_ant_glob=Node.Node.ant_glob
+	Node.Node.ant_glob=ant_glob
+	old=Task.is_before
+	def is_before(t1,t2):
+		ret=old(t1,t2)
+		if ret and old(t2,t1):
+			Logs.error('Contradictory order constraints in classes %r %r'%(t1,t2))
+		return ret
+	Task.is_before=is_before
+	def check_err_features(self):
+		lst=self.to_list(self.features)
+		if'shlib'in lst:
+			Logs.error('feature shlib -> cshlib, dshlib or cxxshlib')
+		for x in('c','cxx','d','fc'):
+			if not x in lst and lst and lst[0]in[x+y for y in('program','shlib','stlib')]:
+				Logs.error('%r features is probably missing %r'%(self,x))
+	TaskGen.feature('*')(check_err_features)
+	def check_err_order(self):
+		if not hasattr(self,'rule')and not'subst'in Utils.to_list(self.features):
+			for x in('before','after','ext_in','ext_out'):
+				if hasattr(self,x):
+					Logs.warn('Erroneous order constraint %r on non-rule based task generator %r'%(x,self))
+		else:
+			for x in('before','after'):
+				for y in self.to_list(getattr(self,x,[])):
+					if not Task.classes.get(y,None):
+						Logs.error('Erroneous order constraint %s=%r on %r (no such class)'%(x,y,self))
+	TaskGen.feature('*')(check_err_order)
+	def check_compile(self):
+		check_invalid_constraints(self)
+		try:
+			ret=self.orig_compile()
+		finally:
+			check_same_targets(self)
+		return ret
+	Build.BuildContext.orig_compile=Build.BuildContext.compile
+	Build.BuildContext.compile=check_compile
+	def use_rec(self,name,**kw):
+		try:
+			y=self.bld.get_tgen_by_name(name)
+		except Errors.WafError:
+			pass
+		else:
+			idx=self.bld.get_group_idx(self)
+			odx=self.bld.get_group_idx(y)
+			if odx>idx:
+				msg="Invalid 'use' across build groups:"
+				if Logs.verbose>1:
+					msg+='\n  target %r\n  uses:\n  %r'%(self,y)
+				else:
+					msg+=" %r uses %r (try 'waf -v -v' for the full error)"%(self.name,name)
+				raise Errors.WafError(msg)
+		self.orig_use_rec(name,**kw)
+	TaskGen.task_gen.orig_use_rec=TaskGen.task_gen.use_rec
+	TaskGen.task_gen.use_rec=use_rec
+	def getattri(self,name,default=None):
+		if name=='append'or name=='add':
+			raise Errors.WafError('env.append and env.add do not exist: use env.append_value/env.append_unique')
+		elif name=='prepend':
+			raise Errors.WafError('env.prepend does not exist: use env.prepend_value')
+		if name in self.__slots__:
+			return object.__getattr__(self,name,default)
+		else:
+			return self[name]
+	ConfigSet.ConfigSet.__getattr__=getattri
+def options(opt):
+	enhance_lib()
+def configure(conf):
+	pass
Index: waflib/Tools/fc.py
===================================================================
--- waflib/Tools/fc.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/fc.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,116 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import re
+from waflib import Utils,Task,TaskGen,Logs
+from waflib.Tools import ccroot,fc_config,fc_scan
+from waflib.TaskGen import feature,before_method,after_method,extension
+from waflib.Configure import conf
+ccroot.USELIB_VARS['fc']=set(['FCFLAGS','DEFINES','INCLUDES'])
+ccroot.USELIB_VARS['fcprogram_test']=ccroot.USELIB_VARS['fcprogram']=set(['LIB','STLIB','LIBPATH','STLIBPATH','LINKFLAGS','RPATH','LINKDEPS'])
+ccroot.USELIB_VARS['fcshlib']=set(['LIB','STLIB','LIBPATH','STLIBPATH','LINKFLAGS','RPATH','LINKDEPS'])
+ccroot.USELIB_VARS['fcstlib']=set(['ARFLAGS','LINKDEPS'])
+@feature('fcprogram','fcshlib','fcstlib','fcprogram_test')
+def dummy(self):
+	pass
+@extension('.f','.f90','.F','.F90','.for','.FOR')
+def fc_hook(self,node):
+	return self.create_compiled_task('fc',node)
+@conf
+def modfile(conf,name):
+	return{'lower':name.lower()+'.mod','lower.MOD':name.upper()+'.MOD','UPPER.mod':name.upper()+'.mod','UPPER':name.upper()+'.MOD'}[conf.env.FC_MOD_CAPITALIZATION or'lower']
+def get_fortran_tasks(tsk):
+	bld=tsk.generator.bld
+	tasks=bld.get_tasks_group(bld.get_group_idx(tsk.generator))
+	return[x for x in tasks if isinstance(x,fc)and not getattr(x,'nomod',None)and not getattr(x,'mod_fortran_done',None)]
+class fc(Task.Task):
+	color='GREEN'
+	run_str='${FC} ${FCFLAGS} ${FCINCPATH_ST:INCPATHS} ${FCDEFINES_ST:DEFINES} ${_FCMODOUTFLAGS} ${FC_TGT_F}${TGT[0].abspath()} ${FC_SRC_F}${SRC[0].abspath()}'
+	vars=["FORTRANMODPATHFLAG"]
+	def scan(self):
+		tmp=fc_scan.fortran_parser(self.generator.includes_nodes)
+		tmp.task=self
+		tmp.start(self.inputs[0])
+		if Logs.verbose:
+			Logs.debug('deps: deps for %r: %r; unresolved %r'%(self.inputs,tmp.nodes,tmp.names))
+		return(tmp.nodes,tmp.names)
+	def runnable_status(self):
+		if getattr(self,'mod_fortran_done',None):
+			return super(fc,self).runnable_status()
+		bld=self.generator.bld
+		lst=get_fortran_tasks(self)
+		for tsk in lst:
+			tsk.mod_fortran_done=True
+		for tsk in lst:
+			ret=tsk.runnable_status()
+			if ret==Task.ASK_LATER:
+				for x in lst:
+					x.mod_fortran_done=None
+				return Task.ASK_LATER
+		ins=Utils.defaultdict(set)
+		outs=Utils.defaultdict(set)
+		for tsk in lst:
+			key=tsk.uid()
+			for x in bld.raw_deps[key]:
+				if x.startswith('MOD@'):
+					name=bld.modfile(x.replace('MOD@',''))
+					node=bld.srcnode.find_or_declare(name)
+					tsk.set_outputs(node)
+					outs[id(node)].add(tsk)
+		for tsk in lst:
+			key=tsk.uid()
+			for x in bld.raw_deps[key]:
+				if x.startswith('USE@'):
+					name=bld.modfile(x.replace('USE@',''))
+					node=bld.srcnode.find_resource(name)
+					if node and node not in tsk.outputs:
+						if not node in bld.node_deps[key]:
+							bld.node_deps[key].append(node)
+						ins[id(node)].add(tsk)
+		for k in ins.keys():
+			for a in ins[k]:
+				a.run_after.update(outs[k])
+				tmp=[]
+				for t in outs[k]:
+					tmp.extend(t.outputs)
+				a.dep_nodes.extend(tmp)
+				a.dep_nodes.sort(key=lambda x:x.abspath())
+		for tsk in lst:
+			try:
+				delattr(tsk,'cache_sig')
+			except AttributeError:
+				pass
+		return super(fc,self).runnable_status()
+class fcprogram(ccroot.link_task):
+	color='YELLOW'
+	run_str='${FC} ${LINKFLAGS} ${FCLNK_SRC_F}${SRC} ${FCLNK_TGT_F}${TGT[0].abspath()} ${RPATH_ST:RPATH} ${FCSTLIB_MARKER} ${FCSTLIBPATH_ST:STLIBPATH} ${FCSTLIB_ST:STLIB} ${FCSHLIB_MARKER} ${FCLIBPATH_ST:LIBPATH} ${FCLIB_ST:LIB}'
+	inst_to='${BINDIR}'
+class fcshlib(fcprogram):
+	inst_to='${LIBDIR}'
+class fcprogram_test(fcprogram):
+	def can_retrieve_cache(self):
+		return False
+	def runnable_status(self):
+		ret=super(fcprogram_test,self).runnable_status()
+		if ret==Task.SKIP_ME:
+			ret=Task.RUN_ME
+		return ret
+	def exec_command(self,cmd,**kw):
+		bld=self.generator.bld
+		kw['shell']=isinstance(cmd,str)
+		kw['stdout']=kw['stderr']=Utils.subprocess.PIPE
+		kw['cwd']=bld.variant_dir
+		bld.out=bld.err=''
+		bld.to_log('command: %s\n'%cmd)
+		kw['output']=0
+		try:
+			(bld.out,bld.err)=bld.cmd_and_log(cmd,**kw)
+		except Exception ,e:
+			return-1
+		if bld.out:
+			bld.to_log("out: %s\n"%bld.out)
+		if bld.err:
+			bld.to_log("err: %s\n"%bld.err)
+class fcstlib(ccroot.stlink_task):
+	pass
Index: waflib/Tools/fc_config.py
===================================================================
--- waflib/Tools/fc_config.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/fc_config.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,285 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import re,shutil,os,sys,string,shlex
+from waflib.Configure import conf
+from waflib.TaskGen import feature,after_method,before_method
+from waflib import Build,Utils
+FC_FRAGMENT='        program main\n        end     program main\n'
+FC_FRAGMENT2='        PROGRAM MAIN\n        END\n'
+@conf
+def fc_flags(conf):
+	v=conf.env
+	v['FC_SRC_F']=[]
+	v['FC_TGT_F']=['-c','-o']
+	v['FCINCPATH_ST']='-I%s'
+	v['FCDEFINES_ST']='-D%s'
+	if not v['LINK_FC']:v['LINK_FC']=v['FC']
+	v['FCLNK_SRC_F']=[]
+	v['FCLNK_TGT_F']=['-o']
+	v['FCFLAGS_fcshlib']=['-fpic']
+	v['LINKFLAGS_fcshlib']=['-shared']
+	v['fcshlib_PATTERN']='lib%s.so'
+	v['fcstlib_PATTERN']='lib%s.a'
+	v['FCLIB_ST']='-l%s'
+	v['FCLIBPATH_ST']='-L%s'
+	v['FCSTLIB_ST']='-l%s'
+	v['FCSTLIBPATH_ST']='-L%s'
+	v['FCSTLIB_MARKER']='-Wl,-Bstatic'
+	v['FCSHLIB_MARKER']='-Wl,-Bdynamic'
+	v['SONAME_ST']='-Wl,-h,%s'
+@conf
+def fc_add_flags(conf):
+	conf.add_os_flags('FCFLAGS')
+	conf.add_os_flags('LDFLAGS','LINKFLAGS')
+@conf
+def check_fortran(self,*k,**kw):
+	self.check_cc(fragment=FC_FRAGMENT,compile_filename='test.f',features='fc fcprogram',msg='Compiling a simple fortran app')
+@conf
+def check_fc(self,*k,**kw):
+	kw['compiler']='fc'
+	if not'compile_mode'in kw:
+		kw['compile_mode']='fc'
+	if not'type'in kw:
+		kw['type']='fcprogram'
+	if not'compile_filename'in kw:
+		kw['compile_filename']='test.f90'
+	if not'code'in kw:
+		kw['code']=FC_FRAGMENT
+	return self.check(*k,**kw)
+@conf
+def fortran_modifier_darwin(conf):
+	v=conf.env
+	v['FCFLAGS_fcshlib']=['-fPIC','-compatibility_version','1','-current_version','1']
+	v['LINKFLAGS_fcshlib']=['-dynamiclib']
+	v['fcshlib_PATTERN']='lib%s.dylib'
+	v['FRAMEWORKPATH_ST']='-F%s'
+	v['FRAMEWORK_ST']='-framework %s'
+	v['LINKFLAGS_fcstlib']=[]
+	v['FCSHLIB_MARKER']=''
+	v['FCSTLIB_MARKER']=''
+	v['SONAME_ST']=''
+@conf
+def fortran_modifier_win32(conf):
+	v=conf.env
+	v['fcprogram_PATTERN']=v['fcprogram_test_PATTERN']='%s.exe'
+	v['fcshlib_PATTERN']='%s.dll'
+	v['implib_PATTERN']='lib%s.dll.a'
+	v['IMPLIB_ST']='-Wl,--out-implib,%s'
+	v['FCFLAGS_fcshlib']=[]
+	v.append_value('FCFLAGS_fcshlib',['-DDLL_EXPORT'])
+	v.append_value('LINKFLAGS',['-Wl,--enable-auto-import'])
+@conf
+def fortran_modifier_cygwin(conf):
+	fortran_modifier_win32(conf)
+	v=conf.env
+	v['fcshlib_PATTERN']='cyg%s.dll'
+	v.append_value('LINKFLAGS_fcshlib',['-Wl,--enable-auto-image-base'])
+	v['FCFLAGS_fcshlib']=[]
+@conf
+def check_fortran_dummy_main(self,*k,**kw):
+	if not self.env.CC:
+		self.fatal('A c compiler is required for check_fortran_dummy_main')
+	lst=['MAIN__','__MAIN','_MAIN','MAIN_','MAIN']
+	lst.extend([m.lower()for m in lst])
+	lst.append('')
+	self.start_msg('Detecting whether we need a dummy main')
+	for main in lst:
+		kw['fortran_main']=main
+		try:
+			self.check_cc(fragment='int %s() { return 0; }\n'%(main or'test'),features='c fcprogram',mandatory=True)
+			if not main:
+				self.env.FC_MAIN=-1
+				self.end_msg('no')
+			else:
+				self.env.FC_MAIN=main
+				self.end_msg('yes %s'%main)
+			break
+		except self.errors.ConfigurationError:
+			pass
+	else:
+		self.end_msg('not found')
+		self.fatal('could not detect whether fortran requires a dummy main, see the config.log')
+GCC_DRIVER_LINE=re.compile('^Driving:')
+POSIX_STATIC_EXT=re.compile('\S+\.a')
+POSIX_LIB_FLAGS=re.compile('-l\S+')
+@conf
+def is_link_verbose(self,txt):
+	assert isinstance(txt,str)
+	for line in txt.splitlines():
+		if not GCC_DRIVER_LINE.search(line):
+			if POSIX_STATIC_EXT.search(line)or POSIX_LIB_FLAGS.search(line):
+				return True
+	return False
+@conf
+def check_fortran_verbose_flag(self,*k,**kw):
+	self.start_msg('fortran link verbose flag')
+	for x in['-v','--verbose','-verbose','-V']:
+		try:
+			self.check_cc(features='fc fcprogram_test',fragment=FC_FRAGMENT2,compile_filename='test.f',linkflags=[x],mandatory=True)
+		except self.errors.ConfigurationError:
+			pass
+		else:
+			if self.is_link_verbose(self.test_bld.err)or self.is_link_verbose(self.test_bld.out):
+				self.end_msg(x)
+				break
+	else:
+		self.end_msg('failure')
+		self.fatal('Could not obtain the fortran link verbose flag (see config.log)')
+	self.env.FC_VERBOSE_FLAG=x
+	return x
+LINKFLAGS_IGNORED=[r'-lang*',r'-lcrt[a-zA-Z0-9\.]*\.o',r'-lc$',r'-lSystem',r'-libmil',r'-LIST:*',r'-LNO:*']
+if os.name=='nt':
+	LINKFLAGS_IGNORED.extend([r'-lfrt*',r'-luser32',r'-lkernel32',r'-ladvapi32',r'-lmsvcrt',r'-lshell32',r'-lmingw',r'-lmoldname'])
+else:
+	LINKFLAGS_IGNORED.append(r'-lgcc*')
+RLINKFLAGS_IGNORED=[re.compile(f)for f in LINKFLAGS_IGNORED]
+def _match_ignore(line):
+	for i in RLINKFLAGS_IGNORED:
+		if i.match(line):
+			return True
+	return False
+def parse_fortran_link(lines):
+	final_flags=[]
+	for line in lines:
+		if not GCC_DRIVER_LINE.match(line):
+			_parse_flink_line(line,final_flags)
+	return final_flags
+SPACE_OPTS=re.compile('^-[LRuYz]$')
+NOSPACE_OPTS=re.compile('^-[RL]')
+def _parse_flink_line(line,final_flags):
+	lexer=shlex.shlex(line,posix=True)
+	lexer.whitespace_split=True
+	t=lexer.get_token()
+	tmp_flags=[]
+	while t:
+		def parse(token):
+			if _match_ignore(token):
+				pass
+			elif token.startswith('-lkernel32')and sys.platform=='cygwin':
+				tmp_flags.append(token)
+			elif SPACE_OPTS.match(token):
+				t=lexer.get_token()
+				if t.startswith('P,'):
+					t=t[2:]
+				for opt in t.split(os.pathsep):
+					tmp_flags.append('-L%s'%opt)
+			elif NOSPACE_OPTS.match(token):
+				tmp_flags.append(token)
+			elif POSIX_LIB_FLAGS.match(token):
+				tmp_flags.append(token)
+			else:
+				pass
+			t=lexer.get_token()
+			return t
+		t=parse(t)
+	final_flags.extend(tmp_flags)
+	return final_flags
+@conf
+def check_fortran_clib(self,autoadd=True,*k,**kw):
+	if not self.env.FC_VERBOSE_FLAG:
+		self.fatal('env.FC_VERBOSE_FLAG is not set: execute check_fortran_verbose_flag?')
+	self.start_msg('Getting fortran runtime link flags')
+	try:
+		self.check_cc(fragment=FC_FRAGMENT2,compile_filename='test.f',features='fc fcprogram_test',linkflags=[self.env.FC_VERBOSE_FLAG])
+	except Exception:
+		self.end_msg(False)
+		if kw.get('mandatory',True):
+			conf.fatal('Could not find the c library flags')
+	else:
+		out=self.test_bld.err
+		flags=parse_fortran_link(out.splitlines())
+		self.end_msg('ok (%s)'%' '.join(flags))
+		self.env.LINKFLAGS_CLIB=flags
+		return flags
+	return[]
+def getoutput(conf,cmd,stdin=False):
+	if stdin:
+		stdin=Utils.subprocess.PIPE
+	else:
+		stdin=None
+	env=conf.env.env or None
+	try:
+		p=Utils.subprocess.Popen(cmd,stdin=stdin,stdout=Utils.subprocess.PIPE,stderr=Utils.subprocess.PIPE,env=env)
+		if stdin:
+			p.stdin.write('\n')
+		out,err=p.communicate()
+	except Exception:
+		conf.fatal('could not determine the compiler version %r'%cmd)
+	if not isinstance(out,str):
+		out=out.decode(sys.stdout.encoding or'iso8859-1')
+	if not isinstance(err,str):
+		err=err.decode(sys.stdout.encoding or'iso8859-1')
+	return(out,err)
+ROUTINES_CODE="""\
+      subroutine foobar()
+      return
+      end
+      subroutine foo_bar()
+      return
+      end
+"""
+MAIN_CODE="""
+void %(dummy_func_nounder)s(void);
+void %(dummy_func_under)s(void);
+int %(main_func_name)s() {
+  %(dummy_func_nounder)s();
+  %(dummy_func_under)s();
+  return 0;
+}
+"""
+@feature('link_main_routines_func')
+@before_method('process_source')
+def link_main_routines_tg_method(self):
+	def write_test_file(task):
+		task.outputs[0].write(task.generator.code)
+	bld=self.bld
+	bld(rule=write_test_file,target='main.c',code=MAIN_CODE%self.__dict__)
+	bld(rule=write_test_file,target='test.f',code=ROUTINES_CODE)
+	bld(features='fc fcstlib',source='test.f',target='test')
+	bld(features='c fcprogram',source='main.c',target='app',use='test')
+def mangling_schemes():
+	for u in['_','']:
+		for du in['','_']:
+			for c in["lower","upper"]:
+				yield(u,du,c)
+def mangle_name(u,du,c,name):
+	return getattr(name,c)()+u+(name.find('_')!=-1 and du or'')
+@conf
+def check_fortran_mangling(self,*k,**kw):
+	if not self.env.CC:
+		self.fatal('A c compiler is required for link_main_routines')
+	if not self.env.FC:
+		self.fatal('A fortran compiler is required for link_main_routines')
+	if not self.env.FC_MAIN:
+		self.fatal('Checking for mangling requires self.env.FC_MAIN (execute "check_fortran_dummy_main" first?)')
+	self.start_msg('Getting fortran mangling scheme')
+	for(u,du,c)in mangling_schemes():
+		try:
+			self.check_cc(compile_filename=[],features='link_main_routines_func',msg='nomsg',errmsg='nomsg',mandatory=True,dummy_func_nounder=mangle_name(u,du,c,"foobar"),dummy_func_under=mangle_name(u,du,c,"foo_bar"),main_func_name=self.env.FC_MAIN)
+		except self.errors.ConfigurationError:
+			pass
+		else:
+			self.end_msg("ok ('%s', '%s', '%s-case')"%(u,du,c))
+			self.env.FORTRAN_MANGLING=(u,du,c)
+			break
+	else:
+		self.end_msg(False)
+		self.fatal('mangler not found')
+	return(u,du,c)
+@feature('pyext')
+@before_method('propagate_uselib_vars','apply_link')
+def set_lib_pat(self):
+	self.env['fcshlib_PATTERN']=self.env['pyext_PATTERN']
+@conf
+def detect_openmp(self):
+	for x in['-fopenmp','-openmp','-mp','-xopenmp','-omp','-qsmp=omp']:
+		try:
+			self.check_fc(msg='Checking for OpenMP flag %s'%x,fragment='program main\n  call omp_get_num_threads()\nend program main',fcflags=x,linkflags=x,uselib_store='OPENMP')
+		except self.errors.ConfigurationError:
+			pass
+		else:
+			break
+	else:
+		self.fatal('Could not find OpenMP')
Index: waflib/Tools/fc_scan.py
===================================================================
--- waflib/Tools/fc_scan.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/fc_scan.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,68 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import re
+from waflib import Utils,Task,TaskGen,Logs
+from waflib.TaskGen import feature,before_method,after_method,extension
+from waflib.Configure import conf
+INC_REGEX="""(?:^|['">]\s*;)\s*INCLUDE\s+(?:\w+_)?[<"'](.+?)(?=["'>])"""
+USE_REGEX="""(?:^|;)\s*USE(?:\s+|(?:(?:\s*,\s*(?:NON_)?INTRINSIC)?\s*::))\s*(\w+)"""
+MOD_REGEX="""(?:^|;)\s*MODULE(?!\s*PROCEDURE)(?:\s+|(?:(?:\s*,\s*(?:NON_)?INTRINSIC)?\s*::))\s*(\w+)"""
+re_inc=re.compile(INC_REGEX,re.I)
+re_use=re.compile(USE_REGEX,re.I)
+re_mod=re.compile(MOD_REGEX,re.I)
+class fortran_parser(object):
+	def __init__(self,incpaths):
+		self.seen=[]
+		self.nodes=[]
+		self.names=[]
+		self.incpaths=incpaths
+	def find_deps(self,node):
+		txt=node.read()
+		incs=[]
+		uses=[]
+		mods=[]
+		for line in txt.splitlines():
+			m=re_inc.search(line)
+			if m:
+				incs.append(m.group(1))
+			m=re_use.search(line)
+			if m:
+				uses.append(m.group(1))
+			m=re_mod.search(line)
+			if m:
+				mods.append(m.group(1))
+		return(incs,uses,mods)
+	def start(self,node):
+		self.waiting=[node]
+		while self.waiting:
+			nd=self.waiting.pop(0)
+			self.iter(nd)
+	def iter(self,node):
+		path=node.abspath()
+		incs,uses,mods=self.find_deps(node)
+		for x in incs:
+			if x in self.seen:
+				continue
+			self.seen.append(x)
+			self.tryfind_header(x)
+		for x in uses:
+			name="USE@%s"%x
+			if not name in self.names:
+				self.names.append(name)
+		for x in mods:
+			name="MOD@%s"%x
+			if not name in self.names:
+				self.names.append(name)
+	def tryfind_header(self,filename):
+		found=None
+		for n in self.incpaths:
+			found=n.find_resource(filename)
+			if found:
+				self.nodes.append(found)
+				self.waiting.append(found)
+				break
+		if not found:
+			if not filename in self.names:
+				self.names.append(filename)
Index: waflib/Tools/flex.py
===================================================================
--- waflib/Tools/flex.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/flex.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,32 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import waflib.TaskGen,os,re
+def decide_ext(self,node):
+	if'cxx'in self.features:
+		return['.lex.cc']
+	return['.lex.c']
+def flexfun(tsk):
+	env=tsk.env
+	bld=tsk.generator.bld
+	wd=bld.variant_dir
+	def to_list(xx):
+		if isinstance(xx,str):return[xx]
+		return xx
+	tsk.last_cmd=lst=[]
+	lst.extend(to_list(env['FLEX']))
+	lst.extend(to_list(env['FLEXFLAGS']))
+	inputs=[a.path_from(bld.bldnode)for a in tsk.inputs]
+	if env.FLEX_MSYS:
+		inputs=[x.replace(os.sep,'/')for x in inputs]
+	lst.extend(inputs)
+	lst=[x for x in lst if x]
+	txt=bld.cmd_and_log(lst,cwd=wd,env=env.env or None,quiet=0)
+	tsk.outputs[0].write(txt.replace('\r\n','\n').replace('\r','\n'))
+waflib.TaskGen.declare_chain(name='flex',rule=flexfun,ext_in='.l',decider=decide_ext,)
+def configure(conf):
+	conf.find_program('flex',var='FLEX')
+	conf.env.FLEXFLAGS=['-t']
+	if re.search(r"\\msys\\[0-9.]+\\bin\\flex.exe$",conf.env.FLEX):
+		conf.env.FLEX_MSYS=True
Index: waflib/Tools/g95.py
===================================================================
--- waflib/Tools/g95.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/g95.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,55 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import re
+from waflib import Utils
+from waflib.Tools import fc,fc_config,fc_scan,ar
+from waflib.Configure import conf
+@conf
+def find_g95(conf):
+	fc=conf.find_program('g95',var='FC')
+	fc=conf.cmd_to_list(fc)
+	conf.get_g95_version(fc)
+	conf.env.FC_NAME='G95'
+@conf
+def g95_flags(conf):
+	v=conf.env
+	v['FCFLAGS_fcshlib']=['-fPIC']
+	v['FORTRANMODFLAG']=['-fmod=','']
+	v['FCFLAGS_DEBUG']=['-Werror']
+@conf
+def g95_modifier_win32(conf):
+	fc_config.fortran_modifier_win32(conf)
+@conf
+def g95_modifier_cygwin(conf):
+	fc_config.fortran_modifier_cygwin(conf)
+@conf
+def g95_modifier_darwin(conf):
+	fc_config.fortran_modifier_darwin(conf)
+@conf
+def g95_modifier_platform(conf):
+	dest_os=conf.env['DEST_OS']or Utils.unversioned_sys_platform()
+	g95_modifier_func=getattr(conf,'g95_modifier_'+dest_os,None)
+	if g95_modifier_func:
+		g95_modifier_func()
+@conf
+def get_g95_version(conf,fc):
+	version_re=re.compile(r"g95\s*(?P<major>\d*)\.(?P<minor>\d*)").search
+	cmd=fc+['--version']
+	out,err=fc_config.getoutput(conf,cmd,stdin=False)
+	if out:
+		match=version_re(out)
+	else:
+		match=version_re(err)
+	if not match:
+		conf.fatal('cannot determine g95 version')
+	k=match.groupdict()
+	conf.env['FC_VERSION']=(k['major'],k['minor'])
+def configure(conf):
+	conf.find_g95()
+	conf.find_ar()
+	conf.fc_flags()
+	conf.fc_add_flags()
+	conf.g95_flags()
+	conf.g95_modifier_platform()
Index: waflib/Tools/gas.py
===================================================================
--- waflib/Tools/gas.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/gas.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,12 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import waflib.Tools.asm
+from waflib.Tools import ar
+def configure(conf):
+	conf.find_program(['gas','gcc'],var='AS')
+	conf.env.AS_TGT_F=['-c','-o']
+	conf.env.ASLNK_TGT_F=['-o']
+	conf.find_ar()
+	conf.load('asm')
Index: waflib/Tools/gcc.py
===================================================================
--- waflib/Tools/gcc.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/gcc.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,97 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import os,sys
+from waflib import Configure,Options,Utils
+from waflib.Tools import ccroot,ar
+from waflib.Configure import conf
+@conf
+def find_gcc(conf):
+	cc=conf.find_program(['gcc','cc'],var='CC')
+	cc=conf.cmd_to_list(cc)
+	conf.get_cc_version(cc,gcc=True)
+	conf.env.CC_NAME='gcc'
+	conf.env.CC=cc
+@conf
+def gcc_common_flags(conf):
+	v=conf.env
+	v['CC_SRC_F']=[]
+	v['CC_TGT_F']=['-c','-o']
+	if not v['LINK_CC']:v['LINK_CC']=v['CC']
+	v['CCLNK_SRC_F']=[]
+	v['CCLNK_TGT_F']=['-o']
+	v['CPPPATH_ST']='-I%s'
+	v['DEFINES_ST']='-D%s'
+	v['LIB_ST']='-l%s'
+	v['LIBPATH_ST']='-L%s'
+	v['STLIB_ST']='-l%s'
+	v['STLIBPATH_ST']='-L%s'
+	v['RPATH_ST']='-Wl,-rpath,%s'
+	v['SONAME_ST']='-Wl,-h,%s'
+	v['SHLIB_MARKER']='-Wl,-Bdynamic'
+	v['STLIB_MARKER']='-Wl,-Bstatic'
+	v['cprogram_PATTERN']='%s'
+	v['CFLAGS_cshlib']=['-fPIC']
+	v['LINKFLAGS_cshlib']=['-shared']
+	v['cshlib_PATTERN']='lib%s.so'
+	v['LINKFLAGS_cstlib']=['-Wl,-Bstatic']
+	v['cstlib_PATTERN']='lib%s.a'
+	v['LINKFLAGS_MACBUNDLE']=['-bundle','-undefined','dynamic_lookup']
+	v['CFLAGS_MACBUNDLE']=['-fPIC']
+	v['macbundle_PATTERN']='%s.bundle'
+@conf
+def gcc_modifier_win32(conf):
+	v=conf.env
+	v['cprogram_PATTERN']='%s.exe'
+	v['cshlib_PATTERN']='%s.dll'
+	v['implib_PATTERN']='lib%s.dll.a'
+	v['IMPLIB_ST']='-Wl,--out-implib,%s'
+	v['CFLAGS_cshlib']=[]
+	v.append_value('LINKFLAGS',['-Wl,--enable-auto-import'])
+@conf
+def gcc_modifier_cygwin(conf):
+	gcc_modifier_win32(conf)
+	v=conf.env
+	v['cshlib_PATTERN']='cyg%s.dll'
+	v.append_value('LINKFLAGS_cshlib',['-Wl,--enable-auto-image-base'])
+	v['CFLAGS_cshlib']=[]
+@conf
+def gcc_modifier_darwin(conf):
+	v=conf.env
+	v['CFLAGS_cshlib']=['-fPIC','-compatibility_version','1','-current_version','1']
+	v['LINKFLAGS_cshlib']=['-dynamiclib']
+	v['cshlib_PATTERN']='lib%s.dylib'
+	v['FRAMEWORKPATH_ST']='-F%s'
+	v['FRAMEWORK_ST']=['-framework']
+	v['ARCH_ST']=['-arch']
+	v['LINKFLAGS_cstlib']=[]
+	v['SHLIB_MARKER']=[]
+	v['STLIB_MARKER']=[]
+	v['SONAME_ST']=[]
+@conf
+def gcc_modifier_aix(conf):
+	v=conf.env
+	v['LINKFLAGS_cprogram']=['-Wl,-brtl']
+	v['LINKFLAGS_cshlib']=['-shared','-Wl,-brtl,-bexpfull']
+	v['SHLIB_MARKER']=[]
+@conf
+def gcc_modifier_hpux(conf):
+	v=conf.env
+	v['SHLIB_MARKER']=[]
+	v['STLIB_MARKER']='-Bstatic'
+	v['CFLAGS_cshlib']=['-fPIC','-DPIC']
+	v['cshlib_PATTERN']='lib%s.sl'
+@conf
+def gcc_modifier_platform(conf):
+	gcc_modifier_func=getattr(conf,'gcc_modifier_'+conf.env.DEST_OS,None)
+	if gcc_modifier_func:
+		gcc_modifier_func()
+def configure(conf):
+	conf.find_gcc()
+	conf.find_ar()
+	conf.gcc_common_flags()
+	conf.gcc_modifier_platform()
+	conf.cc_load_tools()
+	conf.cc_add_flags()
+	conf.link_add_flags()
Index: waflib/Tools/gdc.py
===================================================================
--- waflib/Tools/gdc.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/gdc.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,36 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import sys
+from waflib.Tools import ar,d
+from waflib.Configure import conf
+@conf
+def find_gdc(conf):
+	conf.find_program('gdc',var='D')
+	out=conf.cmd_and_log([conf.env.D,'--version'])
+	if out.find("gdc ")==-1:
+		conf.fatal("detected compiler is not gdc")
+@conf
+def common_flags_gdc(conf):
+	v=conf.env
+	v['DFLAGS']=[]
+	v['D_SRC_F']=['-c']
+	v['D_TGT_F']='-o%s'
+	v['D_LINKER']=v['D']
+	v['DLNK_SRC_F']=''
+	v['DLNK_TGT_F']='-o%s'
+	v['DINC_ST']='-I%s'
+	v['DSHLIB_MARKER']=v['DSTLIB_MARKER']=''
+	v['DSTLIB_ST']=v['DSHLIB_ST']='-l%s'
+	v['DSTLIBPATH_ST']=v['DLIBPATH_ST']='-L%s'
+	v['LINKFLAGS_dshlib']=['-shared']
+	v['DHEADER_ext']='.di'
+	v.DFLAGS_d_with_header='-fintfc'
+	v['D_HDR_F']='-fintfc-file=%s'
+def configure(conf):
+	conf.find_gdc()
+	conf.load('ar')
+	conf.load('d')
+	conf.common_flags_gdc()
+	conf.d_platform_flags()
Index: waflib/Tools/gfortran.py
===================================================================
--- waflib/Tools/gfortran.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/gfortran.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,69 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import re
+from waflib import Utils
+from waflib.Tools import fc,fc_config,fc_scan,ar
+from waflib.Configure import conf
+@conf
+def find_gfortran(conf):
+	fc=conf.find_program(['gfortran','g77'],var='FC')
+	fc=conf.cmd_to_list(fc)
+	conf.get_gfortran_version(fc)
+	conf.env.FC_NAME='GFORTRAN'
+@conf
+def gfortran_flags(conf):
+	v=conf.env
+	v['FCFLAGS_fcshlib']=['-fPIC']
+	v['FORTRANMODFLAG']=['-J','']
+	v['FCFLAGS_DEBUG']=['-Werror']
+@conf
+def gfortran_modifier_win32(conf):
+	fc_config.fortran_modifier_win32(conf)
+@conf
+def gfortran_modifier_cygwin(conf):
+	fc_config.fortran_modifier_cygwin(conf)
+@conf
+def gfortran_modifier_darwin(conf):
+	fc_config.fortran_modifier_darwin(conf)
+@conf
+def gfortran_modifier_platform(conf):
+	dest_os=conf.env['DEST_OS']or Utils.unversioned_sys_platform()
+	gfortran_modifier_func=getattr(conf,'gfortran_modifier_'+dest_os,None)
+	if gfortran_modifier_func:
+		gfortran_modifier_func()
+@conf
+def get_gfortran_version(conf,fc):
+	version_re=re.compile(r"GNU\s*Fortran",re.I).search
+	cmd=fc+['--version']
+	out,err=fc_config.getoutput(conf,cmd,stdin=False)
+	if out:match=version_re(out)
+	else:match=version_re(err)
+	if not match:
+		conf.fatal('Could not determine the compiler type')
+	cmd=fc+['-dM','-E','-']
+	out,err=fc_config.getoutput(conf,cmd,stdin=True)
+	if out.find('__GNUC__')<0:
+		conf.fatal('Could not determine the compiler type')
+	k={}
+	out=out.split('\n')
+	import shlex
+	for line in out:
+		lst=shlex.split(line)
+		if len(lst)>2:
+			key=lst[1]
+			val=lst[2]
+			k[key]=val
+	def isD(var):
+		return var in k
+	def isT(var):
+		return var in k and k[var]!='0'
+	conf.env['FC_VERSION']=(k['__GNUC__'],k['__GNUC_MINOR__'],k['__GNUC_PATCHLEVEL__'])
+def configure(conf):
+	conf.find_gfortran()
+	conf.find_ar()
+	conf.fc_flags()
+	conf.fc_add_flags()
+	conf.gfortran_flags()
+	conf.gfortran_modifier_platform()
Index: waflib/Tools/glib2.py
===================================================================
--- waflib/Tools/glib2.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/glib2.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,173 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import os
+from waflib import Task,Utils,Options,Errors,Logs
+from waflib.TaskGen import taskgen_method,before_method,after_method,feature
+@taskgen_method
+def add_marshal_file(self,filename,prefix):
+	if not hasattr(self,'marshal_list'):
+		self.marshal_list=[]
+	self.meths.append('process_marshal')
+	self.marshal_list.append((filename,prefix))
+@before_method('process_source')
+def process_marshal(self):
+	for f,prefix in getattr(self,'marshal_list',[]):
+		node=self.path.find_resource(f)
+		if not node:
+			raise Errors.WafError('file not found %r'%f)
+		h_node=node.change_ext('.h')
+		c_node=node.change_ext('.c')
+		task=self.create_task('glib_genmarshal',node,[h_node,c_node])
+		task.env.GLIB_GENMARSHAL_PREFIX=prefix
+	self.source=self.to_nodes(getattr(self,'source',[]))
+	self.source.append(c_node)
+class glib_genmarshal(Task.Task):
+	def run(self):
+		bld=self.inputs[0].__class__.ctx
+		get=self.env.get_flat
+		cmd1="%s %s --prefix=%s --header > %s"%(get('GLIB_GENMARSHAL'),self.inputs[0].srcpath(),get('GLIB_GENMARSHAL_PREFIX'),self.outputs[0].abspath())
+		ret=bld.exec_command(cmd1)
+		if ret:return ret
+		c='''#include "%s"\n'''%self.outputs[0].name
+		self.outputs[1].write(c)
+		cmd2="%s %s --prefix=%s --body >> %s"%(get('GLIB_GENMARSHAL'),self.inputs[0].srcpath(),get('GLIB_GENMARSHAL_PREFIX'),self.outputs[1].abspath())
+		return bld.exec_command(cmd2)
+	vars=['GLIB_GENMARSHAL_PREFIX','GLIB_GENMARSHAL']
+	color='BLUE'
+	ext_out=['.h']
+@taskgen_method
+def add_enums_from_template(self,source='',target='',template='',comments=''):
+	if not hasattr(self,'enums_list'):
+		self.enums_list=[]
+	self.meths.append('process_enums')
+	self.enums_list.append({'source':source,'target':target,'template':template,'file-head':'','file-prod':'','file-tail':'','enum-prod':'','value-head':'','value-prod':'','value-tail':'','comments':comments})
+@taskgen_method
+def add_enums(self,source='',target='',file_head='',file_prod='',file_tail='',enum_prod='',value_head='',value_prod='',value_tail='',comments=''):
+	if not hasattr(self,'enums_list'):
+		self.enums_list=[]
+	self.meths.append('process_enums')
+	self.enums_list.append({'source':source,'template':'','target':target,'file-head':file_head,'file-prod':file_prod,'file-tail':file_tail,'enum-prod':enum_prod,'value-head':value_head,'value-prod':value_prod,'value-tail':value_tail,'comments':comments})
+@before_method('process_source')
+def process_enums(self):
+	for enum in getattr(self,'enums_list',[]):
+		task=self.create_task('glib_mkenums')
+		env=task.env
+		inputs=[]
+		source_list=self.to_list(enum['source'])
+		if not source_list:
+			raise Errors.WafError('missing source '+str(enum))
+		source_list=[self.path.find_resource(k)for k in source_list]
+		inputs+=source_list
+		env['GLIB_MKENUMS_SOURCE']=[k.abspath()for k in source_list]
+		if not enum['target']:
+			raise Errors.WafError('missing target '+str(enum))
+		tgt_node=self.path.find_or_declare(enum['target'])
+		if tgt_node.name.endswith('.c'):
+			self.source.append(tgt_node)
+		env['GLIB_MKENUMS_TARGET']=tgt_node.abspath()
+		options=[]
+		if enum['template']:
+			template_node=self.path.find_resource(enum['template'])
+			options.append('--template %s'%(template_node.abspath()))
+			inputs.append(template_node)
+		params={'file-head':'--fhead','file-prod':'--fprod','file-tail':'--ftail','enum-prod':'--eprod','value-head':'--vhead','value-prod':'--vprod','value-tail':'--vtail','comments':'--comments'}
+		for param,option in params.items():
+			if enum[param]:
+				options.append('%s %r'%(option,enum[param]))
+		env['GLIB_MKENUMS_OPTIONS']=' '.join(options)
+		task.set_inputs(inputs)
+		task.set_outputs(tgt_node)
+class glib_mkenums(Task.Task):
+	run_str='${GLIB_MKENUMS} ${GLIB_MKENUMS_OPTIONS} ${GLIB_MKENUMS_SOURCE} > ${GLIB_MKENUMS_TARGET}'
+	color='PINK'
+	ext_out=['.h']
+@taskgen_method
+def add_settings_schemas(self,filename_list):
+	if not hasattr(self,'settings_schema_files'):
+		self.settings_schema_files=[]
+	if not isinstance(filename_list,list):
+		filename_list=[filename_list]
+	self.settings_schema_files.extend(filename_list)
+@taskgen_method
+def add_settings_enums(self,namespace,filename_list):
+	if hasattr(self,'settings_enum_namespace'):
+		raise Errors.WafError("Tried to add gsettings enums to '%s' more than once"%self.name)
+	self.settings_enum_namespace=namespace
+	if type(filename_list)!='list':
+		filename_list=[filename_list]
+	self.settings_enum_files=filename_list
+def r_change_ext(self,ext):
+	name=self.name
+	k=name.rfind('.')
+	if k>=0:
+		name=name[:k]+ext
+	else:
+		name=name+ext
+	return self.parent.find_or_declare([name])
+@feature('glib2')
+def process_settings(self):
+	enums_tgt_node=[]
+	install_files=[]
+	settings_schema_files=getattr(self,'settings_schema_files',[])
+	if settings_schema_files and not self.env['GLIB_COMPILE_SCHEMAS']:
+		raise Errors.WafError("Unable to process GSettings schemas - glib-compile-schemas was not found during configure")
+	if hasattr(self,'settings_enum_files'):
+		enums_task=self.create_task('glib_mkenums')
+		source_list=self.settings_enum_files
+		source_list=[self.path.find_resource(k)for k in source_list]
+		enums_task.set_inputs(source_list)
+		enums_task.env['GLIB_MKENUMS_SOURCE']=[k.abspath()for k in source_list]
+		target=self.settings_enum_namespace+'.enums.xml'
+		tgt_node=self.path.find_or_declare(target)
+		enums_task.set_outputs(tgt_node)
+		enums_task.env['GLIB_MKENUMS_TARGET']=tgt_node.abspath()
+		enums_tgt_node=[tgt_node]
+		install_files.append(tgt_node)
+		options='--comments "<!-- @comment@ -->" --fhead "<schemalist>" --vhead "  <@type@ id=\\"%s.@EnumName@\\">" --vprod "    <value nick=\\"@valuenick@\\" value=\\"@valuenum@\\"/>" --vtail "  </@type@>" --ftail "</schemalist>" '%(self.settings_enum_namespace)
+		enums_task.env['GLIB_MKENUMS_OPTIONS']=options
+	for schema in settings_schema_files:
+		schema_task=self.create_task('glib_validate_schema')
+		schema_node=self.path.find_resource(schema)
+		if not schema_node:
+			raise Errors.WafError("Cannot find the schema file '%s'"%schema)
+		install_files.append(schema_node)
+		source_list=enums_tgt_node+[schema_node]
+		schema_task.set_inputs(source_list)
+		schema_task.env['GLIB_COMPILE_SCHEMAS_OPTIONS']=[("--schema-file="+k.abspath())for k in source_list]
+		target_node=r_change_ext(schema_node,'.xml.valid')
+		schema_task.set_outputs(target_node)
+		schema_task.env['GLIB_VALIDATE_SCHEMA_OUTPUT']=target_node.abspath()
+	def compile_schemas_callback(bld):
+		if not bld.is_install:return
+		Logs.pprint('YELLOW','Updating GSettings schema cache')
+		command=Utils.subst_vars("${GLIB_COMPILE_SCHEMAS} ${GSETTINGSSCHEMADIR}",bld.env)
+		ret=self.bld.exec_command(command)
+	if self.bld.is_install:
+		if not self.env['GSETTINGSSCHEMADIR']:
+			raise Errors.WafError('GSETTINGSSCHEMADIR not defined (should have been set up automatically during configure)')
+		if install_files:
+			self.bld.install_files(self.env['GSETTINGSSCHEMADIR'],install_files)
+			if not hasattr(self.bld,'_compile_schemas_registered'):
+				self.bld.add_post_fun(compile_schemas_callback)
+				self.bld._compile_schemas_registered=True
+class glib_validate_schema(Task.Task):
+	run_str='rm -f ${GLIB_VALIDATE_SCHEMA_OUTPUT} && ${GLIB_COMPILE_SCHEMAS} --dry-run ${GLIB_COMPILE_SCHEMAS_OPTIONS} && touch ${GLIB_VALIDATE_SCHEMA_OUTPUT}'
+	color='PINK'
+def configure(conf):
+	conf.find_program('glib-genmarshal',var='GLIB_GENMARSHAL')
+	conf.find_perl_program('glib-mkenums',var='GLIB_MKENUMS')
+	conf.find_program('glib-compile-schemas',var='GLIB_COMPILE_SCHEMAS',mandatory=False)
+	def getstr(varname):
+		return getattr(Options.options,varname,getattr(conf.env,varname,''))
+	gsettingsschemadir=getstr('GSETTINGSSCHEMADIR')
+	if not gsettingsschemadir:
+		datadir=getstr('DATADIR')
+		if not datadir:
+			prefix=conf.env['PREFIX']
+			datadir=os.path.join(prefix,'share')
+		gsettingsschemadir=os.path.join(datadir,'glib-2.0','schemas')
+	conf.env['GSETTINGSSCHEMADIR']=gsettingsschemadir
+def options(opt):
+	opt.add_option('--gsettingsschemadir',help='GSettings schema location [Default: ${datadir}/glib-2.0/schemas]',default='',dest='GSETTINGSSCHEMADIR')
Index: waflib/Tools/gnu_dirs.py
===================================================================
--- waflib/Tools/gnu_dirs.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/gnu_dirs.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,65 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import os
+from waflib import Utils,Options,Context
+_options=[x.split(', ')for x in'''
+bindir, user executables, ${EXEC_PREFIX}/bin
+sbindir, system admin executables, ${EXEC_PREFIX}/sbin
+libexecdir, program executables, ${EXEC_PREFIX}/libexec
+sysconfdir, read-only single-machine data, ${PREFIX}/etc
+sharedstatedir, modifiable architecture-independent data, ${PREFIX}/com
+localstatedir, modifiable single-machine data, ${PREFIX}/var
+libdir, object code libraries, ${EXEC_PREFIX}/lib
+includedir, C header files, ${PREFIX}/include
+oldincludedir, C header files for non-gcc, /usr/include
+datarootdir, read-only arch.-independent data root, ${PREFIX}/share
+datadir, read-only architecture-independent data, ${DATAROOTDIR}
+infodir, info documentation, ${DATAROOTDIR}/info
+localedir, locale-dependent data, ${DATAROOTDIR}/locale
+mandir, man documentation, ${DATAROOTDIR}/man
+docdir, documentation root, ${DATAROOTDIR}/doc/${PACKAGE}
+htmldir, html documentation, ${DOCDIR}
+dvidir, dvi documentation, ${DOCDIR}
+pdfdir, pdf documentation, ${DOCDIR}
+psdir, ps documentation, ${DOCDIR}
+'''.split('\n')if x]
+def configure(conf):
+	def get_param(varname,default):
+		return getattr(Options.options,varname,'')or default
+	env=conf.env
+	env.LIBDIR=env.BINDIR=[]
+	env.EXEC_PREFIX=get_param('EXEC_PREFIX',env.PREFIX)
+	env.PACKAGE=getattr(Context.g_module,'APPNAME',None)or env.PACKAGE
+	complete=False
+	iter=0
+	while not complete and iter<len(_options)+1:
+		iter+=1
+		complete=True
+		for name,help,default in _options:
+			name=name.upper()
+			if not env[name]:
+				try:
+					env[name]=Utils.subst_vars(get_param(name,default).replace('/',os.sep),env)
+				except TypeError:
+					complete=False
+	if not complete:
+		lst=[name for name,_,_ in _options if not env[name.upper()]]
+		raise conf.errors.WafError('Variable substitution failure %r'%lst)
+def options(opt):
+	inst_dir=opt.add_option_group('Installation directories','By default, "waf install" will put the files in\
+ "/usr/local/bin", "/usr/local/lib" etc. An installation prefix other\
+ than "/usr/local" can be given using "--prefix", for example "--prefix=$HOME"')
+	for k in('--prefix','--destdir'):
+		option=opt.parser.get_option(k)
+		if option:
+			opt.parser.remove_option(k)
+			inst_dir.add_option(option)
+	inst_dir.add_option('--exec-prefix',help='installation prefix [Default: ${PREFIX}]',default='',dest='EXEC_PREFIX')
+	dirs_options=opt.add_option_group('Pre-defined installation directories','')
+	for name,help,default in _options:
+		option_name='--'+name
+		str_default=default
+		str_help='%s [Default: %s]'%(help,str_default)
+		dirs_options.add_option(option_name,help=str_help,default='',dest=name.upper())
Index: waflib/Tools/gxx.py
===================================================================
--- waflib/Tools/gxx.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/gxx.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,97 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import os,sys
+from waflib import Configure,Options,Utils
+from waflib.Tools import ccroot,ar
+from waflib.Configure import conf
+@conf
+def find_gxx(conf):
+	cxx=conf.find_program(['g++','c++'],var='CXX')
+	cxx=conf.cmd_to_list(cxx)
+	conf.get_cc_version(cxx,gcc=True)
+	conf.env.CXX_NAME='gcc'
+	conf.env.CXX=cxx
+@conf
+def gxx_common_flags(conf):
+	v=conf.env
+	v['CXX_SRC_F']=[]
+	v['CXX_TGT_F']=['-c','-o']
+	if not v['LINK_CXX']:v['LINK_CXX']=v['CXX']
+	v['CXXLNK_SRC_F']=[]
+	v['CXXLNK_TGT_F']=['-o']
+	v['CPPPATH_ST']='-I%s'
+	v['DEFINES_ST']='-D%s'
+	v['LIB_ST']='-l%s'
+	v['LIBPATH_ST']='-L%s'
+	v['STLIB_ST']='-l%s'
+	v['STLIBPATH_ST']='-L%s'
+	v['RPATH_ST']='-Wl,-rpath,%s'
+	v['SONAME_ST']='-Wl,-h,%s'
+	v['SHLIB_MARKER']='-Wl,-Bdynamic'
+	v['STLIB_MARKER']='-Wl,-Bstatic'
+	v['cxxprogram_PATTERN']='%s'
+	v['CXXFLAGS_cxxshlib']=['-fPIC']
+	v['LINKFLAGS_cxxshlib']=['-shared']
+	v['cxxshlib_PATTERN']='lib%s.so'
+	v['LINKFLAGS_cxxstlib']=['-Wl,-Bstatic']
+	v['cxxstlib_PATTERN']='lib%s.a'
+	v['LINKFLAGS_MACBUNDLE']=['-bundle','-undefined','dynamic_lookup']
+	v['CXXFLAGS_MACBUNDLE']=['-fPIC']
+	v['macbundle_PATTERN']='%s.bundle'
+@conf
+def gxx_modifier_win32(conf):
+	v=conf.env
+	v['cxxprogram_PATTERN']='%s.exe'
+	v['cxxshlib_PATTERN']='%s.dll'
+	v['implib_PATTERN']='lib%s.dll.a'
+	v['IMPLIB_ST']='-Wl,--out-implib,%s'
+	v['CXXFLAGS_cxxshlib']=[]
+	v.append_value('LINKFLAGS',['-Wl,--enable-auto-import'])
+@conf
+def gxx_modifier_cygwin(conf):
+	gxx_modifier_win32(conf)
+	v=conf.env
+	v['cxxshlib_PATTERN']='cyg%s.dll'
+	v.append_value('LINKFLAGS_cxxshlib',['-Wl,--enable-auto-image-base'])
+	v['CXXFLAGS_cxxshlib']=[]
+@conf
+def gxx_modifier_darwin(conf):
+	v=conf.env
+	v['CXXFLAGS_cxxshlib']=['-fPIC','-compatibility_version','1','-current_version','1']
+	v['LINKFLAGS_cxxshlib']=['-dynamiclib']
+	v['cxxshlib_PATTERN']='lib%s.dylib'
+	v['FRAMEWORKPATH_ST']='-F%s'
+	v['FRAMEWORK_ST']=['-framework']
+	v['ARCH_ST']=['-arch']
+	v['LINKFLAGS_cxxstlib']=[]
+	v['SHLIB_MARKER']=[]
+	v['STLIB_MARKER']=[]
+	v['SONAME_ST']=[]
+@conf
+def gxx_modifier_aix(conf):
+	v=conf.env
+	v['LINKFLAGS_cxxprogram']=['-Wl,-brtl']
+	v['LINKFLAGS_cxxshlib']=['-shared','-Wl,-brtl,-bexpfull']
+	v['SHLIB_MARKER']=[]
+@conf
+def gxx_modifier_hpux(conf):
+	v=conf.env
+	v['SHLIB_MARKER']=[]
+	v['STLIB_MARKER']='-Bstatic'
+	v['CFLAGS_cxxshlib']=['-fPIC','-DPIC']
+	v['cxxshlib_PATTERN']='lib%s.sl'
+@conf
+def gxx_modifier_platform(conf):
+	gxx_modifier_func=getattr(conf,'gxx_modifier_'+conf.env.DEST_OS,None)
+	if gxx_modifier_func:
+		gxx_modifier_func()
+def configure(conf):
+	conf.find_gxx()
+	conf.find_ar()
+	conf.gxx_common_flags()
+	conf.gxx_modifier_platform()
+	conf.cxx_load_tools()
+	conf.cxx_add_flags()
+	conf.link_add_flags()
Index: waflib/Tools/icc.py
===================================================================
--- waflib/Tools/icc.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/icc.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,30 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import os,sys
+from waflib.Tools import ccroot,ar,gcc
+from waflib.Configure import conf
+@conf
+def find_icc(conf):
+	if sys.platform=='cygwin':
+		conf.fatal('The Intel compiler does not work on Cygwin')
+	v=conf.env
+	cc=None
+	if v['CC']:cc=v['CC']
+	elif'CC'in conf.environ:cc=conf.environ['CC']
+	if not cc:cc=conf.find_program('icc',var='CC')
+	if not cc:cc=conf.find_program('ICL',var='CC')
+	if not cc:conf.fatal('Intel C Compiler (icc) was not found')
+	cc=conf.cmd_to_list(cc)
+	conf.get_cc_version(cc,icc=True)
+	v['CC']=cc
+	v['CC_NAME']='icc'
+def configure(conf):
+	conf.find_icc()
+	conf.find_ar()
+	conf.gcc_common_flags()
+	conf.gcc_modifier_platform()
+	conf.cc_load_tools()
+	conf.cc_add_flags()
+	conf.link_add_flags()
Index: waflib/Tools/icpc.py
===================================================================
--- waflib/Tools/icpc.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/icpc.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,29 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import os,sys
+from waflib.Tools import ccroot,ar,gxx
+from waflib.Configure import conf
+@conf
+def find_icpc(conf):
+	if sys.platform=='cygwin':
+		conf.fatal('The Intel compiler does not work on Cygwin')
+	v=conf.env
+	cxx=None
+	if v['CXX']:cxx=v['CXX']
+	elif'CXX'in conf.environ:cxx=conf.environ['CXX']
+	if not cxx:cxx=conf.find_program('icpc',var='CXX')
+	if not cxx:conf.fatal('Intel C++ Compiler (icpc) was not found')
+	cxx=conf.cmd_to_list(cxx)
+	conf.get_cc_version(cxx,icc=True)
+	v['CXX']=cxx
+	v['CXX_NAME']='icc'
+def configure(conf):
+	conf.find_icpc()
+	conf.find_ar()
+	conf.gxx_common_flags()
+	conf.gxx_modifier_platform()
+	conf.cxx_load_tools()
+	conf.cxx_add_flags()
+	conf.link_add_flags()
Index: waflib/Tools/ifort.py
===================================================================
--- waflib/Tools/ifort.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/ifort.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,49 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import re
+from waflib import Utils
+from waflib.Tools import fc,fc_config,fc_scan,ar
+from waflib.Configure import conf
+@conf
+def find_ifort(conf):
+	fc=conf.find_program('ifort',var='FC')
+	fc=conf.cmd_to_list(fc)
+	conf.get_ifort_version(fc)
+	conf.env.FC_NAME='IFORT'
+@conf
+def ifort_modifier_cygwin(conf):
+	raise NotImplementedError("Ifort on cygwin not yet implemented")
+@conf
+def ifort_modifier_win32(conf):
+	fc_config.fortran_modifier_win32(conf)
+@conf
+def ifort_modifier_darwin(conf):
+	fc_config.fortran_modifier_darwin(conf)
+@conf
+def ifort_modifier_platform(conf):
+	dest_os=conf.env['DEST_OS']or Utils.unversioned_sys_platform()
+	ifort_modifier_func=getattr(conf,'ifort_modifier_'+dest_os,None)
+	if ifort_modifier_func:
+		ifort_modifier_func()
+@conf
+def get_ifort_version(conf,fc):
+	version_re=re.compile(r"ifort\s*\(IFORT\)\s*(?P<major>\d*)\.(?P<minor>\d*)",re.I).search
+	cmd=fc+['--version']
+	out,err=fc_config.getoutput(conf,cmd,stdin=False)
+	if out:
+		match=version_re(out)
+	else:
+		match=version_re(err)
+	if not match:
+		conf.fatal('cannot determine ifort version.')
+	k=match.groupdict()
+	conf.env['FC_VERSION']=(k['major'],k['minor'])
+def configure(conf):
+	conf.find_ifort()
+	conf.find_program('xiar',var='AR')
+	conf.env.ARFLAGS='rcs'
+	conf.fc_flags()
+	conf.fc_add_flags()
+	conf.ifort_modifier_platform()
Index: waflib/Tools/intltool.py
===================================================================
--- waflib/Tools/intltool.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/intltool.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,77 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import os,re
+from waflib import Configure,TaskGen,Task,Utils,Runner,Options,Build,Logs
+import waflib.Tools.ccroot
+from waflib.TaskGen import feature,before_method
+from waflib.Logs import error
+@before_method('process_source')
+@feature('intltool_in')
+def apply_intltool_in_f(self):
+	try:self.meths.remove('process_source')
+	except ValueError:pass
+	if not self.env.LOCALEDIR:
+		self.env.LOCALEDIR=self.env.PREFIX+'/share/locale'
+	for i in self.to_list(self.source):
+		node=self.path.find_resource(i)
+		podir=getattr(self,'podir','po')
+		podirnode=self.path.find_dir(podir)
+		if not podirnode:
+			error("could not find the podir %r"%podir)
+			continue
+		cache=getattr(self,'intlcache','.intlcache')
+		self.env['INTLCACHE']=os.path.join(self.path.bldpath(),podir,cache)
+		self.env['INTLPODIR']=podirnode.bldpath()
+		self.env['INTLFLAGS']=getattr(self,'flags',['-q','-u','-c'])
+		task=self.create_task('intltool',node,node.change_ext(''))
+		inst=getattr(self,'install_path','${LOCALEDIR}')
+		if inst:
+			self.bld.install_files(inst,task.outputs)
+@feature('intltool_po')
+def apply_intltool_po(self):
+	try:self.meths.remove('process_source')
+	except ValueError:pass
+	if not self.env.LOCALEDIR:
+		self.env.LOCALEDIR=self.env.PREFIX+'/share/locale'
+	appname=getattr(self,'appname','set_your_app_name')
+	podir=getattr(self,'podir','')
+	inst=getattr(self,'install_path','${LOCALEDIR}')
+	linguas=self.path.find_node(os.path.join(podir,'LINGUAS'))
+	if linguas:
+		file=open(linguas.abspath())
+		langs=[]
+		for line in file.readlines():
+			if not line.startswith('#'):
+				langs+=line.split()
+		file.close()
+		re_linguas=re.compile('[-a-zA-Z_@.]+')
+		for lang in langs:
+			if re_linguas.match(lang):
+				node=self.path.find_resource(os.path.join(podir,re_linguas.match(lang).group()+'.po'))
+				task=self.create_task('po',node,node.change_ext('.mo'))
+				if inst:
+					filename=task.outputs[0].name
+					(langname,ext)=os.path.splitext(filename)
+					inst_file=inst+os.sep+langname+os.sep+'LC_MESSAGES'+os.sep+appname+'.mo'
+					self.bld.install_as(inst_file,task.outputs[0],chmod=getattr(self,'chmod',Utils.O644),env=task.env)
+	else:
+		Logs.pprint('RED',"Error no LINGUAS file found in po directory")
+class po(Task.Task):
+	run_str='${MSGFMT} -o ${TGT} ${SRC}'
+	color='BLUE'
+class intltool(Task.Task):
+	run_str='${INTLTOOL} ${INTLFLAGS} ${INTLCACHE} ${INTLPODIR} ${SRC} ${TGT}'
+	color='BLUE'
+def configure(conf):
+	conf.find_program('msgfmt',var='MSGFMT')
+	conf.find_perl_program('intltool-merge',var='INTLTOOL')
+	prefix=conf.env.PREFIX
+	datadir=conf.env.DATADIR
+	if not datadir:
+		datadir=os.path.join(prefix,'share')
+	conf.define('LOCALEDIR',os.path.join(datadir,'locale').replace('\\','\\\\'))
+	conf.define('DATADIR',datadir.replace('\\','\\\\'))
+	if conf.env.CC or conf.env.CXX:
+		conf.check(header_name='locale.h')
Index: waflib/Tools/irixcc.py
===================================================================
--- waflib/Tools/irixcc.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/irixcc.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,48 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import os
+from waflib import Utils
+from waflib.Tools import ccroot,ar
+from waflib.Configure import conf
+@conf
+def find_irixcc(conf):
+	v=conf.env
+	cc=None
+	if v['CC']:cc=v['CC']
+	elif'CC'in conf.environ:cc=conf.environ['CC']
+	if not cc:cc=conf.find_program('cc',var='CC')
+	if not cc:conf.fatal('irixcc was not found')
+	cc=conf.cmd_to_list(cc)
+	try:
+		conf.cmd_and_log(cc+['-version'])
+	except Exception:
+		conf.fatal('%r -version could not be executed'%cc)
+	v['CC']=cc
+	v['CC_NAME']='irix'
+@conf
+def irixcc_common_flags(conf):
+	v=conf.env
+	v['CC_SRC_F']=''
+	v['CC_TGT_F']=['-c','-o']
+	v['CPPPATH_ST']='-I%s'
+	v['DEFINES_ST']='-D%s'
+	if not v['LINK_CC']:v['LINK_CC']=v['CC']
+	v['CCLNK_SRC_F']=''
+	v['CCLNK_TGT_F']=['-o']
+	v['LIB_ST']='-l%s'
+	v['LIBPATH_ST']='-L%s'
+	v['STLIB_ST']='-l%s'
+	v['STLIBPATH_ST']='-L%s'
+	v['cprogram_PATTERN']='%s'
+	v['cshlib_PATTERN']='lib%s.so'
+	v['cstlib_PATTERN']='lib%s.a'
+def configure(conf):
+	conf.find_irixcc()
+	conf.find_cpp()
+	conf.find_ar()
+	conf.irixcc_common_flags()
+	conf.cc_load_tools()
+	conf.cc_add_flags()
+	conf.link_add_flags()
Index: waflib/Tools/javaw.py
===================================================================
--- waflib/Tools/javaw.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/javaw.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,311 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import os,re,tempfile,shutil
+from waflib import TaskGen,Task,Utils,Options,Build,Errors,Node,Logs
+from waflib.Configure import conf
+from waflib.TaskGen import feature,before_method,after_method
+from waflib.Tools import ccroot
+ccroot.USELIB_VARS['javac']=set(['CLASSPATH','JAVACFLAGS'])
+SOURCE_RE='**/*.java'
+JAR_RE='**/*'
+class_check_source='''
+public class Test {
+	public static void main(String[] argv) {
+		Class lib;
+		if (argv.length < 1) {
+			System.err.println("Missing argument");
+			System.exit(77);
+		}
+		try {
+			lib = Class.forName(argv[0]);
+		} catch (ClassNotFoundException e) {
+			System.err.println("ClassNotFoundException");
+			System.exit(1);
+		}
+		lib = null;
+		System.exit(0);
+	}
+}
+'''
+@feature('javac')
+@before_method('process_source')
+def apply_java(self):
+	Utils.def_attrs(self,jarname='',classpath='',sourcepath='.',srcdir='.',jar_mf_attributes={},jar_mf_classpath=[])
+	nodes_lst=[]
+	outdir=getattr(self,'outdir',None)
+	if outdir:
+		if not isinstance(outdir,Node.Node):
+			outdir=self.path.get_bld().make_node(self.outdir)
+	else:
+		outdir=self.path.get_bld()
+	outdir.mkdir()
+	self.outdir=outdir
+	self.env['OUTDIR']=outdir.abspath()
+	self.javac_task=tsk=self.create_task('javac')
+	tmp=[]
+	srcdir=getattr(self,'srcdir','')
+	if isinstance(srcdir,Node.Node):
+		srcdir=[srcdir]
+	for x in Utils.to_list(srcdir):
+		if isinstance(x,Node.Node):
+			y=x
+		else:
+			y=self.path.find_dir(x)
+			if not y:
+				self.bld.fatal('Could not find the folder %s from %s'%(x,self.path))
+		tmp.append(y)
+	tsk.srcdir=tmp
+	if getattr(self,'compat',None):
+		tsk.env.append_value('JAVACFLAGS',['-source',self.compat])
+	if hasattr(self,'sourcepath'):
+		fold=[isinstance(x,Node.Node)and x or self.path.find_dir(x)for x in self.to_list(self.sourcepath)]
+		names=os.pathsep.join([x.srcpath()for x in fold])
+	else:
+		names=[x.srcpath()for x in tsk.srcdir]
+	if names:
+		tsk.env.append_value('JAVACFLAGS',['-sourcepath',names])
+@feature('javac')
+@after_method('apply_java')
+def use_javac_files(self):
+	lst=[]
+	self.uselib=self.to_list(getattr(self,'uselib',[]))
+	names=self.to_list(getattr(self,'use',[]))
+	get=self.bld.get_tgen_by_name
+	for x in names:
+		try:
+			y=get(x)
+		except Exception:
+			self.uselib.append(x)
+		else:
+			y.post()
+			lst.append(y.jar_task.outputs[0].abspath())
+			self.javac_task.set_run_after(y.jar_task)
+	if lst:
+		self.env.append_value('CLASSPATH',lst)
+@feature('javac')
+@after_method('apply_java','propagate_uselib_vars','use_javac_files')
+def set_classpath(self):
+	self.env.append_value('CLASSPATH',getattr(self,'classpath',[]))
+	for x in self.tasks:
+		x.env.CLASSPATH=os.pathsep.join(self.env.CLASSPATH)+os.pathsep
+@feature('jar')
+@after_method('apply_java','use_javac_files')
+@before_method('process_source')
+def jar_files(self):
+	destfile=getattr(self,'destfile','test.jar')
+	jaropts=getattr(self,'jaropts',[])
+	manifest=getattr(self,'manifest',None)
+	basedir=getattr(self,'basedir',None)
+	if basedir:
+		if not isinstance(self.basedir,Node.Node):
+			basedir=self.path.get_bld().make_node(basedir)
+	else:
+		basedir=self.path.get_bld()
+	if not basedir:
+		self.bld.fatal('Could not find the basedir %r for %r'%(self.basedir,self))
+	self.jar_task=tsk=self.create_task('jar_create')
+	if manifest:
+		jarcreate=getattr(self,'jarcreate','cfm')
+		node=self.path.find_node(manifest)
+		tsk.dep_nodes.append(node)
+		jaropts.insert(0,node.abspath())
+	else:
+		jarcreate=getattr(self,'jarcreate','cf')
+	if not isinstance(destfile,Node.Node):
+		destfile=self.path.find_or_declare(destfile)
+	if not destfile:
+		self.bld.fatal('invalid destfile %r for %r'%(destfile,self))
+	tsk.set_outputs(destfile)
+	tsk.basedir=basedir
+	jaropts.append('-C')
+	jaropts.append(basedir.bldpath())
+	jaropts.append('.')
+	tsk.env['JAROPTS']=jaropts
+	tsk.env['JARCREATE']=jarcreate
+	if getattr(self,'javac_task',None):
+		tsk.set_run_after(self.javac_task)
+@feature('jar')
+@after_method('jar_files')
+def use_jar_files(self):
+	lst=[]
+	self.uselib=self.to_list(getattr(self,'uselib',[]))
+	names=self.to_list(getattr(self,'use',[]))
+	get=self.bld.get_tgen_by_name
+	for x in names:
+		try:
+			y=get(x)
+		except Exception:
+			self.uselib.append(x)
+		else:
+			y.post()
+			self.jar_task.run_after.update(y.tasks)
+class jar_create(Task.Task):
+	color='GREEN'
+	run_str='${JAR} ${JARCREATE} ${TGT} ${JAROPTS}'
+	def runnable_status(self):
+		for t in self.run_after:
+			if not t.hasrun:
+				return Task.ASK_LATER
+		if not self.inputs:
+			global JAR_RE
+			try:
+				self.inputs=[x for x in self.basedir.ant_glob(JAR_RE,remove=False)if id(x)!=id(self.outputs[0])]
+			except Exception:
+				raise Errors.WafError('Could not find the basedir %r for %r'%(self.basedir,self))
+		return super(jar_create,self).runnable_status()
+class javac(Task.Task):
+	color='BLUE'
+	nocache=True
+	vars=['CLASSPATH','JAVACFLAGS','JAVAC','OUTDIR']
+	def runnable_status(self):
+		for t in self.run_after:
+			if not t.hasrun:
+				return Task.ASK_LATER
+		if not self.inputs:
+			global SOURCE_RE
+			self.inputs=[]
+			for x in self.srcdir:
+				self.inputs.extend(x.ant_glob(SOURCE_RE,remove=False))
+		return super(javac,self).runnable_status()
+	def run(self):
+		env=self.env
+		gen=self.generator
+		bld=gen.bld
+		wd=bld.bldnode.abspath()
+		def to_list(xx):
+			if isinstance(xx,str):return[xx]
+			return xx
+		cmd=[]
+		cmd.extend(to_list(env['JAVAC']))
+		cmd.extend(['-classpath'])
+		cmd.extend(to_list(env['CLASSPATH']))
+		cmd.extend(['-d'])
+		cmd.extend(to_list(env['OUTDIR']))
+		cmd.extend(to_list(env['JAVACFLAGS']))
+		files=[a.path_from(bld.bldnode)for a in self.inputs]
+		tmp=None
+		try:
+			if len(str(files))+len(str(cmd))>8192:
+				(fd,tmp)=tempfile.mkstemp(dir=bld.bldnode.abspath())
+				try:
+					os.write(fd,'\n'.join(files))
+				finally:
+					if tmp:
+						os.close(fd)
+				if Logs.verbose:
+					Logs.debug('runner: %r'%(cmd+files))
+				cmd.append('@'+tmp)
+			else:
+				cmd+=files
+			ret=self.exec_command(cmd,cwd=wd,env=env.env or None)
+		finally:
+			if tmp:
+				os.unlink(tmp)
+		return ret
+	def post_run(self):
+		for n in self.generator.outdir.ant_glob('**/*.class'):
+			n.sig=Utils.h_file(n.abspath())
+		self.generator.bld.task_sigs[self.uid()]=self.cache_sig
+@feature('javadoc')
+@after_method('process_rule')
+def create_javadoc(self):
+	tsk=self.create_task('javadoc')
+	tsk.classpath=getattr(self,'classpath',[])
+	self.javadoc_package=Utils.to_list(self.javadoc_package)
+	if not isinstance(self.javadoc_output,Node.Node):
+		self.javadoc_output=self.bld.path.find_or_declare(self.javadoc_output)
+class javadoc(Task.Task):
+	color='BLUE'
+	def __str__(self):
+		return'%s: %s -> %s\n'%(self.__class__.__name__,self.generator.srcdir,self.generator.javadoc_output)
+	def run(self):
+		env=self.env
+		bld=self.generator.bld
+		wd=bld.bldnode.abspath()
+		srcpath=self.generator.path.abspath()+os.sep+self.generator.srcdir
+		srcpath+=os.pathsep
+		srcpath+=self.generator.path.get_bld().abspath()+os.sep+self.generator.srcdir
+		classpath=env.CLASSPATH
+		classpath+=os.pathsep
+		classpath+=os.pathsep.join(self.classpath)
+		classpath="".join(classpath)
+		self.last_cmd=lst=[]
+		lst.extend(Utils.to_list(env['JAVADOC']))
+		lst.extend(['-d',self.generator.javadoc_output.abspath()])
+		lst.extend(['-sourcepath',srcpath])
+		lst.extend(['-classpath',classpath])
+		lst.extend(['-subpackages'])
+		lst.extend(self.generator.javadoc_package)
+		lst=[x for x in lst if x]
+		self.generator.bld.cmd_and_log(lst,cwd=wd,env=env.env or None,quiet=0)
+	def post_run(self):
+		nodes=self.generator.javadoc_output.ant_glob('**')
+		for x in nodes:
+			x.sig=Utils.h_file(x.abspath())
+		self.generator.bld.task_sigs[self.uid()]=self.cache_sig
+def configure(self):
+	java_path=self.environ['PATH'].split(os.pathsep)
+	v=self.env
+	if'JAVA_HOME'in self.environ:
+		java_path=[os.path.join(self.environ['JAVA_HOME'],'bin')]+java_path
+		self.env['JAVA_HOME']=[self.environ['JAVA_HOME']]
+	for x in'javac java jar javadoc'.split():
+		self.find_program(x,var=x.upper(),path_list=java_path)
+		self.env[x.upper()]=self.cmd_to_list(self.env[x.upper()])
+	if'CLASSPATH'in self.environ:
+		v['CLASSPATH']=self.environ['CLASSPATH']
+	if not v['JAR']:self.fatal('jar is required for making java packages')
+	if not v['JAVAC']:self.fatal('javac is required for compiling java classes')
+	v['JARCREATE']='cf'
+	v['JAVACFLAGS']=[]
+@conf
+def check_java_class(self,classname,with_classpath=None):
+	javatestdir='.waf-javatest'
+	classpath=javatestdir
+	if self.env['CLASSPATH']:
+		classpath+=os.pathsep+self.env['CLASSPATH']
+	if isinstance(with_classpath,str):
+		classpath+=os.pathsep+with_classpath
+	shutil.rmtree(javatestdir,True)
+	os.mkdir(javatestdir)
+	java_file=open(os.path.join(javatestdir,'Test.java'),'w')
+	java_file.write(class_check_source)
+	java_file.close()
+	self.exec_command(self.env['JAVAC']+[os.path.join(javatestdir,'Test.java')],shell=False)
+	cmd=self.env['JAVA']+['-cp',classpath,'Test',classname]
+	self.to_log("%s\n"%str(cmd))
+	found=self.exec_command(cmd,shell=False)
+	self.msg('Checking for java class %s'%classname,not found)
+	shutil.rmtree(javatestdir,True)
+	return found
+@conf
+def check_jni_headers(conf):
+	if not conf.env.CC_NAME and not conf.env.CXX_NAME:
+		conf.fatal('load a compiler first (gcc, g++, ..)')
+	if not conf.env.JAVA_HOME:
+		conf.fatal('set JAVA_HOME in the system environment')
+	javaHome=conf.env['JAVA_HOME'][0]
+	dir=conf.root.find_dir(conf.env.JAVA_HOME[0]+'/include')
+	if dir is None:
+		dir=conf.root.find_dir(conf.env.JAVA_HOME[0]+'/../Headers')
+	if dir is None:
+		conf.fatal('JAVA_HOME does not seem to be set properly')
+	f=dir.ant_glob('**/(jni|jni_md).h')
+	incDirs=[x.parent.abspath()for x in f]
+	dir=conf.root.find_dir(conf.env.JAVA_HOME[0])
+	f=dir.ant_glob('**/*jvm.(so|dll|dylib)')
+	libDirs=[x.parent.abspath()for x in f]or[javaHome]
+	f=dir.ant_glob('**/*jvm.(lib)')
+	if f:
+		libDirs=[[x,y.parent.abspath()]for x in libDirs for y in f]
+	for d in libDirs:
+		try:
+			conf.check(header_name='jni.h',define_name='HAVE_JNI_H',lib='jvm',libpath=d,includes=incDirs,uselib_store='JAVA',uselib='JAVA')
+		except Exception:
+			pass
+		else:
+			break
+	else:
+		conf.fatal('could not find lib jvm in %r (see config.log)'%libDirs)
Index: waflib/Tools/kde4.py
===================================================================
--- waflib/Tools/kde4.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/kde4.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,48 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import os,sys,re
+from waflib import Options,TaskGen,Task,Utils
+from waflib.TaskGen import feature,after_method
+@feature('msgfmt')
+def apply_msgfmt(self):
+	for lang in self.to_list(self.langs):
+		node=self.path.find_resource(lang+'.po')
+		task=self.create_task('msgfmt',node,node.change_ext('.mo'))
+		langname=lang.split('/')
+		langname=langname[-1]
+		inst=getattr(self,'install_path','${KDE4_LOCALE_INSTALL_DIR}')
+		self.bld.install_as(inst+os.sep+langname+os.sep+'LC_MESSAGES'+os.sep+getattr(self,'appname','set_your_appname')+'.mo',task.outputs[0],chmod=getattr(self,'chmod',Utils.O644))
+class msgfmt(Task.Task):
+	color='BLUE'
+	run_str='${MSGFMT} ${SRC} -o ${TGT}'
+def configure(self):
+	kdeconfig=self.find_program('kde4-config')
+	prefix=self.cmd_and_log('%s --prefix'%kdeconfig).strip()
+	fname='%s/share/apps/cmake/modules/KDELibsDependencies.cmake'%prefix
+	try:os.stat(fname)
+	except OSError:
+		fname='%s/share/kde4/apps/cmake/modules/KDELibsDependencies.cmake'%prefix
+		try:os.stat(fname)
+		except OSError:self.fatal('could not open %s'%fname)
+	try:
+		txt=Utils.readf(fname)
+	except(OSError,IOError):
+		self.fatal('could not read %s'%fname)
+	txt=txt.replace('\\\n','\n')
+	fu=re.compile('#(.*)\n')
+	txt=fu.sub('',txt)
+	setregexp=re.compile('([sS][eE][tT]\s*\()\s*([^\s]+)\s+\"([^"]+)\"\)')
+	found=setregexp.findall(txt)
+	for(_,key,val)in found:
+		self.env[key]=val
+	self.env['LIB_KDECORE']=['kdecore']
+	self.env['LIB_KDEUI']=['kdeui']
+	self.env['LIB_KIO']=['kio']
+	self.env['LIB_KHTML']=['khtml']
+	self.env['LIB_KPARTS']=['kparts']
+	self.env['LIBPATH_KDECORE']=[os.path.join(self.env.KDE4_LIB_INSTALL_DIR,'kde4','devel'),self.env.KDE4_LIB_INSTALL_DIR]
+	self.env['INCLUDES_KDECORE']=[self.env['KDE4_INCLUDE_INSTALL_DIR']]
+	self.env.append_value('INCLUDES_KDECORE',[self.env['KDE4_INCLUDE_INSTALL_DIR']+os.sep+'KDE'])
+	self.find_program('msgfmt',var='MSGFMT')
Index: waflib/Tools/ldc2.py
===================================================================
--- waflib/Tools/ldc2.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/ldc2.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,37 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import sys
+from waflib.Tools import ar,d
+from waflib.Configure import conf
+@conf
+def find_ldc2(conf):
+	conf.find_program(['ldc2'],var='D')
+	out=conf.cmd_and_log([conf.env.D,'-version'])
+	if out.find("based on DMD v2.")==-1:
+		conf.fatal("detected compiler is not ldc2")
+@conf
+def common_flags_ldc2(conf):
+	v=conf.env
+	v['D_SRC_F']=['-c']
+	v['D_TGT_F']='-of%s'
+	v['D_LINKER']=v['D']
+	v['DLNK_SRC_F']=''
+	v['DLNK_TGT_F']='-of%s'
+	v['DINC_ST']='-I%s'
+	v['DSHLIB_MARKER']=v['DSTLIB_MARKER']=''
+	v['DSTLIB_ST']=v['DSHLIB_ST']='-L-l%s'
+	v['DSTLIBPATH_ST']=v['DLIBPATH_ST']='-L-L%s'
+	v['LINKFLAGS_dshlib']=['-L-shared']
+	v['DHEADER_ext']='.di'
+	v['DFLAGS_d_with_header']=['-H','-Hf']
+	v['D_HDR_F']='%s'
+	v['LINKFLAGS']=[]
+	v['DFLAGS_dshlib']=['-relocation-model=pic']
+def configure(conf):
+	conf.find_ldc2()
+	conf.load('ar')
+	conf.load('d')
+	conf.common_flags_ldc2()
+	conf.d_platform_flags()
Index: waflib/Tools/lua.py
===================================================================
--- waflib/Tools/lua.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/lua.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,18 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+from waflib.TaskGen import extension
+from waflib import Task,Utils
+@extension('.lua')
+def add_lua(self,node):
+	tsk=self.create_task('luac',node,node.change_ext('.luac'))
+	inst_to=getattr(self,'install_path',self.env.LUADIR and'${LUADIR}'or None)
+	if inst_to:
+		self.bld.install_files(inst_to,tsk.outputs)
+	return tsk
+class luac(Task.Task):
+	run_str='${LUAC} -s -o ${TGT} ${SRC}'
+	color='PINK'
+def configure(conf):
+	conf.find_program('luac',var='LUAC')
Index: waflib/Tools/msvc.py
===================================================================
--- waflib/Tools/msvc.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/msvc.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,726 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import os,sys,re,tempfile
+from waflib import Utils,Task,Logs,Options
+from waflib.Logs import debug,warn
+from waflib.TaskGen import after_method,feature
+from waflib.Configure import conf
+from waflib.Tools import ccroot,c,cxx,ar,winres
+g_msvc_systemlibs='''
+aclui activeds ad1 adptif adsiid advapi32 asycfilt authz bhsupp bits bufferoverflowu cabinet
+cap certadm certidl ciuuid clusapi comctl32 comdlg32 comsupp comsuppd comsuppw comsuppwd comsvcs
+credui crypt32 cryptnet cryptui d3d8thk daouuid dbgeng dbghelp dciman32 ddao35 ddao35d
+ddao35u ddao35ud delayimp dhcpcsvc dhcpsapi dlcapi dnsapi dsprop dsuiext dtchelp
+faultrep fcachdll fci fdi framedyd framedyn gdi32 gdiplus glauxglu32 gpedit gpmuuid
+gtrts32w gtrtst32hlink htmlhelp httpapi icm32 icmui imagehlp imm32 iphlpapi iprop
+kernel32 ksguid ksproxy ksuser libcmt libcmtd libcpmt libcpmtd loadperf lz32 mapi
+mapi32 mgmtapi minidump mmc mobsync mpr mprapi mqoa mqrt msacm32 mscms mscoree
+msdasc msimg32 msrating mstask msvcmrt msvcurt msvcurtd mswsock msxml2 mtx mtxdm
+netapi32 nmapinmsupp npptools ntdsapi ntdsbcli ntmsapi ntquery odbc32 odbcbcp
+odbccp32 oldnames ole32 oleacc oleaut32 oledb oledlgolepro32 opends60 opengl32
+osptk parser pdh penter pgobootrun pgort powrprof psapi ptrustm ptrustmd ptrustu
+ptrustud qosname rasapi32 rasdlg rassapi resutils riched20 rpcndr rpcns4 rpcrt4 rtm
+rtutils runtmchk scarddlg scrnsave scrnsavw secur32 sensapi setupapi sfc shell32
+shfolder shlwapi sisbkup snmpapi sporder srclient sti strsafe svcguid tapi32 thunk32
+traffic unicows url urlmon user32 userenv usp10 uuid uxtheme vcomp vcompd vdmdbg
+version vfw32 wbemuuid  webpost wiaguid wininet winmm winscard winspool winstrm
+wintrust wldap32 wmiutils wow32 ws2_32 wsnmp32 wsock32 wst wtsapi32 xaswitch xolehlp
+'''.split()
+all_msvc_platforms=[('x64','amd64'),('x86','x86'),('ia64','ia64'),('x86_amd64','amd64'),('x86_ia64','ia64')]
+all_wince_platforms=[('armv4','arm'),('armv4i','arm'),('mipsii','mips'),('mipsii_fp','mips'),('mipsiv','mips'),('mipsiv_fp','mips'),('sh4','sh'),('x86','cex86')]
+all_icl_platforms=[('intel64','amd64'),('em64t','amd64'),('ia32','x86'),('Itanium','ia64')]
+def options(opt):
+	opt.add_option('--msvc_version',type='string',help='msvc version, eg: "msvc 10.0,msvc 9.0"',default='')
+	opt.add_option('--msvc_targets',type='string',help='msvc targets, eg: "x64,arm"',default='')
+def setup_msvc(conf,versions,arch=False):
+	platforms=getattr(Options.options,'msvc_targets','').split(',')
+	if platforms==['']:
+		platforms=Utils.to_list(conf.env['MSVC_TARGETS'])or[i for i,j in all_msvc_platforms+all_icl_platforms+all_wince_platforms]
+	desired_versions=getattr(Options.options,'msvc_version','').split(',')
+	if desired_versions==['']:
+		desired_versions=conf.env['MSVC_VERSIONS']or[v for v,_ in versions][::-1]
+	versiondict=dict(versions)
+	for version in desired_versions:
+		try:
+			targets=dict(versiondict[version])
+			for target in platforms:
+				try:
+					arch,(p1,p2,p3)=targets[target]
+					compiler,revision=version.rsplit(' ',1)
+					if arch:
+						return compiler,revision,p1,p2,p3,arch
+					else:
+						return compiler,revision,p1,p2,p3
+				except KeyError:continue
+		except KeyError:continue
+	conf.fatal('msvc: Impossible to find a valid architecture for building (in setup_msvc)')
+@conf
+def get_msvc_version(conf,compiler,version,target,vcvars):
+	debug('msvc: get_msvc_version: %r %r %r',compiler,version,target)
+	batfile=conf.bldnode.make_node('waf-print-msvc.bat')
+	batfile.write("""@echo off
+set INCLUDE=
+set LIB=
+call "%s" %s
+echo PATH=%%PATH%%
+echo INCLUDE=%%INCLUDE%%
+echo LIB=%%LIB%%
+"""%(vcvars,target))
+	sout=conf.cmd_and_log(['cmd','/E:on','/V:on','/C',batfile.abspath()])
+	lines=sout.splitlines()
+	if not lines[0]:
+		lines.pop(0)
+	if version=='11.0':
+		if lines[0].startswith('Error'):
+			conf.fatal('msvc: Could not find a valid architecture for building (get_msvc_version_1)')
+	else:
+		for x in('Setting environment','Setting SDK environment','Intel(R) C++ Compiler','Intel Parallel Studio','Intel(R) Parallel Studio','Intel(R) Composer','Intel Corporation. All rights reserved.'):
+			if lines[0].find(x)>-1:
+				lines.pop(0)
+				break
+		else:
+			debug('msvc: get_msvc_version: %r %r %r -> not found',compiler,version,target)
+			conf.fatal('msvc: Could not find a valid architecture for building (get_msvc_version_2)')
+	MSVC_PATH=MSVC_INCDIR=MSVC_LIBDIR=None
+	for line in lines:
+		if line.startswith('PATH='):
+			path=line[5:]
+			MSVC_PATH=path.split(';')
+		elif line.startswith('INCLUDE='):
+			MSVC_INCDIR=[i for i in line[8:].split(';')if i]
+		elif line.startswith('LIB='):
+			MSVC_LIBDIR=[i for i in line[4:].split(';')if i]
+	if None in(MSVC_PATH,MSVC_INCDIR,MSVC_LIBDIR):
+		conf.fatal('msvc: Could not find a valid architecture for building (get_msvc_version_3)')
+	env=dict(os.environ)
+	env.update(PATH=path)
+	compiler_name,linker_name,lib_name=_get_prog_names(conf,compiler)
+	cxx=conf.find_program(compiler_name,path_list=MSVC_PATH)
+	cxx=conf.cmd_to_list(cxx)
+	if'CL'in env:
+		del(env['CL'])
+	try:
+		try:
+			conf.cmd_and_log(cxx+['/help'],env=env)
+		except Exception ,e:
+			debug('msvc: get_msvc_version: %r %r %r -> failure'%(compiler,version,target))
+			debug(str(e))
+			conf.fatal('msvc: cannot run the compiler (in get_msvc_version)')
+		else:
+			debug('msvc: get_msvc_version: %r %r %r -> OK',compiler,version,target)
+	finally:
+		conf.env[compiler_name]=''
+	return(MSVC_PATH,MSVC_INCDIR,MSVC_LIBDIR)
+@conf
+def gather_wsdk_versions(conf,versions):
+	version_pattern=re.compile('^v..?.?\...?.?')
+	try:
+		all_versions=Utils.winreg.OpenKey(Utils.winreg.HKEY_LOCAL_MACHINE,'SOFTWARE\\Wow6432node\\Microsoft\\Microsoft SDKs\\Windows')
+	except WindowsError:
+		try:
+			all_versions=Utils.winreg.OpenKey(Utils.winreg.HKEY_LOCAL_MACHINE,'SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows')
+		except WindowsError:
+			return
+	index=0
+	while 1:
+		try:
+			version=Utils.winreg.EnumKey(all_versions,index)
+		except WindowsError:
+			break
+		index=index+1
+		if not version_pattern.match(version):
+			continue
+		try:
+			msvc_version=Utils.winreg.OpenKey(all_versions,version)
+			path,type=Utils.winreg.QueryValueEx(msvc_version,'InstallationFolder')
+		except WindowsError:
+			continue
+		if os.path.isfile(os.path.join(path,'bin','SetEnv.cmd')):
+			targets=[]
+			for target,arch in all_msvc_platforms:
+				try:
+					targets.append((target,(arch,conf.get_msvc_version('wsdk',version,'/'+target,os.path.join(path,'bin','SetEnv.cmd')))))
+				except conf.errors.ConfigurationError:
+					pass
+			versions.append(('wsdk '+version[1:],targets))
+def gather_wince_supported_platforms():
+	supported_wince_platforms=[]
+	try:
+		ce_sdk=Utils.winreg.OpenKey(Utils.winreg.HKEY_LOCAL_MACHINE,'SOFTWARE\\Wow6432node\\Microsoft\\Windows CE Tools\\SDKs')
+	except WindowsError:
+		try:
+			ce_sdk=Utils.winreg.OpenKey(Utils.winreg.HKEY_LOCAL_MACHINE,'SOFTWARE\\Microsoft\\Windows CE Tools\\SDKs')
+		except WindowsError:
+			ce_sdk=''
+	if not ce_sdk:
+		return supported_wince_platforms
+	ce_index=0
+	while 1:
+		try:
+			sdk_device=Utils.winreg.EnumKey(ce_sdk,ce_index)
+		except WindowsError:
+			break
+		ce_index=ce_index+1
+		sdk=Utils.winreg.OpenKey(ce_sdk,sdk_device)
+		try:
+			path,type=Utils.winreg.QueryValueEx(sdk,'SDKRootDir')
+		except WindowsError:
+			try:
+				path,type=Utils.winreg.QueryValueEx(sdk,'SDKInformation')
+				path,xml=os.path.split(path)
+			except WindowsError:
+				continue
+		path=str(path)
+		path,device=os.path.split(path)
+		if not device:
+			path,device=os.path.split(path)
+		for arch,compiler in all_wince_platforms:
+			platforms=[]
+			if os.path.isdir(os.path.join(path,device,'Lib',arch)):
+				platforms.append((arch,compiler,os.path.join(path,device,'Include',arch),os.path.join(path,device,'Lib',arch)))
+			if platforms:
+				supported_wince_platforms.append((device,platforms))
+	return supported_wince_platforms
+def gather_msvc_detected_versions():
+	version_pattern=re.compile('^(\d\d?\.\d\d?)(Exp)?$')
+	detected_versions=[]
+	for vcver,vcvar in[('VCExpress','Exp'),('VisualStudio','')]:
+		try:
+			prefix='SOFTWARE\\Wow6432node\\Microsoft\\'+vcver
+			all_versions=Utils.winreg.OpenKey(Utils.winreg.HKEY_LOCAL_MACHINE,prefix)
+		except WindowsError:
+			try:
+				prefix='SOFTWARE\\Microsoft\\'+vcver
+				all_versions=Utils.winreg.OpenKey(Utils.winreg.HKEY_LOCAL_MACHINE,prefix)
+			except WindowsError:
+				continue
+		index=0
+		while 1:
+			try:
+				version=Utils.winreg.EnumKey(all_versions,index)
+			except WindowsError:
+				break
+			index=index+1
+			match=version_pattern.match(version)
+			if not match:
+				continue
+			else:
+				versionnumber=float(match.group(1))
+			detected_versions.append((versionnumber,version+vcvar,prefix+"\\"+version))
+	def fun(tup):
+		return tup[0]
+	detected_versions.sort(key=fun)
+	return detected_versions
+@conf
+def gather_msvc_targets(conf,versions,version,vc_path):
+	targets=[]
+	if os.path.isfile(os.path.join(vc_path,'vcvarsall.bat')):
+		for target,realtarget in all_msvc_platforms[::-1]:
+			try:
+				targets.append((target,(realtarget,conf.get_msvc_version('msvc',version,target,os.path.join(vc_path,'vcvarsall.bat')))))
+			except conf.errors.ConfigurationError:
+				pass
+	elif os.path.isfile(os.path.join(vc_path,'Common7','Tools','vsvars32.bat')):
+		try:
+			targets.append(('x86',('x86',conf.get_msvc_version('msvc',version,'x86',os.path.join(vc_path,'Common7','Tools','vsvars32.bat')))))
+		except conf.errors.ConfigurationError:
+			pass
+	elif os.path.isfile(os.path.join(vc_path,'Bin','vcvars32.bat')):
+		try:
+			targets.append(('x86',('x86',conf.get_msvc_version('msvc',version,'',os.path.join(vc_path,'Bin','vcvars32.bat')))))
+		except conf.errors.ConfigurationError:
+			pass
+	versions.append(('msvc '+version,targets))
+@conf
+def gather_wince_targets(conf,versions,version,vc_path,vsvars,supported_platforms):
+	for device,platforms in supported_platforms:
+		cetargets=[]
+		for platform,compiler,include,lib in platforms:
+			winCEpath=os.path.join(vc_path,'ce')
+			if not os.path.isdir(winCEpath):
+				continue
+			try:
+				common_bindirs,_1,_2=conf.get_msvc_version('msvc',version,'x86',vsvars)
+			except conf.errors.ConfigurationError:
+				continue
+			if os.path.isdir(os.path.join(winCEpath,'lib',platform)):
+				bindirs=[os.path.join(winCEpath,'bin',compiler),os.path.join(winCEpath,'bin','x86_'+compiler)]+common_bindirs
+				incdirs=[os.path.join(winCEpath,'include'),os.path.join(winCEpath,'atlmfc','include'),include]
+				libdirs=[os.path.join(winCEpath,'lib',platform),os.path.join(winCEpath,'atlmfc','lib',platform),lib]
+				cetargets.append((platform,(platform,(bindirs,incdirs,libdirs))))
+		if cetargets:
+			versions.append((device+' '+version,cetargets))
+@conf
+def gather_msvc_versions(conf,versions):
+	vc_paths=[]
+	for(v,version,reg)in gather_msvc_detected_versions():
+		try:
+			try:
+				msvc_version=Utils.winreg.OpenKey(Utils.winreg.HKEY_LOCAL_MACHINE,reg+"\\Setup\\VC")
+			except WindowsError:
+				msvc_version=Utils.winreg.OpenKey(Utils.winreg.HKEY_LOCAL_MACHINE,reg+"\\Setup\\Microsoft Visual C++")
+			path,type=Utils.winreg.QueryValueEx(msvc_version,'ProductDir')
+			vc_paths.append((version,os.path.abspath(str(path))))
+		except WindowsError:
+			continue
+	wince_supported_platforms=gather_wince_supported_platforms()
+	for version,vc_path in vc_paths:
+		vs_path=os.path.dirname(vc_path)
+		vsvars=os.path.join(vs_path,'Common7','Tools','vsvars32.bat')
+		if wince_supported_platforms and os.path.isfile(vsvars):
+			conf.gather_wince_targets(versions,version,vc_path,vsvars,wince_supported_platforms)
+	for version,vc_path in vc_paths:
+		vs_path=os.path.dirname(vc_path)
+		conf.gather_msvc_targets(versions,version,vc_path)
+@conf
+def gather_icl_versions(conf,versions):
+	version_pattern=re.compile('^...?.?\....?.?')
+	try:
+		all_versions=Utils.winreg.OpenKey(Utils.winreg.HKEY_LOCAL_MACHINE,'SOFTWARE\\Wow6432node\\Intel\\Compilers\\C++')
+	except WindowsError:
+		try:
+			all_versions=Utils.winreg.OpenKey(Utils.winreg.HKEY_LOCAL_MACHINE,'SOFTWARE\\Intel\\Compilers\\C++')
+		except WindowsError:
+			return
+	index=0
+	while 1:
+		try:
+			version=Utils.winreg.EnumKey(all_versions,index)
+		except WindowsError:
+			break
+		index=index+1
+		if not version_pattern.match(version):
+			continue
+		targets=[]
+		for target,arch in all_icl_platforms:
+			try:
+				if target=='intel64':targetDir='EM64T_NATIVE'
+				else:targetDir=target
+				Utils.winreg.OpenKey(all_versions,version+'\\'+targetDir)
+				icl_version=Utils.winreg.OpenKey(all_versions,version)
+				path,type=Utils.winreg.QueryValueEx(icl_version,'ProductDir')
+				batch_file=os.path.join(path,'bin','iclvars.bat')
+				if os.path.isfile(batch_file):
+					try:
+						targets.append((target,(arch,conf.get_msvc_version('intel',version,target,batch_file))))
+					except conf.errors.ConfigurationError:
+						pass
+			except WindowsError:
+				pass
+		for target,arch in all_icl_platforms:
+			try:
+				icl_version=Utils.winreg.OpenKey(all_versions,version+'\\'+target)
+				path,type=Utils.winreg.QueryValueEx(icl_version,'ProductDir')
+				batch_file=os.path.join(path,'bin','iclvars.bat')
+				if os.path.isfile(batch_file):
+					try:
+						targets.append((target,(arch,conf.get_msvc_version('intel',version,target,batch_file))))
+					except conf.errors.ConfigurationError:
+						pass
+			except WindowsError:
+				continue
+		major=version[0:2]
+		versions.append(('intel '+major,targets))
+@conf
+def gather_intel_composer_versions(conf,versions):
+	version_pattern=re.compile('^...?.?\...?.?.?')
+	try:
+		all_versions=Utils.winreg.OpenKey(Utils.winreg.HKEY_LOCAL_MACHINE,'SOFTWARE\\Wow6432node\\Intel\\Suites')
+	except WindowsError:
+		try:
+			all_versions=Utils.winreg.OpenKey(Utils.winreg.HKEY_LOCAL_MACHINE,'SOFTWARE\\Intel\\Suites')
+		except WindowsError:
+			return
+	index=0
+	while 1:
+		try:
+			version=Utils.winreg.EnumKey(all_versions,index)
+		except WindowsError:
+			break
+		index=index+1
+		if not version_pattern.match(version):
+			continue
+		targets=[]
+		for target,arch in all_icl_platforms:
+			try:
+				if target=='intel64':targetDir='EM64T_NATIVE'
+				else:targetDir=target
+				try:
+					defaults=Utils.winreg.OpenKey(all_versions,version+'\\Defaults\\C++\\'+targetDir)
+				except WindowsError:
+					if targetDir=='EM64T_NATIVE':
+						defaults=Utils.winreg.OpenKey(all_versions,version+'\\Defaults\\C++\\EM64T')
+					else:
+						raise WindowsError
+				uid,type=Utils.winreg.QueryValueEx(defaults,'SubKey')
+				Utils.winreg.OpenKey(all_versions,version+'\\'+uid+'\\C++\\'+targetDir)
+				icl_version=Utils.winreg.OpenKey(all_versions,version+'\\'+uid+'\\C++')
+				path,type=Utils.winreg.QueryValueEx(icl_version,'ProductDir')
+				batch_file=os.path.join(path,'bin','iclvars.bat')
+				if os.path.isfile(batch_file):
+					try:
+						targets.append((target,(arch,conf.get_msvc_version('intel',version,target,batch_file))))
+					except conf.errors.ConfigurationError ,e:
+						pass
+				compilervars_warning_attr='_compilervars_warning_key'
+				if version[0:2]=='13'and getattr(conf,compilervars_warning_attr,True):
+					setattr(conf,compilervars_warning_attr,False)
+					patch_url='http://software.intel.com/en-us/forums/topic/328487'
+					compilervars_arch=os.path.join(path,'bin','compilervars_arch.bat')
+					vs_express_path=os.environ['VS110COMNTOOLS']+r'..\IDE\VSWinExpress.exe'
+					dev_env_path=os.environ['VS110COMNTOOLS']+r'..\IDE\devenv.exe'
+					if(r'if exist "%VS110COMNTOOLS%..\IDE\VSWinExpress.exe"'in Utils.readf(compilervars_arch)and not os.path.exists(vs_express_path)and not os.path.exists(dev_env_path)):
+						Logs.warn(('The Intel compilervar_arch.bat only checks for one Visual Studio SKU ''(VSWinExpress.exe) but it does not seem to be installed at %r. ''The intel command line set up will fail to configure unless the file %r''is patched. See: %s')%(vs_express_path,compilervars_arch,patch_url))
+			except WindowsError:
+				pass
+		major=version[0:2]
+		versions.append(('intel '+major,targets))
+@conf
+def get_msvc_versions(conf):
+	if not conf.env['MSVC_INSTALLED_VERSIONS']:
+		lst=[]
+		conf.gather_icl_versions(lst)
+		conf.gather_intel_composer_versions(lst)
+		conf.gather_wsdk_versions(lst)
+		conf.gather_msvc_versions(lst)
+		conf.env['MSVC_INSTALLED_VERSIONS']=lst
+	return conf.env['MSVC_INSTALLED_VERSIONS']
+@conf
+def print_all_msvc_detected(conf):
+	for version,targets in conf.env['MSVC_INSTALLED_VERSIONS']:
+		Logs.info(version)
+		for target,l in targets:
+			Logs.info("\t"+target)
+@conf
+def detect_msvc(conf,arch=False):
+	versions=get_msvc_versions(conf)
+	return setup_msvc(conf,versions,arch)
+@conf
+def find_lt_names_msvc(self,libname,is_static=False):
+	lt_names=['lib%s.la'%libname,'%s.la'%libname,]
+	for path in self.env['LIBPATH']:
+		for la in lt_names:
+			laf=os.path.join(path,la)
+			dll=None
+			if os.path.exists(laf):
+				ltdict=Utils.read_la_file(laf)
+				lt_libdir=None
+				if ltdict.get('libdir',''):
+					lt_libdir=ltdict['libdir']
+				if not is_static and ltdict.get('library_names',''):
+					dllnames=ltdict['library_names'].split()
+					dll=dllnames[0].lower()
+					dll=re.sub('\.dll$','',dll)
+					return(lt_libdir,dll,False)
+				elif ltdict.get('old_library',''):
+					olib=ltdict['old_library']
+					if os.path.exists(os.path.join(path,olib)):
+						return(path,olib,True)
+					elif lt_libdir!=''and os.path.exists(os.path.join(lt_libdir,olib)):
+						return(lt_libdir,olib,True)
+					else:
+						return(None,olib,True)
+				else:
+					raise self.errors.WafError('invalid libtool object file: %s'%laf)
+	return(None,None,None)
+@conf
+def libname_msvc(self,libname,is_static=False):
+	lib=libname.lower()
+	lib=re.sub('\.lib$','',lib)
+	if lib in g_msvc_systemlibs:
+		return lib
+	lib=re.sub('^lib','',lib)
+	if lib=='m':
+		return None
+	(lt_path,lt_libname,lt_static)=self.find_lt_names_msvc(lib,is_static)
+	if lt_path!=None and lt_libname!=None:
+		if lt_static==True:
+			return os.path.join(lt_path,lt_libname)
+	if lt_path!=None:
+		_libpaths=[lt_path]+self.env['LIBPATH']
+	else:
+		_libpaths=self.env['LIBPATH']
+	static_libs=['lib%ss.lib'%lib,'lib%s.lib'%lib,'%ss.lib'%lib,'%s.lib'%lib,]
+	dynamic_libs=['lib%s.dll.lib'%lib,'lib%s.dll.a'%lib,'%s.dll.lib'%lib,'%s.dll.a'%lib,'lib%s_d.lib'%lib,'%s_d.lib'%lib,'%s.lib'%lib,]
+	libnames=static_libs
+	if not is_static:
+		libnames=dynamic_libs+static_libs
+	for path in _libpaths:
+		for libn in libnames:
+			if os.path.exists(os.path.join(path,libn)):
+				debug('msvc: lib found: %s'%os.path.join(path,libn))
+				return re.sub('\.lib$','',libn)
+	self.fatal("The library %r could not be found"%libname)
+	return re.sub('\.lib$','',libname)
+@conf
+def check_lib_msvc(self,libname,is_static=False,uselib_store=None):
+	libn=self.libname_msvc(libname,is_static)
+	if not uselib_store:
+		uselib_store=libname.upper()
+	if False and is_static:
+		self.env['STLIB_'+uselib_store]=[libn]
+	else:
+		self.env['LIB_'+uselib_store]=[libn]
+@conf
+def check_libs_msvc(self,libnames,is_static=False):
+	for libname in Utils.to_list(libnames):
+		self.check_lib_msvc(libname,is_static)
+def configure(conf):
+	conf.autodetect(True)
+	conf.find_msvc()
+	conf.msvc_common_flags()
+	conf.cc_load_tools()
+	conf.cxx_load_tools()
+	conf.cc_add_flags()
+	conf.cxx_add_flags()
+	conf.link_add_flags()
+	conf.visual_studio_add_flags()
+@conf
+def no_autodetect(conf):
+	conf.env.NO_MSVC_DETECT=1
+	configure(conf)
+@conf
+def autodetect(conf,arch=False):
+	v=conf.env
+	if v.NO_MSVC_DETECT:
+		return
+	if arch:
+		compiler,version,path,includes,libdirs,arch=conf.detect_msvc(True)
+		v['DEST_CPU']=arch
+	else:
+		compiler,version,path,includes,libdirs=conf.detect_msvc()
+	v['PATH']=path
+	v['INCLUDES']=includes
+	v['LIBPATH']=libdirs
+	v['MSVC_COMPILER']=compiler
+	try:
+		v['MSVC_VERSION']=float(version)
+	except Exception:
+		v['MSVC_VERSION']=float(version[:-3])
+def _get_prog_names(conf,compiler):
+	if compiler=='intel':
+		compiler_name='ICL'
+		linker_name='XILINK'
+		lib_name='XILIB'
+	else:
+		compiler_name='CL'
+		linker_name='LINK'
+		lib_name='LIB'
+	return compiler_name,linker_name,lib_name
+@conf
+def find_msvc(conf):
+	if sys.platform=='cygwin':
+		conf.fatal('MSVC module does not work under cygwin Python!')
+	v=conf.env
+	path=v['PATH']
+	compiler=v['MSVC_COMPILER']
+	version=v['MSVC_VERSION']
+	compiler_name,linker_name,lib_name=_get_prog_names(conf,compiler)
+	v.MSVC_MANIFEST=(compiler=='msvc'and version>=8)or(compiler=='wsdk'and version>=6)or(compiler=='intel'and version>=11)
+	cxx=None
+	if v['CXX']:cxx=v['CXX']
+	elif'CXX'in conf.environ:cxx=conf.environ['CXX']
+	cxx=conf.find_program(compiler_name,var='CXX',path_list=path)
+	cxx=conf.cmd_to_list(cxx)
+	env=dict(conf.environ)
+	if path:env.update(PATH=';'.join(path))
+	if not conf.cmd_and_log(cxx+['/nologo','/help'],env=env):
+		conf.fatal('the msvc compiler could not be identified')
+	v['CC']=v['CXX']=cxx
+	v['CC_NAME']=v['CXX_NAME']='msvc'
+	if not v['LINK_CXX']:
+		link=conf.find_program(linker_name,path_list=path)
+		if link:v['LINK_CXX']=link
+		else:conf.fatal('%s was not found (linker)'%linker_name)
+		v['LINK']=link
+	if not v['LINK_CC']:
+		v['LINK_CC']=v['LINK_CXX']
+	if not v['AR']:
+		stliblink=conf.find_program(lib_name,path_list=path,var='AR')
+		if not stliblink:return
+		v['ARFLAGS']=['/NOLOGO']
+	if v.MSVC_MANIFEST:
+		conf.find_program('MT',path_list=path,var='MT')
+		v['MTFLAGS']=['/NOLOGO']
+	conf.load('winres')
+	if not conf.env['WINRC']:
+		warn('Resource compiler not found. Compiling resource file is disabled')
+@conf
+def visual_studio_add_flags(self):
+	v=self.env
+	try:v.prepend_value('INCLUDES',[x for x in self.environ['INCLUDE'].split(';')if x])
+	except Exception:pass
+	try:v.prepend_value('LIBPATH',[x for x in self.environ['LIB'].split(';')if x])
+	except Exception:pass
+@conf
+def msvc_common_flags(conf):
+	v=conf.env
+	v['DEST_BINFMT']='pe'
+	v.append_value('CFLAGS',['/nologo'])
+	v.append_value('CXXFLAGS',['/nologo'])
+	v['DEFINES_ST']='/D%s'
+	v['CC_SRC_F']=''
+	v['CC_TGT_F']=['/c','/Fo']
+	if v['MSVC_VERSION']>=8:
+		v['CC_TGT_F']=['/FC']+v['CC_TGT_F']
+	v['CXX_SRC_F']=''
+	v['CXX_TGT_F']=['/c','/Fo']
+	if v['MSVC_VERSION']>=8:
+		v['CXX_TGT_F']=['/FC']+v['CXX_TGT_F']
+	v['CPPPATH_ST']='/I%s'
+	v['AR_TGT_F']=v['CCLNK_TGT_F']=v['CXXLNK_TGT_F']='/OUT:'
+	v['CFLAGS_CONSOLE']=v['CXXFLAGS_CONSOLE']=['/SUBSYSTEM:CONSOLE']
+	v['CFLAGS_NATIVE']=v['CXXFLAGS_NATIVE']=['/SUBSYSTEM:NATIVE']
+	v['CFLAGS_POSIX']=v['CXXFLAGS_POSIX']=['/SUBSYSTEM:POSIX']
+	v['CFLAGS_WINDOWS']=v['CXXFLAGS_WINDOWS']=['/SUBSYSTEM:WINDOWS']
+	v['CFLAGS_WINDOWSCE']=v['CXXFLAGS_WINDOWSCE']=['/SUBSYSTEM:WINDOWSCE']
+	v['CFLAGS_CRT_MULTITHREADED']=v['CXXFLAGS_CRT_MULTITHREADED']=['/MT']
+	v['CFLAGS_CRT_MULTITHREADED_DLL']=v['CXXFLAGS_CRT_MULTITHREADED_DLL']=['/MD']
+	v['CFLAGS_CRT_MULTITHREADED_DBG']=v['CXXFLAGS_CRT_MULTITHREADED_DBG']=['/MTd']
+	v['CFLAGS_CRT_MULTITHREADED_DLL_DBG']=v['CXXFLAGS_CRT_MULTITHREADED_DLL_DBG']=['/MDd']
+	v['LIB_ST']='%s.lib'
+	v['LIBPATH_ST']='/LIBPATH:%s'
+	v['STLIB_ST']='%s.lib'
+	v['STLIBPATH_ST']='/LIBPATH:%s'
+	v.append_value('LINKFLAGS',['/NOLOGO'])
+	if v['MSVC_MANIFEST']:
+		v.append_value('LINKFLAGS',['/MANIFEST'])
+	v['CFLAGS_cshlib']=[]
+	v['CXXFLAGS_cxxshlib']=[]
+	v['LINKFLAGS_cshlib']=v['LINKFLAGS_cxxshlib']=['/DLL']
+	v['cshlib_PATTERN']=v['cxxshlib_PATTERN']='%s.dll'
+	v['implib_PATTERN']='%s.lib'
+	v['IMPLIB_ST']='/IMPLIB:%s'
+	v['LINKFLAGS_cstlib']=[]
+	v['cstlib_PATTERN']=v['cxxstlib_PATTERN']='%s.lib'
+	v['cprogram_PATTERN']=v['cxxprogram_PATTERN']='%s.exe'
+@after_method('apply_link')
+@feature('c','cxx')
+def apply_flags_msvc(self):
+	if self.env.CC_NAME!='msvc'or not getattr(self,'link_task',None):
+		return
+	is_static=isinstance(self.link_task,ccroot.stlink_task)
+	subsystem=getattr(self,'subsystem','')
+	if subsystem:
+		subsystem='/subsystem:%s'%subsystem
+		flags=is_static and'ARFLAGS'or'LINKFLAGS'
+		self.env.append_value(flags,subsystem)
+	if not is_static:
+		for f in self.env.LINKFLAGS:
+			d=f.lower()
+			if d[1:]=='debug':
+				pdbnode=self.link_task.outputs[0].change_ext('.pdb')
+				self.link_task.outputs.append(pdbnode)
+				try:
+					self.install_task.source.append(pdbnode)
+				except AttributeError:
+					pass
+				break
+@feature('cprogram','cshlib','cxxprogram','cxxshlib')
+@after_method('apply_link')
+def apply_manifest(self):
+	if self.env.CC_NAME=='msvc'and self.env.MSVC_MANIFEST and getattr(self,'link_task',None):
+		out_node=self.link_task.outputs[0]
+		man_node=out_node.parent.find_or_declare(out_node.name+'.manifest')
+		self.link_task.outputs.append(man_node)
+		self.link_task.do_manifest=True
+def exec_mf(self):
+	env=self.env
+	mtool=env['MT']
+	if not mtool:
+		return 0
+	self.do_manifest=False
+	outfile=self.outputs[0].abspath()
+	manifest=None
+	for out_node in self.outputs:
+		if out_node.name.endswith('.manifest'):
+			manifest=out_node.abspath()
+			break
+	if manifest is None:
+		return 0
+	mode=''
+	if'cprogram'in self.generator.features or'cxxprogram'in self.generator.features:
+		mode='1'
+	elif'cshlib'in self.generator.features or'cxxshlib'in self.generator.features:
+		mode='2'
+	debug('msvc: embedding manifest in mode %r'%mode)
+	lst=[]
+	lst.append(env['MT'])
+	lst.extend(Utils.to_list(env['MTFLAGS']))
+	lst.extend(['-manifest',manifest])
+	lst.append('-outputresource:%s;%s'%(outfile,mode))
+	lst=[lst]
+	return self.exec_command(*lst)
+def quote_response_command(self,flag):
+	if flag.find(' ')>-1:
+		for x in('/LIBPATH:','/IMPLIB:','/OUT:','/I'):
+			if flag.startswith(x):
+				flag='%s"%s"'%(x,flag[len(x):])
+				break
+		else:
+			flag='"%s"'%flag
+	return flag
+def exec_response_command(self,cmd,**kw):
+	try:
+		tmp=None
+		if sys.platform.startswith('win')and isinstance(cmd,list)and len(' '.join(cmd))>=8192:
+			program=cmd[0]
+			cmd=[self.quote_response_command(x)for x in cmd]
+			(fd,tmp)=tempfile.mkstemp()
+			os.write(fd,'\r\n'.join(i.replace('\\','\\\\')for i in cmd[1:]))
+			os.close(fd)
+			cmd=[program,'@'+tmp]
+		ret=self.generator.bld.exec_command(cmd,**kw)
+	finally:
+		if tmp:
+			try:
+				os.remove(tmp)
+			except OSError:
+				pass
+	return ret
+def exec_command_msvc(self,*k,**kw):
+	assert self.env['CC_NAME']=='msvc'
+	if isinstance(k[0],list):
+		lst=[]
+		carry=''
+		for a in k[0]:
+			if a=='/Fo'or a=='/doc'or a[-1]==':':
+				carry=a
+			else:
+				lst.append(carry+a)
+				carry=''
+		k=[lst]
+	if self.env['PATH']:
+		env=dict(self.env.env or os.environ)
+		env.update(PATH=';'.join(self.env['PATH']))
+		kw['env']=env
+	bld=self.generator.bld
+	try:
+		if not kw.get('cwd',None):
+			kw['cwd']=bld.cwd
+	except AttributeError:
+		bld.cwd=kw['cwd']=bld.variant_dir
+	ret=self.exec_response_command(k[0],**kw)
+	if not ret and getattr(self,'do_manifest',None):
+		ret=self.exec_mf()
+	return ret
+def wrap_class(class_name):
+	cls=Task.classes.get(class_name,None)
+	if not cls:
+		return None
+	derived_class=type(class_name,(cls,),{})
+	def exec_command(self,*k,**kw):
+		if self.env['CC_NAME']=='msvc':
+			return self.exec_command_msvc(*k,**kw)
+		else:
+			return super(derived_class,self).exec_command(*k,**kw)
+	derived_class.exec_command=exec_command
+	derived_class.exec_response_command=exec_response_command
+	derived_class.quote_response_command=quote_response_command
+	derived_class.exec_command_msvc=exec_command_msvc
+	derived_class.exec_mf=exec_mf
+	return derived_class
+for k in'c cxx cprogram cxxprogram cshlib cxxshlib cstlib cxxstlib'.split():
+	wrap_class(k)
Index: waflib/Tools/nasm.py
===================================================================
--- waflib/Tools/nasm.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/nasm.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,14 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import waflib.Tools.asm
+from waflib.TaskGen import feature
+@feature('asm')
+def apply_nasm_vars(self):
+	self.env.append_value('ASFLAGS',self.to_list(getattr(self,'nasm_flags',[])))
+def configure(conf):
+	nasm=conf.find_program(['nasm','yasm'],var='AS')
+	conf.env.AS_TGT_F=['-o']
+	conf.env.ASLNK_TGT_F=['-o']
+	conf.load('asm')
Index: waflib/Tools/perl.py
===================================================================
--- waflib/Tools/perl.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/perl.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,80 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import os
+from waflib import Task,Options,Utils
+from waflib.Configure import conf
+from waflib.TaskGen import extension,feature,before_method
+@before_method('apply_incpaths','apply_link','propagate_uselib_vars')
+@feature('perlext')
+def init_perlext(self):
+	self.uselib=self.to_list(getattr(self,'uselib',[]))
+	if not'PERLEXT'in self.uselib:self.uselib.append('PERLEXT')
+	self.env['cshlib_PATTERN']=self.env['cxxshlib_PATTERN']=self.env['perlext_PATTERN']
+@extension('.xs')
+def xsubpp_file(self,node):
+	outnode=node.change_ext('.c')
+	self.create_task('xsubpp',node,outnode)
+	self.source.append(outnode)
+class xsubpp(Task.Task):
+	run_str='${PERL} ${XSUBPP} -noprototypes -typemap ${EXTUTILS_TYPEMAP} ${SRC} > ${TGT}'
+	color='BLUE'
+	ext_out=['.h']
+@conf
+def check_perl_version(self,minver=None):
+	res=True
+	if minver:
+		cver='.'.join(map(str,minver))
+	else:
+		cver=''
+	self.start_msg('Checking for minimum perl version %s'%cver)
+	perl=getattr(Options.options,'perlbinary',None)
+	if not perl:
+		perl=self.find_program('perl',var='PERL')
+	if not perl:
+		self.end_msg("Perl not found",color="YELLOW")
+		return False
+	self.env['PERL']=perl
+	version=self.cmd_and_log([perl,"-e",'printf \"%vd\", $^V'])
+	if not version:
+		res=False
+		version="Unknown"
+	elif not minver is None:
+		ver=tuple(map(int,version.split(".")))
+		if ver<minver:
+			res=False
+	self.end_msg(version,color=res and"GREEN"or"YELLOW")
+	return res
+@conf
+def check_perl_module(self,module):
+	cmd=[self.env['PERL'],'-e','use %s'%module]
+	self.start_msg('perl module %s'%module)
+	try:
+		r=self.cmd_and_log(cmd)
+	except Exception:
+		self.end_msg(False)
+		return None
+	self.end_msg(r or True)
+	return r
+@conf
+def check_perl_ext_devel(self):
+	env=self.env
+	perl=env.PERL
+	if not perl:
+		self.fatal('find perl first')
+	def read_out(cmd):
+		return Utils.to_list(self.cmd_and_log(perl+cmd))
+	env['LINKFLAGS_PERLEXT']=read_out(" -MConfig -e'print $Config{lddlflags}'")
+	env['INCLUDES_PERLEXT']=read_out(" -MConfig -e'print \"$Config{archlib}/CORE\"'")
+	env['CFLAGS_PERLEXT']=read_out(" -MConfig -e'print \"$Config{ccflags} $Config{cccdlflags}\"'")
+	env['XSUBPP']=read_out(" -MConfig -e'print \"$Config{privlib}/ExtUtils/xsubpp$Config{exe_ext}\"'")
+	env['EXTUTILS_TYPEMAP']=read_out(" -MConfig -e'print \"$Config{privlib}/ExtUtils/typemap\"'")
+	if not getattr(Options.options,'perlarchdir',None):
+		env['ARCHDIR_PERL']=self.cmd_and_log(perl+" -MConfig -e'print $Config{sitearch}'")
+	else:
+		env['ARCHDIR_PERL']=getattr(Options.options,'perlarchdir')
+	env['perlext_PATTERN']='%s.'+self.cmd_and_log(perl+" -MConfig -e'print $Config{dlext}'")
+def options(opt):
+	opt.add_option('--with-perl-binary',type='string',dest='perlbinary',help='Specify alternate perl binary',default=None)
+	opt.add_option('--with-perl-archdir',type='string',dest='perlarchdir',help='Specify directory where to install arch specific files',default=None)
Index: waflib/Tools/python.py
===================================================================
--- waflib/Tools/python.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/python.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,340 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import os,sys
+from waflib import Utils,Options,Errors,Logs
+from waflib.TaskGen import extension,before_method,after_method,feature
+from waflib.Configure import conf
+FRAG='''
+#include <Python.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+	void Py_Initialize(void);
+	void Py_Finalize(void);
+#ifdef __cplusplus
+}
+#endif
+int main(int argc, char **argv)
+{
+   (void)argc; (void)argv;
+   Py_Initialize();
+   Py_Finalize();
+   return 0;
+}
+'''
+INST='''
+import sys, py_compile
+py_compile.compile(sys.argv[1], sys.argv[2], sys.argv[3])
+'''
+DISTUTILS_IMP=['from distutils.sysconfig import get_config_var, get_python_lib']
+@extension('.py')
+def process_py(self,node):
+	try:
+		if not self.bld.is_install:
+			return
+	except AttributeError:
+		return
+	try:
+		if not self.install_path:
+			return
+	except AttributeError:
+		self.install_path='${PYTHONDIR}'
+	def inst_py(ctx):
+		install_from=getattr(self,'install_from',None)
+		if install_from:
+			install_from=self.path.find_dir(install_from)
+		install_pyfile(self,node,install_from)
+	self.bld.add_post_fun(inst_py)
+def install_pyfile(self,node,install_from=None):
+	from_node=install_from or node.parent
+	tsk=self.bld.install_as(self.install_path+'/'+node.path_from(from_node),node,postpone=False)
+	path=tsk.get_install_path()
+	if self.bld.is_install<0:
+		Logs.info("+ removing byte compiled python files")
+		for x in'co':
+			try:
+				os.remove(path+x)
+			except OSError:
+				pass
+	if self.bld.is_install>0:
+		try:
+			st1=os.stat(path)
+		except OSError:
+			Logs.error('The python file is missing, this should not happen')
+		for x in['c','o']:
+			do_inst=self.env['PY'+x.upper()]
+			try:
+				st2=os.stat(path+x)
+			except OSError:
+				pass
+			else:
+				if st1.st_mtime<=st2.st_mtime:
+					do_inst=False
+			if do_inst:
+				lst=(x=='o')and[self.env['PYFLAGS_OPT']]or[]
+				(a,b,c)=(path,path+x,tsk.get_install_path(destdir=False)+x)
+				argv=self.env['PYTHON']+lst+['-c',INST,a,b,c]
+				Logs.info('+ byte compiling %r'%(path+x))
+				env=self.env.env or None
+				ret=Utils.subprocess.Popen(argv,env=env).wait()
+				if ret:
+					raise Errors.WafError('py%s compilation failed %r'%(x,path))
+@feature('py')
+def feature_py(self):
+	pass
+@feature('pyext')
+@before_method('propagate_uselib_vars','apply_link')
+@after_method('apply_bundle')
+def init_pyext(self):
+	self.uselib=self.to_list(getattr(self,'uselib',[]))
+	if not'PYEXT'in self.uselib:
+		self.uselib.append('PYEXT')
+	self.env.cshlib_PATTERN=self.env.cxxshlib_PATTERN=self.env.macbundle_PATTERN=self.env.pyext_PATTERN
+	self.env.fcshlib_PATTERN=self.env.dshlib_PATTERN=self.env.pyext_PATTERN
+	try:
+		if not self.install_path:
+			return
+	except AttributeError:
+		self.install_path='${PYTHONARCHDIR}'
+@feature('pyext')
+@before_method('apply_link','apply_bundle')
+def set_bundle(self):
+	if Utils.unversioned_sys_platform()=='darwin':
+		self.mac_bundle=True
+@before_method('propagate_uselib_vars')
+@feature('pyembed')
+def init_pyembed(self):
+	self.uselib=self.to_list(getattr(self,'uselib',[]))
+	if not'PYEMBED'in self.uselib:
+		self.uselib.append('PYEMBED')
+@conf
+def get_python_variables(self,variables,imports=None):
+	if not imports:
+		try:
+			imports=self.python_imports
+		except AttributeError:
+			imports=DISTUTILS_IMP
+	program=list(imports)
+	program.append('')
+	for v in variables:
+		program.append("print(repr(%s))"%v)
+	os_env=dict(os.environ)
+	try:
+		del os_env['MACOSX_DEPLOYMENT_TARGET']
+	except KeyError:
+		pass
+	try:
+		out=self.cmd_and_log(self.env.PYTHON+['-c','\n'.join(program)],env=os_env)
+	except Errors.WafError:
+		self.fatal('The distutils module is unusable: install "python-devel"?')
+	self.to_log(out)
+	return_values=[]
+	for s in out.split('\n'):
+		s=s.strip()
+		if not s:
+			continue
+		if s=='None':
+			return_values.append(None)
+		elif(s[0]=="'"and s[-1]=="'")or(s[0]=='"'and s[-1]=='"'):
+			return_values.append(eval(s))
+		elif s[0].isdigit():
+			return_values.append(int(s))
+		else:break
+	return return_values
+@conf
+def check_python_headers(conf):
+	env=conf.env
+	if not env['CC_NAME']and not env['CXX_NAME']:
+		conf.fatal('load a compiler first (gcc, g++, ..)')
+	if not env['PYTHON_VERSION']:
+		conf.check_python_version()
+	pybin=conf.env.PYTHON
+	if not pybin:
+		conf.fatal('Could not find the python executable')
+	v='prefix SO LDFLAGS LIBDIR LIBPL INCLUDEPY Py_ENABLE_SHARED MACOSX_DEPLOYMENT_TARGET LDSHARED CFLAGS'.split()
+	try:
+		lst=conf.get_python_variables(["get_config_var('%s') or ''"%x for x in v])
+	except RuntimeError:
+		conf.fatal("Python development headers not found (-v for details).")
+	vals=['%s = %r'%(x,y)for(x,y)in zip(v,lst)]
+	conf.to_log("Configuration returned from %r:\n%r\n"%(pybin,'\n'.join(vals)))
+	dct=dict(zip(v,lst))
+	x='MACOSX_DEPLOYMENT_TARGET'
+	if dct[x]:
+		conf.env[x]=conf.environ[x]=dct[x]
+	env['pyext_PATTERN']='%s'+dct['SO']
+	all_flags=dct['LDFLAGS']+' '+dct['CFLAGS']
+	conf.parse_flags(all_flags,'PYEMBED')
+	all_flags=dct['LDFLAGS']+' '+dct['LDSHARED']+' '+dct['CFLAGS']
+	conf.parse_flags(all_flags,'PYEXT')
+	result=None
+	for name in('python'+env['PYTHON_VERSION'],'python'+env['PYTHON_VERSION'].replace('.','')):
+		if not result and env['LIBPATH_PYEMBED']:
+			path=env['LIBPATH_PYEMBED']
+			conf.to_log("\n\n# Trying default LIBPATH_PYEMBED: %r\n"%path)
+			result=conf.check(lib=name,uselib='PYEMBED',libpath=path,mandatory=False,msg='Checking for library %s in LIBPATH_PYEMBED'%name)
+		if not result and dct['LIBDIR']:
+			path=[dct['LIBDIR']]
+			conf.to_log("\n\n# try again with -L$python_LIBDIR: %r\n"%path)
+			result=conf.check(lib=name,uselib='PYEMBED',libpath=path,mandatory=False,msg='Checking for library %s in LIBDIR'%name)
+		if not result and dct['LIBPL']:
+			path=[dct['LIBPL']]
+			conf.to_log("\n\n# try again with -L$python_LIBPL (some systems don't install the python library in $prefix/lib)\n")
+			result=conf.check(lib=name,uselib='PYEMBED',libpath=path,mandatory=False,msg='Checking for library %s in python_LIBPL'%name)
+		if not result:
+			path=[os.path.join(dct['prefix'],"libs")]
+			conf.to_log("\n\n# try again with -L$prefix/libs, and pythonXY name rather than pythonX.Y (win32)\n")
+			result=conf.check(lib=name,uselib='PYEMBED',libpath=path,mandatory=False,msg='Checking for library %s in $prefix/libs'%name)
+		if result:
+			break
+	if result:
+		env['LIBPATH_PYEMBED']=path
+		env.append_value('LIB_PYEMBED',[name])
+	else:
+		conf.to_log("\n\n### LIB NOT FOUND\n")
+	if(Utils.is_win32 or sys.platform.startswith('os2')or dct['Py_ENABLE_SHARED']):
+		env['LIBPATH_PYEXT']=env['LIBPATH_PYEMBED']
+		env['LIB_PYEXT']=env['LIB_PYEMBED']
+	num='.'.join(env['PYTHON_VERSION'].split('.')[:2])
+	conf.find_program([''.join(pybin)+'-config','python%s-config'%num,'python-config-%s'%num,'python%sm-config'%num],var='PYTHON_CONFIG',mandatory=False)
+	includes=[]
+	if conf.env.PYTHON_CONFIG:
+		for incstr in conf.cmd_and_log([conf.env.PYTHON_CONFIG,'--includes']).strip().split():
+			if(incstr.startswith('-I')or incstr.startswith('/I')):
+				incstr=incstr[2:]
+			if incstr not in includes:
+				includes.append(incstr)
+		conf.to_log("Include path for Python extensions (found via python-config --includes): %r\n"%(includes,))
+		env['INCLUDES_PYEXT']=includes
+		env['INCLUDES_PYEMBED']=includes
+	else:
+		conf.to_log("Include path for Python extensions ""(found via distutils module): %r\n"%(dct['INCLUDEPY'],))
+		env['INCLUDES_PYEXT']=[dct['INCLUDEPY']]
+		env['INCLUDES_PYEMBED']=[dct['INCLUDEPY']]
+	if env['CC_NAME']=='gcc':
+		env.append_value('CFLAGS_PYEMBED',['-fno-strict-aliasing'])
+		env.append_value('CFLAGS_PYEXT',['-fno-strict-aliasing'])
+	if env['CXX_NAME']=='gcc':
+		env.append_value('CXXFLAGS_PYEMBED',['-fno-strict-aliasing'])
+		env.append_value('CXXFLAGS_PYEXT',['-fno-strict-aliasing'])
+	if env.CC_NAME=="msvc":
+		from distutils.msvccompiler import MSVCCompiler
+		dist_compiler=MSVCCompiler()
+		dist_compiler.initialize()
+		env.append_value('CFLAGS_PYEXT',dist_compiler.compile_options)
+		env.append_value('CXXFLAGS_PYEXT',dist_compiler.compile_options)
+		env.append_value('LINKFLAGS_PYEXT',dist_compiler.ldflags_shared)
+	try:
+		conf.check(header_name='Python.h',define_name='HAVE_PYTHON_H',uselib='PYEMBED',fragment=FRAG,errmsg=':-(')
+	except conf.errors.ConfigurationError:
+		xx=conf.env.CXX_NAME and'cxx'or'c'
+		conf.check_cfg(msg='Asking python-config for the flags (pyembed)',path=conf.env.PYTHON_CONFIG,package='',uselib_store='PYEMBED',args=['--cflags','--libs','--ldflags'])
+		conf.check(header_name='Python.h',define_name='HAVE_PYTHON_H',msg='Getting pyembed flags from python-config',fragment=FRAG,errmsg='Could not build a python embedded interpreter',features='%s %sprogram pyembed'%(xx,xx))
+		conf.check_cfg(msg='Asking python-config for the flags (pyext)',path=conf.env.PYTHON_CONFIG,package='',uselib_store='PYEXT',args=['--cflags','--libs','--ldflags'])
+		conf.check(header_name='Python.h',define_name='HAVE_PYTHON_H',msg='Getting pyext flags from python-config',features='%s %sshlib pyext'%(xx,xx),fragment=FRAG,errmsg='Could not build python extensions')
+@conf
+def check_python_version(conf,minver=None):
+	assert minver is None or isinstance(minver,tuple)
+	pybin=conf.env['PYTHON']
+	if not pybin:
+		conf.fatal('could not find the python executable')
+	cmd=pybin+['-c','import sys\nfor x in sys.version_info: print(str(x))']
+	Logs.debug('python: Running python command %r'%cmd)
+	lines=conf.cmd_and_log(cmd).split()
+	assert len(lines)==5,"found %i lines, expected 5: %r"%(len(lines),lines)
+	pyver_tuple=(int(lines[0]),int(lines[1]),int(lines[2]),lines[3],int(lines[4]))
+	result=(minver is None)or(pyver_tuple>=minver)
+	if result:
+		pyver='.'.join([str(x)for x in pyver_tuple[:2]])
+		conf.env['PYTHON_VERSION']=pyver
+		if'PYTHONDIR'in conf.environ:
+			pydir=conf.environ['PYTHONDIR']
+		else:
+			if Utils.is_win32:
+				(python_LIBDEST,pydir)=conf.get_python_variables(["get_config_var('LIBDEST') or ''","get_python_lib(standard_lib=0, prefix=%r) or ''"%conf.env['PREFIX']])
+			else:
+				python_LIBDEST=None
+				(pydir,)=conf.get_python_variables(["get_python_lib(standard_lib=0, prefix=%r) or ''"%conf.env['PREFIX']])
+			if python_LIBDEST is None:
+				if conf.env['LIBDIR']:
+					python_LIBDEST=os.path.join(conf.env['LIBDIR'],"python"+pyver)
+				else:
+					python_LIBDEST=os.path.join(conf.env['PREFIX'],"lib","python"+pyver)
+		if'PYTHONARCHDIR'in conf.environ:
+			pyarchdir=conf.environ['PYTHONARCHDIR']
+		else:
+			(pyarchdir,)=conf.get_python_variables(["get_python_lib(plat_specific=1, standard_lib=0, prefix=%r) or ''"%conf.env['PREFIX']])
+			if not pyarchdir:
+				pyarchdir=pydir
+		if hasattr(conf,'define'):
+			conf.define('PYTHONDIR',pydir)
+			conf.define('PYTHONARCHDIR',pyarchdir)
+		conf.env['PYTHONDIR']=pydir
+		conf.env['PYTHONARCHDIR']=pyarchdir
+	pyver_full='.'.join(map(str,pyver_tuple[:3]))
+	if minver is None:
+		conf.msg('Checking for python version',pyver_full)
+	else:
+		minver_str='.'.join(map(str,minver))
+		conf.msg('Checking for python version',pyver_tuple,">= %s"%(minver_str,)and'GREEN'or'YELLOW')
+	if not result:
+		conf.fatal('The python version is too old, expecting %r'%(minver,))
+PYTHON_MODULE_TEMPLATE='''
+import %s as current_module
+version = getattr(current_module, '__version__', None)
+if version is not None:
+    print(str(version))
+else:
+    print('unknown version')
+'''
+@conf
+def check_python_module(conf,module_name,condition=''):
+	msg='Python module %s'%module_name
+	if condition:
+		msg='%s (%s)'%(msg,condition)
+	conf.start_msg(msg)
+	try:
+		ret=conf.cmd_and_log(conf.env['PYTHON']+['-c',PYTHON_MODULE_TEMPLATE%module_name])
+	except Exception:
+		conf.end_msg(False)
+		conf.fatal('Could not find the python module %r'%module_name)
+	ret=ret.strip()
+	if condition:
+		conf.end_msg(ret)
+		if ret=='unknown version':
+			conf.fatal('Could not check the %s version'%module_name)
+		from distutils.version import LooseVersion
+		def num(*k):
+			if isinstance(k[0],int):
+				return LooseVersion('.'.join([str(x)for x in k]))
+			else:
+				return LooseVersion(k[0])
+		d={'num':num,'ver':LooseVersion(ret)}
+		ev=eval(condition,{},d)
+		if not ev:
+			conf.fatal('The %s version does not satisfy the requirements'%module_name)
+	else:
+		if ret=='unknown version':
+			conf.end_msg(True)
+		else:
+			conf.end_msg(ret)
+def configure(conf):
+	try:
+		conf.find_program('python',var='PYTHON')
+	except conf.errors.ConfigurationError:
+		Logs.warn("could not find a python executable, setting to sys.executable '%s'"%sys.executable)
+		conf.env.PYTHON=sys.executable
+	if conf.env.PYTHON!=sys.executable:
+		Logs.warn("python executable %r differs from system %r"%(conf.env.PYTHON,sys.executable))
+	conf.env.PYTHON=conf.cmd_to_list(conf.env.PYTHON)
+	v=conf.env
+	v['PYCMD']='"import sys, py_compile;py_compile.compile(sys.argv[1], sys.argv[2])"'
+	v['PYFLAGS']=''
+	v['PYFLAGS_OPT']='-O'
+	v['PYC']=getattr(Options.options,'pyc',1)
+	v['PYO']=getattr(Options.options,'pyo',1)
+def options(opt):
+	opt.add_option('--nopyc',action='store_false',default=1,help='Do not install bytecode compiled .pyc files (configuration) [Default:install]',dest='pyc')
+	opt.add_option('--nopyo',action='store_false',default=1,help='Do not install optimised compiled .pyo files (configuration) [Default:install]',dest='pyo')
Index: waflib/Tools/qt4.py
===================================================================
--- waflib/Tools/qt4.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/qt4.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,437 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+try:
+	from xml.sax import make_parser
+	from xml.sax.handler import ContentHandler
+except ImportError:
+	has_xml=False
+	ContentHandler=object
+else:
+	has_xml=True
+import os,sys
+from waflib.Tools import c_preproc,cxx
+from waflib import Task,Utils,Options,Errors
+from waflib.TaskGen import feature,after_method,extension
+from waflib.Configure import conf
+from waflib import Logs
+MOC_H=['.h','.hpp','.hxx','.hh']
+EXT_RCC=['.qrc']
+EXT_UI=['.ui']
+EXT_QT4=['.cpp','.cc','.cxx','.C']
+QT4_LIBS="QtCore QtGui QtUiTools QtNetwork QtOpenGL QtSql QtSvg QtTest QtXml QtXmlPatterns QtWebKit Qt3Support QtHelp QtScript QtDeclarative"
+class qxx(cxx.cxx):
+	def __init__(self,*k,**kw):
+		Task.Task.__init__(self,*k,**kw)
+		self.moc_done=0
+	def scan(self):
+		(nodes,names)=c_preproc.scan(self)
+		for x in nodes:
+			if x.name.endswith('.moc'):
+				nodes.remove(x)
+				names.append(x.path_from(self.inputs[0].parent.get_bld()))
+		return(nodes,names)
+	def runnable_status(self):
+		if self.moc_done:
+			return Task.Task.runnable_status(self)
+		else:
+			for t in self.run_after:
+				if not t.hasrun:
+					return Task.ASK_LATER
+			self.add_moc_tasks()
+			return Task.Task.runnable_status(self)
+	def add_moc_tasks(self):
+		node=self.inputs[0]
+		bld=self.generator.bld
+		try:
+			self.signature()
+		except KeyError:
+			pass
+		else:
+			delattr(self,'cache_sig')
+		moctasks=[]
+		mocfiles=[]
+		try:
+			tmp_lst=bld.raw_deps[self.uid()]
+			bld.raw_deps[self.uid()]=[]
+		except KeyError:
+			tmp_lst=[]
+		for d in tmp_lst:
+			if not d.endswith('.moc'):
+				continue
+			if d in mocfiles:
+				Logs.error("paranoia owns")
+				continue
+			mocfiles.append(d)
+			h_node=None
+			try:ext=Options.options.qt_header_ext.split()
+			except AttributeError:pass
+			if not ext:ext=MOC_H
+			base2=d[:-4]
+			for x in[node.parent]+self.generator.includes_nodes:
+				for e in ext:
+					h_node=x.find_node(base2+e)
+					if h_node:
+						break
+				if h_node:
+					m_node=h_node.change_ext('.moc')
+					break
+			else:
+				for k in EXT_QT4:
+					if base2.endswith(k):
+						for x in[node.parent]+self.generator.includes_nodes:
+							h_node=x.find_node(base2)
+							if h_node:
+								break
+					if h_node:
+						m_node=h_node.change_ext(k+'.moc')
+						break
+			if not h_node:
+				raise Errors.WafError('no header found for %r which is a moc file'%d)
+			bld.node_deps[(self.inputs[0].parent.abspath(),m_node.name)]=h_node
+			task=Task.classes['moc'](env=self.env,generator=self.generator)
+			task.set_inputs(h_node)
+			task.set_outputs(m_node)
+			gen=bld.producer
+			gen.outstanding.insert(0,task)
+			gen.total+=1
+			moctasks.append(task)
+		tmp_lst=bld.raw_deps[self.uid()]=mocfiles
+		lst=bld.node_deps.get(self.uid(),())
+		for d in lst:
+			name=d.name
+			if name.endswith('.moc'):
+				task=Task.classes['moc'](env=self.env,generator=self.generator)
+				task.set_inputs(bld.node_deps[(self.inputs[0].parent.abspath(),name)])
+				task.set_outputs(d)
+				gen=bld.producer
+				gen.outstanding.insert(0,task)
+				gen.total+=1
+				moctasks.append(task)
+		self.run_after.update(set(moctasks))
+		self.moc_done=1
+	run=Task.classes['cxx'].__dict__['run']
+class trans_update(Task.Task):
+	run_str='${QT_LUPDATE} ${SRC} -ts ${TGT}'
+	color='BLUE'
+Task.update_outputs(trans_update)
+class XMLHandler(ContentHandler):
+	def __init__(self):
+		self.buf=[]
+		self.files=[]
+	def startElement(self,name,attrs):
+		if name=='file':
+			self.buf=[]
+	def endElement(self,name):
+		if name=='file':
+			self.files.append(str(''.join(self.buf)))
+	def characters(self,cars):
+		self.buf.append(cars)
+@extension(*EXT_RCC)
+def create_rcc_task(self,node):
+	rcnode=node.change_ext('_rc.cpp')
+	rcctask=self.create_task('rcc',node,rcnode)
+	cpptask=self.create_task('cxx',rcnode,rcnode.change_ext('.o'))
+	try:
+		self.compiled_tasks.append(cpptask)
+	except AttributeError:
+		self.compiled_tasks=[cpptask]
+	return cpptask
+@extension(*EXT_UI)
+def create_uic_task(self,node):
+	uictask=self.create_task('ui4',node)
+	uictask.outputs=[self.path.find_or_declare(self.env['ui_PATTERN']%node.name[:-3])]
+@extension('.ts')
+def add_lang(self,node):
+	self.lang=self.to_list(getattr(self,'lang',[]))+[node]
+@feature('qt4')
+@after_method('apply_link')
+def apply_qt4(self):
+	if getattr(self,'lang',None):
+		qmtasks=[]
+		for x in self.to_list(self.lang):
+			if isinstance(x,str):
+				x=self.path.find_resource(x+'.ts')
+			qmtasks.append(self.create_task('ts2qm',x,x.change_ext('.qm')))
+		if getattr(self,'update',None)and Options.options.trans_qt4:
+			cxxnodes=[a.inputs[0]for a in self.compiled_tasks]+[a.inputs[0]for a in self.tasks if getattr(a,'inputs',None)and a.inputs[0].name.endswith('.ui')]
+			for x in qmtasks:
+				self.create_task('trans_update',cxxnodes,x.inputs)
+		if getattr(self,'langname',None):
+			qmnodes=[x.outputs[0]for x in qmtasks]
+			rcnode=self.langname
+			if isinstance(rcnode,str):
+				rcnode=self.path.find_or_declare(rcnode+'.qrc')
+			t=self.create_task('qm2rcc',qmnodes,rcnode)
+			k=create_rcc_task(self,t.outputs[0])
+			self.link_task.inputs.append(k.outputs[0])
+	lst=[]
+	for flag in self.to_list(self.env['CXXFLAGS']):
+		if len(flag)<2:continue
+		f=flag[0:2]
+		if f in['-D','-I','/D','/I']:
+			if(f[0]=='/'):
+				lst.append('-'+flag[1:])
+			else:
+				lst.append(flag)
+	self.env['MOC_FLAGS']=lst
+@extension(*EXT_QT4)
+def cxx_hook(self,node):
+	return self.create_compiled_task('qxx',node)
+class rcc(Task.Task):
+	color='BLUE'
+	run_str='${QT_RCC} -name ${SRC[0].name} ${SRC[0].abspath()} ${RCC_ST} -o ${TGT}'
+	ext_out=['.h']
+	def scan(self):
+		node=self.inputs[0]
+		if not has_xml:
+			Logs.error('no xml support was found, the rcc dependencies will be incomplete!')
+			return([],[])
+		parser=make_parser()
+		curHandler=XMLHandler()
+		parser.setContentHandler(curHandler)
+		fi=open(self.inputs[0].abspath(),'r')
+		try:
+			parser.parse(fi)
+		finally:
+			fi.close()
+		nodes=[]
+		names=[]
+		root=self.inputs[0].parent
+		for x in curHandler.files:
+			nd=root.find_resource(x)
+			if nd:nodes.append(nd)
+			else:names.append(x)
+		return(nodes,names)
+class moc(Task.Task):
+	color='BLUE'
+	run_str='${QT_MOC} ${MOC_FLAGS} ${MOCCPPPATH_ST:INCPATHS} ${MOCDEFINES_ST:DEFINES} ${SRC} ${MOC_ST} ${TGT}'
+class ui4(Task.Task):
+	color='BLUE'
+	run_str='${QT_UIC} ${SRC} -o ${TGT}'
+	ext_out=['.h']
+class ts2qm(Task.Task):
+	color='BLUE'
+	run_str='${QT_LRELEASE} ${QT_LRELEASE_FLAGS} ${SRC} -qm ${TGT}'
+class qm2rcc(Task.Task):
+	color='BLUE'
+	after='ts2qm'
+	def run(self):
+		txt='\n'.join(['<file>%s</file>'%k.path_from(self.outputs[0].parent)for k in self.inputs])
+		code='<!DOCTYPE RCC><RCC version="1.0">\n<qresource>\n%s\n</qresource>\n</RCC>'%txt
+		self.outputs[0].write(code)
+def configure(self):
+	self.find_qt4_binaries()
+	self.set_qt4_libs_to_check()
+	self.find_qt4_libraries()
+	self.add_qt4_rpath()
+	self.simplify_qt4_libs()
+@conf
+def find_qt4_binaries(self):
+	env=self.env
+	opt=Options.options
+	qtdir=getattr(opt,'qtdir','')
+	qtbin=getattr(opt,'qtbin','')
+	paths=[]
+	if qtdir:
+		qtbin=os.path.join(qtdir,'bin')
+	if not qtdir:
+		qtdir=os.environ.get('QT4_ROOT','')
+		qtbin=os.environ.get('QT4_BIN',None)or os.path.join(qtdir,'bin')
+	if qtbin:
+		paths=[qtbin]
+	if not qtdir:
+		paths=os.environ.get('PATH','').split(os.pathsep)
+		paths.append('/usr/share/qt4/bin/')
+		try:
+			lst=Utils.listdir('/usr/local/Trolltech/')
+		except OSError:
+			pass
+		else:
+			if lst:
+				lst.sort()
+				lst.reverse()
+				qtdir='/usr/local/Trolltech/%s/'%lst[0]
+				qtbin=os.path.join(qtdir,'bin')
+				paths.append(qtbin)
+	cand=None
+	prev_ver=['4','0','0']
+	for qmk in['qmake-qt4','qmake4','qmake']:
+		try:
+			qmake=self.find_program(qmk,path_list=paths)
+		except self.errors.ConfigurationError:
+			pass
+		else:
+			try:
+				version=self.cmd_and_log([qmake,'-query','QT_VERSION']).strip()
+			except self.errors.WafError:
+				pass
+			else:
+				if version:
+					new_ver=version.split('.')
+					if new_ver>prev_ver:
+						cand=qmake
+						prev_ver=new_ver
+	if cand:
+		self.env.QMAKE=cand
+	else:
+		self.fatal('Could not find qmake for qt4')
+	qtbin=self.cmd_and_log([self.env.QMAKE,'-query','QT_INSTALL_BINS']).strip()+os.sep
+	def find_bin(lst,var):
+		if var in env:
+			return
+		for f in lst:
+			try:
+				ret=self.find_program(f,path_list=paths)
+			except self.errors.ConfigurationError:
+				pass
+			else:
+				env[var]=ret
+				break
+	find_bin(['uic-qt3','uic3'],'QT_UIC3')
+	find_bin(['uic-qt4','uic'],'QT_UIC')
+	if not env['QT_UIC']:
+		self.fatal('cannot find the uic compiler for qt4')
+	try:
+		uicver=self.cmd_and_log(env['QT_UIC']+" -version 2>&1").strip()
+	except self.errors.ConfigurationError:
+		self.fatal('this uic compiler is for qt3, add uic for qt4 to your path')
+	uicver=uicver.replace('Qt User Interface Compiler ','').replace('User Interface Compiler for Qt','')
+	self.msg('Checking for uic version','%s'%uicver)
+	if uicver.find(' 3.')!=-1:
+		self.fatal('this uic compiler is for qt3, add uic for qt4 to your path')
+	find_bin(['moc-qt4','moc'],'QT_MOC')
+	find_bin(['rcc'],'QT_RCC')
+	find_bin(['lrelease-qt4','lrelease'],'QT_LRELEASE')
+	find_bin(['lupdate-qt4','lupdate'],'QT_LUPDATE')
+	env['UIC3_ST']='%s -o %s'
+	env['UIC_ST']='%s -o %s'
+	env['MOC_ST']='-o'
+	env['ui_PATTERN']='ui_%s.h'
+	env['QT_LRELEASE_FLAGS']=['-silent']
+	env.MOCCPPPATH_ST='-I%s'
+	env.MOCDEFINES_ST='-D%s'
+@conf
+def find_qt4_libraries(self):
+	qtlibs=getattr(Options.options,'qtlibs',None)or os.environ.get("QT4_LIBDIR",None)
+	if not qtlibs:
+		try:
+			qtlibs=self.cmd_and_log([self.env.QMAKE,'-query','QT_INSTALL_LIBS']).strip()
+		except Errors.WafError:
+			qtdir=self.cmd_and_log([self.env.QMAKE,'-query','QT_INSTALL_PREFIX']).strip()+os.sep
+			qtlibs=os.path.join(qtdir,'lib')
+	self.msg('Found the Qt4 libraries in',qtlibs)
+	qtincludes=os.environ.get("QT4_INCLUDES",None)or self.cmd_and_log([self.env.QMAKE,'-query','QT_INSTALL_HEADERS']).strip()
+	env=self.env
+	if not'PKG_CONFIG_PATH'in os.environ:
+		os.environ['PKG_CONFIG_PATH']='%s:%s/pkgconfig:/usr/lib/qt4/lib/pkgconfig:/opt/qt4/lib/pkgconfig:/usr/lib/qt4/lib:/opt/qt4/lib'%(qtlibs,qtlibs)
+	try:
+		if os.environ.get("QT4_XCOMPILE",None):
+			raise self.errors.ConfigurationError()
+		self.check_cfg(atleast_pkgconfig_version='0.1')
+	except self.errors.ConfigurationError:
+		for i in self.qt4_vars:
+			uselib=i.upper()
+			if Utils.unversioned_sys_platform()=="darwin":
+				frameworkName=i+".framework"
+				qtDynamicLib=os.path.join(qtlibs,frameworkName,i)
+				if os.path.exists(qtDynamicLib):
+					env.append_unique('FRAMEWORK_'+uselib,i)
+					self.msg('Checking for %s'%i,qtDynamicLib,'GREEN')
+				else:
+					self.msg('Checking for %s'%i,False,'YELLOW')
+				env.append_unique('INCLUDES_'+uselib,os.path.join(qtlibs,frameworkName,'Headers'))
+			elif env.DEST_OS!="win32":
+				qtDynamicLib=os.path.join(qtlibs,"lib"+i+".so")
+				qtStaticLib=os.path.join(qtlibs,"lib"+i+".a")
+				if os.path.exists(qtDynamicLib):
+					env.append_unique('LIB_'+uselib,i)
+					self.msg('Checking for %s'%i,qtDynamicLib,'GREEN')
+				elif os.path.exists(qtStaticLib):
+					env.append_unique('LIB_'+uselib,i)
+					self.msg('Checking for %s'%i,qtStaticLib,'GREEN')
+				else:
+					self.msg('Checking for %s'%i,False,'YELLOW')
+				env.append_unique('LIBPATH_'+uselib,qtlibs)
+				env.append_unique('INCLUDES_'+uselib,qtincludes)
+				env.append_unique('INCLUDES_'+uselib,os.path.join(qtincludes,i))
+			else:
+				for k in("lib%s.a","lib%s4.a","%s.lib","%s4.lib"):
+					lib=os.path.join(qtlibs,k%i)
+					if os.path.exists(lib):
+						env.append_unique('LIB_'+uselib,i+k[k.find("%s")+2:k.find('.')])
+						self.msg('Checking for %s'%i,lib,'GREEN')
+						break
+				else:
+					self.msg('Checking for %s'%i,False,'YELLOW')
+				env.append_unique('LIBPATH_'+uselib,qtlibs)
+				env.append_unique('INCLUDES_'+uselib,qtincludes)
+				env.append_unique('INCLUDES_'+uselib,os.path.join(qtincludes,i))
+				uselib=i.upper()+"_debug"
+				for k in("lib%sd.a","lib%sd4.a","%sd.lib","%sd4.lib"):
+					lib=os.path.join(qtlibs,k%i)
+					if os.path.exists(lib):
+						env.append_unique('LIB_'+uselib,i+k[k.find("%s")+2:k.find('.')])
+						self.msg('Checking for %s'%i,lib,'GREEN')
+						break
+				else:
+					self.msg('Checking for %s'%i,False,'YELLOW')
+				env.append_unique('LIBPATH_'+uselib,qtlibs)
+				env.append_unique('INCLUDES_'+uselib,qtincludes)
+				env.append_unique('INCLUDES_'+uselib,os.path.join(qtincludes,i))
+	else:
+		for i in self.qt4_vars_debug+self.qt4_vars:
+			self.check_cfg(package=i,args='--cflags --libs',mandatory=False)
+@conf
+def simplify_qt4_libs(self):
+	env=self.env
+	def process_lib(vars_,coreval):
+		for d in vars_:
+			var=d.upper()
+			if var=='QTCORE':
+				continue
+			value=env['LIBPATH_'+var]
+			if value:
+				core=env[coreval]
+				accu=[]
+				for lib in value:
+					if lib in core:
+						continue
+					accu.append(lib)
+				env['LIBPATH_'+var]=accu
+	process_lib(self.qt4_vars,'LIBPATH_QTCORE')
+	process_lib(self.qt4_vars_debug,'LIBPATH_QTCORE_DEBUG')
+@conf
+def add_qt4_rpath(self):
+	env=self.env
+	if Options.options.want_rpath:
+		def process_rpath(vars_,coreval):
+			for d in vars_:
+				var=d.upper()
+				value=env['LIBPATH_'+var]
+				if value:
+					core=env[coreval]
+					accu=[]
+					for lib in value:
+						if var!='QTCORE':
+							if lib in core:
+								continue
+						accu.append('-Wl,--rpath='+lib)
+					env['RPATH_'+var]=accu
+		process_rpath(self.qt4_vars,'LIBPATH_QTCORE')
+		process_rpath(self.qt4_vars_debug,'LIBPATH_QTCORE_DEBUG')
+@conf
+def set_qt4_libs_to_check(self):
+	if not hasattr(self,'qt4_vars'):
+		self.qt4_vars=QT4_LIBS
+	self.qt4_vars=Utils.to_list(self.qt4_vars)
+	if not hasattr(self,'qt4_vars_debug'):
+		self.qt4_vars_debug=[a+'_debug'for a in self.qt4_vars]
+	self.qt4_vars_debug=Utils.to_list(self.qt4_vars_debug)
+def options(opt):
+	opt.add_option('--want-rpath',action='store_true',default=False,dest='want_rpath',help='enable the rpath for qt libraries')
+	opt.add_option('--header-ext',type='string',default='',help='header extension for moc files',dest='qt_header_ext')
+	for i in'qtdir qtbin qtlibs'.split():
+		opt.add_option('--'+i,type='string',default='',dest=i)
+	opt.add_option('--translate',action="store_true",help="collect translation strings",dest="trans_qt4",default=False)
Index: waflib/Tools/ruby.py
===================================================================
--- waflib/Tools/ruby.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/ruby.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,103 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import os
+from waflib import Task,Options,Utils
+from waflib.TaskGen import before_method,feature,after_method,Task,extension
+from waflib.Configure import conf
+@feature('rubyext')
+@before_method('apply_incpaths','apply_lib_vars','apply_bundle','apply_link')
+def init_rubyext(self):
+	self.install_path='${ARCHDIR_RUBY}'
+	self.uselib=self.to_list(getattr(self,'uselib',''))
+	if not'RUBY'in self.uselib:
+		self.uselib.append('RUBY')
+	if not'RUBYEXT'in self.uselib:
+		self.uselib.append('RUBYEXT')
+@feature('rubyext')
+@before_method('apply_link','propagate_uselib')
+def apply_ruby_so_name(self):
+	self.env['cshlib_PATTERN']=self.env['cxxshlib_PATTERN']=self.env['rubyext_PATTERN']
+@conf
+def check_ruby_version(self,minver=()):
+	if Options.options.rubybinary:
+		self.env.RUBY=Options.options.rubybinary
+	else:
+		self.find_program('ruby',var='RUBY')
+	ruby=self.env.RUBY
+	try:
+		version=self.cmd_and_log([ruby,'-e','puts defined?(VERSION) ? VERSION : RUBY_VERSION']).strip()
+	except Exception:
+		self.fatal('could not determine ruby version')
+	self.env.RUBY_VERSION=version
+	try:
+		ver=tuple(map(int,version.split(".")))
+	except Exception:
+		self.fatal('unsupported ruby version %r'%version)
+	cver=''
+	if minver:
+		if ver<minver:
+			self.fatal('ruby is too old %r'%ver)
+		cver='.'.join([str(x)for x in minver])
+	else:
+		cver=ver
+	self.msg('Checking for ruby version %s'%str(minver or''),cver)
+@conf
+def check_ruby_ext_devel(self):
+	if not self.env.RUBY:
+		self.fatal('ruby detection is required first')
+	if not self.env.CC_NAME and not self.env.CXX_NAME:
+		self.fatal('load a c/c++ compiler first')
+	version=tuple(map(int,self.env.RUBY_VERSION.split(".")))
+	def read_out(cmd):
+		return Utils.to_list(self.cmd_and_log([self.env.RUBY,'-rrbconfig','-e',cmd]))
+	def read_config(key):
+		return read_out('puts Config::CONFIG[%r]'%key)
+	ruby=self.env['RUBY']
+	archdir=read_config('archdir')
+	cpppath=archdir
+	if version>=(1,9,0):
+		ruby_hdrdir=read_config('rubyhdrdir')
+		cpppath+=ruby_hdrdir
+		cpppath+=[os.path.join(ruby_hdrdir[0],read_config('arch')[0])]
+	self.check(header_name='ruby.h',includes=cpppath,errmsg='could not find ruby header file')
+	self.env.LIBPATH_RUBYEXT=read_config('libdir')
+	self.env.LIBPATH_RUBYEXT+=archdir
+	self.env.INCLUDES_RUBYEXT=cpppath
+	self.env.CFLAGS_RUBYEXT=read_config('CCDLFLAGS')
+	self.env.rubyext_PATTERN='%s.'+read_config('DLEXT')[0]
+	flags=read_config('LDSHARED')
+	while flags and flags[0][0]!='-':
+		flags=flags[1:]
+	if len(flags)>1 and flags[1]=="ppc":
+		flags=flags[2:]
+	self.env.LINKFLAGS_RUBYEXT=flags
+	self.env.LINKFLAGS_RUBYEXT+=read_config('LIBS')
+	self.env.LINKFLAGS_RUBYEXT+=read_config('LIBRUBYARG_SHARED')
+	if Options.options.rubyarchdir:
+		self.env.ARCHDIR_RUBY=Options.options.rubyarchdir
+	else:
+		self.env.ARCHDIR_RUBY=read_config('sitearchdir')[0]
+	if Options.options.rubylibdir:
+		self.env.LIBDIR_RUBY=Options.options.rubylibdir
+	else:
+		self.env.LIBDIR_RUBY=read_config('sitelibdir')[0]
+@conf
+def check_ruby_module(self,module_name):
+	self.start_msg('Ruby module %s'%module_name)
+	try:
+		self.cmd_and_log([self.env['RUBY'],'-e','require \'%s\';puts 1'%module_name])
+	except Exception:
+		self.end_msg(False)
+		self.fatal('Could not find the ruby module %r'%module_name)
+	self.end_msg(True)
+@extension('.rb')
+def process(self,node):
+	tsk=self.create_task('run_ruby',node)
+class run_ruby(Task.Task):
+	run_str='${RUBY} ${RBFLAGS} -I ${SRC[0].parent.abspath()} ${SRC}'
+def options(opt):
+	opt.add_option('--with-ruby-archdir',type='string',dest='rubyarchdir',help='Specify directory where to install arch specific files')
+	opt.add_option('--with-ruby-libdir',type='string',dest='rubylibdir',help='Specify alternate ruby library path')
+	opt.add_option('--with-ruby-binary',type='string',dest='rubybinary',help='Specify alternate ruby binary')
Index: waflib/Tools/suncc.py
===================================================================
--- waflib/Tools/suncc.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/suncc.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,53 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import os
+from waflib import Utils
+from waflib.Tools import ccroot,ar
+from waflib.Configure import conf
+@conf
+def find_scc(conf):
+	v=conf.env
+	cc=None
+	if v['CC']:cc=v['CC']
+	elif'CC'in conf.environ:cc=conf.environ['CC']
+	if not cc:cc=conf.find_program('cc',var='CC')
+	if not cc:conf.fatal('Could not find a Sun C compiler')
+	cc=conf.cmd_to_list(cc)
+	try:
+		conf.cmd_and_log(cc+['-flags'])
+	except Exception:
+		conf.fatal('%r is not a Sun compiler'%cc)
+	v['CC']=cc
+	v['CC_NAME']='sun'
+@conf
+def scc_common_flags(conf):
+	v=conf.env
+	v['CC_SRC_F']=[]
+	v['CC_TGT_F']=['-c','-o']
+	if not v['LINK_CC']:v['LINK_CC']=v['CC']
+	v['CCLNK_SRC_F']=''
+	v['CCLNK_TGT_F']=['-o']
+	v['CPPPATH_ST']='-I%s'
+	v['DEFINES_ST']='-D%s'
+	v['LIB_ST']='-l%s'
+	v['LIBPATH_ST']='-L%s'
+	v['STLIB_ST']='-l%s'
+	v['STLIBPATH_ST']='-L%s'
+	v['SONAME_ST']='-Wl,-h,%s'
+	v['SHLIB_MARKER']='-Bdynamic'
+	v['STLIB_MARKER']='-Bstatic'
+	v['cprogram_PATTERN']='%s'
+	v['CFLAGS_cshlib']=['-Kpic','-DPIC']
+	v['LINKFLAGS_cshlib']=['-G']
+	v['cshlib_PATTERN']='lib%s.so'
+	v['LINKFLAGS_cstlib']=['-Bstatic']
+	v['cstlib_PATTERN']='lib%s.a'
+def configure(conf):
+	conf.find_scc()
+	conf.find_ar()
+	conf.scc_common_flags()
+	conf.cc_load_tools()
+	conf.cc_add_flags()
+	conf.link_add_flags()
Index: waflib/Tools/suncxx.py
===================================================================
--- waflib/Tools/suncxx.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/suncxx.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,54 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import os
+from waflib import Utils
+from waflib.Tools import ccroot,ar
+from waflib.Configure import conf
+@conf
+def find_sxx(conf):
+	v=conf.env
+	cc=None
+	if v['CXX']:cc=v['CXX']
+	elif'CXX'in conf.environ:cc=conf.environ['CXX']
+	if not cc:cc=conf.find_program('CC',var='CXX')
+	if not cc:cc=conf.find_program('c++',var='CXX')
+	if not cc:conf.fatal('Could not find a Sun C++ compiler')
+	cc=conf.cmd_to_list(cc)
+	try:
+		conf.cmd_and_log(cc+['-flags'])
+	except Exception:
+		conf.fatal('%r is not a Sun compiler'%cc)
+	v['CXX']=cc
+	v['CXX_NAME']='sun'
+@conf
+def sxx_common_flags(conf):
+	v=conf.env
+	v['CXX_SRC_F']=[]
+	v['CXX_TGT_F']=['-c','-o']
+	if not v['LINK_CXX']:v['LINK_CXX']=v['CXX']
+	v['CXXLNK_SRC_F']=[]
+	v['CXXLNK_TGT_F']=['-o']
+	v['CPPPATH_ST']='-I%s'
+	v['DEFINES_ST']='-D%s'
+	v['LIB_ST']='-l%s'
+	v['LIBPATH_ST']='-L%s'
+	v['STLIB_ST']='-l%s'
+	v['STLIBPATH_ST']='-L%s'
+	v['SONAME_ST']='-Wl,-h,%s'
+	v['SHLIB_MARKER']='-Bdynamic'
+	v['STLIB_MARKER']='-Bstatic'
+	v['cxxprogram_PATTERN']='%s'
+	v['CXXFLAGS_cxxshlib']=['-Kpic','-DPIC']
+	v['LINKFLAGS_cxxshlib']=['-G']
+	v['cxxshlib_PATTERN']='lib%s.so'
+	v['LINKFLAGS_cxxstlib']=['-Bstatic']
+	v['cxxstlib_PATTERN']='lib%s.a'
+def configure(conf):
+	conf.find_sxx()
+	conf.find_ar()
+	conf.sxx_common_flags()
+	conf.cxx_load_tools()
+	conf.cxx_add_flags()
+	conf.link_add_flags()
Index: waflib/Tools/tex.py
===================================================================
--- waflib/Tools/tex.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/tex.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,250 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import os,re
+from waflib import Utils,Task,Errors,Logs
+from waflib.TaskGen import feature,before_method
+re_bibunit=re.compile(r'\\(?P<type>putbib)\[(?P<file>[^\[\]]*)\]',re.M)
+def bibunitscan(self):
+	node=self.inputs[0]
+	nodes=[]
+	if not node:return nodes
+	code=node.read()
+	for match in re_bibunit.finditer(code):
+		path=match.group('file')
+		if path:
+			for k in['','.bib']:
+				Logs.debug('tex: trying %s%s'%(path,k))
+				fi=node.parent.find_resource(path+k)
+				if fi:
+					nodes.append(fi)
+			else:
+				Logs.debug('tex: could not find %s'%path)
+	Logs.debug("tex: found the following bibunit files: %s"%nodes)
+	return nodes
+exts_deps_tex=['','.ltx','.tex','.bib','.pdf','.png','.eps','.ps']
+exts_tex=['.ltx','.tex']
+re_tex=re.compile(r'\\(?P<type>include|bibliography|putbib|includegraphics|input|import|bringin|lstinputlisting)(\[[^\[\]]*\])?{(?P<file>[^{}]*)}',re.M)
+g_bibtex_re=re.compile('bibdata',re.M)
+class tex(Task.Task):
+	bibtex_fun,_=Task.compile_fun('${BIBTEX} ${BIBTEXFLAGS} ${SRCFILE}',shell=False)
+	bibtex_fun.__doc__="""
+	Execute the program **bibtex**
+	"""
+	makeindex_fun,_=Task.compile_fun('${MAKEINDEX} ${MAKEINDEXFLAGS} ${SRCFILE}',shell=False)
+	makeindex_fun.__doc__="""
+	Execute the program **makeindex**
+	"""
+	def exec_command(self,cmd,**kw):
+		bld=self.generator.bld
+		try:
+			if not kw.get('cwd',None):
+				kw['cwd']=bld.cwd
+		except AttributeError:
+			bld.cwd=kw['cwd']=bld.variant_dir
+		return Utils.subprocess.Popen(cmd,**kw).wait()
+	def scan_aux(self,node):
+		nodes=[node]
+		re_aux=re.compile(r'\\@input{(?P<file>[^{}]*)}',re.M)
+		def parse_node(node):
+			code=node.read()
+			for match in re_aux.finditer(code):
+				path=match.group('file')
+				found=node.parent.find_or_declare(path)
+				if found and found not in nodes:
+					Logs.debug('tex: found aux node '+found.abspath())
+					nodes.append(found)
+					parse_node(found)
+		parse_node(node)
+		return nodes
+	def scan(self):
+		node=self.inputs[0]
+		nodes=[]
+		names=[]
+		seen=[]
+		if not node:return(nodes,names)
+		def parse_node(node):
+			if node in seen:
+				return
+			seen.append(node)
+			code=node.read()
+			global re_tex
+			for match in re_tex.finditer(code):
+				for path in match.group('file').split(','):
+					if path:
+						add_name=True
+						found=None
+						for k in exts_deps_tex:
+							Logs.debug('tex: trying %s%s'%(path,k))
+							found=node.parent.find_resource(path+k)
+							if found and not found in self.outputs:
+								nodes.append(found)
+								add_name=False
+								for ext in exts_tex:
+									if found.name.endswith(ext):
+										parse_node(found)
+										break
+						if add_name:
+							names.append(path)
+		parse_node(node)
+		for x in nodes:
+			x.parent.get_bld().mkdir()
+		Logs.debug("tex: found the following : %s and names %s"%(nodes,names))
+		return(nodes,names)
+	def check_status(self,msg,retcode):
+		if retcode!=0:
+			raise Errors.WafError("%r command exit status %r"%(msg,retcode))
+	def bibfile(self):
+		need_bibtex=False
+		try:
+			for aux_node in self.aux_nodes:
+				ct=aux_node.read()
+				if g_bibtex_re.findall(ct):
+					need_bibtex=True
+					break
+		except(OSError,IOError):
+			Logs.error('error bibtex scan')
+		else:
+			if need_bibtex:
+				Logs.warn('calling bibtex')
+				self.env.env={}
+				self.env.env.update(os.environ)
+				self.env.env.update({'BIBINPUTS':self.TEXINPUTS,'BSTINPUTS':self.TEXINPUTS})
+				self.env.SRCFILE=self.aux_nodes[0].name[:-4]
+				self.check_status('error when calling bibtex',self.bibtex_fun())
+	def bibunits(self):
+		try:
+			bibunits=bibunitscan(self)
+		except OSError:
+			Logs.error('error bibunitscan')
+		else:
+			if bibunits:
+				fn=['bu'+str(i)for i in xrange(1,len(bibunits)+1)]
+				if fn:
+					Logs.warn('calling bibtex on bibunits')
+				for f in fn:
+					self.env.env={'BIBINPUTS':self.TEXINPUTS,'BSTINPUTS':self.TEXINPUTS}
+					self.env.SRCFILE=f
+					self.check_status('error when calling bibtex',self.bibtex_fun())
+	def makeindex(self):
+		try:
+			idx_path=self.idx_node.abspath()
+			os.stat(idx_path)
+		except OSError:
+			Logs.warn('index file %s absent, not calling makeindex'%idx_path)
+		else:
+			Logs.warn('calling makeindex')
+			self.env.SRCFILE=self.idx_node.name
+			self.env.env={}
+			self.check_status('error when calling makeindex %s'%idx_path,self.makeindex_fun())
+	def run(self):
+		env=self.env
+		if not env['PROMPT_LATEX']:
+			env.append_value('LATEXFLAGS','-interaction=batchmode')
+			env.append_value('PDFLATEXFLAGS','-interaction=batchmode')
+			env.append_value('XELATEXFLAGS','-interaction=batchmode')
+		fun=self.texfun
+		node=self.inputs[0]
+		srcfile=node.abspath()
+		texinputs=self.env.TEXINPUTS or''
+		self.TEXINPUTS=node.parent.get_bld().abspath()+os.pathsep+node.parent.get_src().abspath()+os.pathsep+texinputs+os.pathsep
+		self.cwd=self.inputs[0].parent.get_bld().abspath()
+		Logs.warn('first pass on %s'%self.__class__.__name__)
+		self.env.env={}
+		self.env.env.update(os.environ)
+		self.env.env.update({'TEXINPUTS':self.TEXINPUTS})
+		self.env.SRCFILE=srcfile
+		self.check_status('error when calling latex',fun())
+		self.aux_nodes=self.scan_aux(node.change_ext('.aux'))
+		self.idx_node=node.change_ext('.idx')
+		self.bibfile()
+		self.bibunits()
+		self.makeindex()
+		hash=''
+		for i in range(10):
+			prev_hash=hash
+			try:
+				hashes=[Utils.h_file(x.abspath())for x in self.aux_nodes]
+				hash=Utils.h_list(hashes)
+			except(OSError,IOError):
+				Logs.error('could not read aux.h')
+				pass
+			if hash and hash==prev_hash:
+				break
+			Logs.warn('calling %s'%self.__class__.__name__)
+			self.env.env={}
+			self.env.env.update(os.environ)
+			self.env.env.update({'TEXINPUTS':self.TEXINPUTS})
+			self.env.SRCFILE=srcfile
+			self.check_status('error when calling %s'%self.__class__.__name__,fun())
+class latex(tex):
+	texfun,vars=Task.compile_fun('${LATEX} ${LATEXFLAGS} ${SRCFILE}',shell=False)
+class pdflatex(tex):
+	texfun,vars=Task.compile_fun('${PDFLATEX} ${PDFLATEXFLAGS} ${SRCFILE}',shell=False)
+class xelatex(tex):
+	texfun,vars=Task.compile_fun('${XELATEX} ${XELATEXFLAGS} ${SRCFILE}',shell=False)
+class dvips(Task.Task):
+	run_str='${DVIPS} ${DVIPSFLAGS} ${SRC} -o ${TGT}'
+	color='BLUE'
+	after=['latex','pdflatex','xelatex']
+class dvipdf(Task.Task):
+	run_str='${DVIPDF} ${DVIPDFFLAGS} ${SRC} ${TGT}'
+	color='BLUE'
+	after=['latex','pdflatex','xelatex']
+class pdf2ps(Task.Task):
+	run_str='${PDF2PS} ${PDF2PSFLAGS} ${SRC} ${TGT}'
+	color='BLUE'
+	after=['latex','pdflatex','xelatex']
+@feature('tex')
+@before_method('process_source')
+def apply_tex(self):
+	if not getattr(self,'type',None)in['latex','pdflatex','xelatex']:
+		self.type='pdflatex'
+	tree=self.bld
+	outs=Utils.to_list(getattr(self,'outs',[]))
+	self.env['PROMPT_LATEX']=getattr(self,'prompt',1)
+	deps_lst=[]
+	if getattr(self,'deps',None):
+		deps=self.to_list(self.deps)
+		for filename in deps:
+			n=self.path.find_resource(filename)
+			if not n:
+				self.bld.fatal('Could not find %r for %r'%(filename,self))
+			if not n in deps_lst:
+				deps_lst.append(n)
+	for node in self.to_nodes(self.source):
+		if self.type=='latex':
+			task=self.create_task('latex',node,node.change_ext('.dvi'))
+		elif self.type=='pdflatex':
+			task=self.create_task('pdflatex',node,node.change_ext('.pdf'))
+		elif self.type=='xelatex':
+			task=self.create_task('xelatex',node,node.change_ext('.pdf'))
+		task.env=self.env
+		if deps_lst:
+			try:
+				lst=tree.node_deps[task.uid()]
+				for n in deps_lst:
+					if not n in lst:
+						lst.append(n)
+			except KeyError:
+				tree.node_deps[task.uid()]=deps_lst
+		if self.type=='latex':
+			if'ps'in outs:
+				tsk=self.create_task('dvips',task.outputs,node.change_ext('.ps'))
+				tsk.env.env={'TEXINPUTS':node.parent.abspath()+os.pathsep+self.path.abspath()+os.pathsep+self.path.get_bld().abspath()}
+			if'pdf'in outs:
+				tsk=self.create_task('dvipdf',task.outputs,node.change_ext('.pdf'))
+				tsk.env.env={'TEXINPUTS':node.parent.abspath()+os.pathsep+self.path.abspath()+os.pathsep+self.path.get_bld().abspath()}
+		elif self.type=='pdflatex':
+			if'ps'in outs:
+				self.create_task('pdf2ps',task.outputs,node.change_ext('.ps'))
+	self.source=[]
+def configure(self):
+	v=self.env
+	for p in'tex latex pdflatex xelatex bibtex dvips dvipdf ps2pdf makeindex pdf2ps'.split():
+		try:
+			self.find_program(p,var=p.upper())
+		except self.errors.ConfigurationError:
+			pass
+	v['DVIPSFLAGS']='-Ppdf'
Index: waflib/Tools/vala.py
===================================================================
--- waflib/Tools/vala.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/vala.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,201 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import os.path,shutil,re
+from waflib import Context,Task,Utils,Logs,Options,Errors
+from waflib.TaskGen import extension,taskgen_method
+from waflib.Configure import conf
+class valac(Task.Task):
+	vars=["VALAC","VALAC_VERSION","VALAFLAGS"]
+	ext_out=['.h']
+	def run(self):
+		cmd=[self.env['VALAC']]+self.env['VALAFLAGS']
+		cmd.extend([a.abspath()for a in self.inputs])
+		ret=self.exec_command(cmd,cwd=self.outputs[0].parent.abspath())
+		if ret:
+			return ret
+		for x in self.outputs:
+			if id(x.parent)!=id(self.outputs[0].parent):
+				shutil.move(self.outputs[0].parent.abspath()+os.sep+x.name,x.abspath())
+		if self.generator.dump_deps_node:
+			self.generator.dump_deps_node.write('\n'.join(self.generator.packages))
+		return ret
+valac=Task.update_outputs(valac)
+@taskgen_method
+def init_vala_task(self):
+	self.profile=getattr(self,'profile','gobject')
+	if self.profile=='gobject':
+		self.uselib=Utils.to_list(getattr(self,'uselib',[]))
+		if not'GOBJECT'in self.uselib:
+			self.uselib.append('GOBJECT')
+	def addflags(flags):
+		self.env.append_value('VALAFLAGS',flags)
+	if self.profile:
+		addflags('--profile=%s'%self.profile)
+	if hasattr(self,'threading'):
+		if self.profile=='gobject':
+			if not'GTHREAD'in self.uselib:
+				self.uselib.append('GTHREAD')
+		else:
+			Logs.warn("Profile %s means no threading support"%self.profile)
+			self.threading=False
+		if self.threading:
+			addflags('--threading')
+	valatask=self.valatask
+	self.is_lib='cprogram'not in self.features
+	if self.is_lib:
+		addflags('--library=%s'%self.target)
+		h_node=self.path.find_or_declare('%s.h'%self.target)
+		valatask.outputs.append(h_node)
+		addflags('--header=%s'%h_node.name)
+		valatask.outputs.append(self.path.find_or_declare('%s.vapi'%self.target))
+		if getattr(self,'gir',None):
+			gir_node=self.path.find_or_declare('%s.gir'%self.gir)
+			addflags('--gir=%s'%gir_node.name)
+			valatask.outputs.append(gir_node)
+	self.vala_target_glib=getattr(self,'vala_target_glib',getattr(Options.options,'vala_target_glib',None))
+	if self.vala_target_glib:
+		addflags('--target-glib=%s'%self.vala_target_glib)
+	addflags(['--define=%s'%x for x in getattr(self,'vala_defines',[])])
+	packages_private=Utils.to_list(getattr(self,'packages_private',[]))
+	addflags(['--pkg=%s'%x for x in packages_private])
+	def _get_api_version():
+		api_version='1.0'
+		if hasattr(Context.g_module,'API_VERSION'):
+			version=Context.g_module.API_VERSION.split(".")
+			if version[0]=="0":
+				api_version="0."+version[1]
+			else:
+				api_version=version[0]+".0"
+		return api_version
+	self.includes=Utils.to_list(getattr(self,'includes',[]))
+	self.uselib=self.to_list(getattr(self,'uselib',[]))
+	valatask.install_path=getattr(self,'install_path','')
+	valatask.vapi_path=getattr(self,'vapi_path','${DATAROOTDIR}/vala/vapi')
+	valatask.pkg_name=getattr(self,'pkg_name',self.env['PACKAGE'])
+	valatask.header_path=getattr(self,'header_path','${INCLUDEDIR}/%s-%s'%(valatask.pkg_name,_get_api_version()))
+	valatask.install_binding=getattr(self,'install_binding',True)
+	self.packages=packages=Utils.to_list(getattr(self,'packages',[]))
+	self.vapi_dirs=vapi_dirs=Utils.to_list(getattr(self,'vapi_dirs',[]))
+	includes=[]
+	if hasattr(self,'use'):
+		local_packages=Utils.to_list(self.use)[:]
+		seen=[]
+		while len(local_packages)>0:
+			package=local_packages.pop()
+			if package in seen:
+				continue
+			seen.append(package)
+			try:
+				package_obj=self.bld.get_tgen_by_name(package)
+			except Errors.WafError:
+				continue
+			package_name=package_obj.target
+			package_node=package_obj.path
+			package_dir=package_node.path_from(self.path)
+			for task in package_obj.tasks:
+				for output in task.outputs:
+					if output.name==package_name+".vapi":
+						valatask.set_run_after(task)
+						if package_name not in packages:
+							packages.append(package_name)
+						if package_dir not in vapi_dirs:
+							vapi_dirs.append(package_dir)
+						if package_dir not in includes:
+							includes.append(package_dir)
+			if hasattr(package_obj,'use'):
+				lst=self.to_list(package_obj.use)
+				lst.reverse()
+				local_packages=[pkg for pkg in lst if pkg not in seen]+local_packages
+	addflags(['--pkg=%s'%p for p in packages])
+	for vapi_dir in vapi_dirs:
+		v_node=self.path.find_dir(vapi_dir)
+		if not v_node:
+			Logs.warn('Unable to locate Vala API directory: %r'%vapi_dir)
+		else:
+			addflags('--vapidir=%s'%v_node.abspath())
+			addflags('--vapidir=%s'%v_node.get_bld().abspath())
+	self.dump_deps_node=None
+	if self.is_lib and self.packages:
+		self.dump_deps_node=self.path.find_or_declare('%s.deps'%self.target)
+		valatask.outputs.append(self.dump_deps_node)
+	self.includes.append(self.bld.srcnode.abspath())
+	self.includes.append(self.bld.bldnode.abspath())
+	for include in includes:
+		try:
+			self.includes.append(self.path.find_dir(include).abspath())
+			self.includes.append(self.path.find_dir(include).get_bld().abspath())
+		except AttributeError:
+			Logs.warn("Unable to locate include directory: '%s'"%include)
+	if self.is_lib and valatask.install_binding:
+		headers_list=[o for o in valatask.outputs if o.suffix()==".h"]
+		try:
+			self.install_vheader.source=headers_list
+		except AttributeError:
+			self.install_vheader=self.bld.install_files(valatask.header_path,headers_list,self.env)
+		vapi_list=[o for o in valatask.outputs if(o.suffix()in(".vapi",".deps"))]
+		try:
+			self.install_vapi.source=vapi_list
+		except AttributeError:
+			self.install_vapi=self.bld.install_files(valatask.vapi_path,vapi_list,self.env)
+		gir_list=[o for o in valatask.outputs if o.suffix()=='.gir']
+		try:
+			self.install_gir.source=gir_list
+		except AttributeError:
+			self.install_gir=self.bld.install_files(getattr(self,'gir_path','${DATAROOTDIR}/gir-1.0'),gir_list,self.env)
+@extension('.vala','.gs')
+def vala_file(self,node):
+	try:
+		valatask=self.valatask
+	except AttributeError:
+		valatask=self.valatask=self.create_task('valac')
+		self.init_vala_task()
+	valatask.inputs.append(node)
+	c_node=node.change_ext('.c')
+	valatask.outputs.append(c_node)
+	self.source.append(c_node)
+@conf
+def find_valac(self,valac_name,min_version):
+	valac=self.find_program(valac_name,var='VALAC')
+	try:
+		output=self.cmd_and_log(valac+' --version')
+	except Exception:
+		valac_version=None
+	else:
+		ver=re.search(r'\d+.\d+.\d+',output).group(0).split('.')
+		valac_version=tuple([int(x)for x in ver])
+	self.msg('Checking for %s version >= %r'%(valac_name,min_version),valac_version,valac_version and valac_version>=min_version)
+	if valac and valac_version<min_version:
+		self.fatal("%s version %r is too old, need >= %r"%(valac_name,valac_version,min_version))
+	self.env['VALAC_VERSION']=valac_version
+	return valac
+@conf
+def check_vala(self,min_version=(0,8,0),branch=None):
+	if not branch:
+		branch=min_version[:2]
+	try:
+		find_valac(self,'valac-%d.%d'%(branch[0],branch[1]),min_version)
+	except self.errors.ConfigurationError:
+		find_valac(self,'valac',min_version)
+@conf
+def check_vala_deps(self):
+	if not self.env['HAVE_GOBJECT']:
+		pkg_args={'package':'gobject-2.0','uselib_store':'GOBJECT','args':'--cflags --libs'}
+		if getattr(Options.options,'vala_target_glib',None):
+			pkg_args['atleast_version']=Options.options.vala_target_glib
+		self.check_cfg(**pkg_args)
+	if not self.env['HAVE_GTHREAD']:
+		pkg_args={'package':'gthread-2.0','uselib_store':'GTHREAD','args':'--cflags --libs'}
+		if getattr(Options.options,'vala_target_glib',None):
+			pkg_args['atleast_version']=Options.options.vala_target_glib
+		self.check_cfg(**pkg_args)
+def configure(self):
+	self.load('gnu_dirs')
+	self.check_vala_deps()
+	self.check_vala()
+	self.env.VALAFLAGS=['-C','--quiet']
+def options(opt):
+	opt.load('gnu_dirs')
+	valaopts=opt.add_option_group('Vala Compiler Options')
+	valaopts.add_option('--vala-target-glib',default=None,dest='vala_target_glib',metavar='MAJOR.MINOR',help='Target version of glib for Vala GObject code generation')
Index: waflib/Tools/waf_unit_test.py
===================================================================
--- waflib/Tools/waf_unit_test.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/waf_unit_test.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,95 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import os,sys
+from waflib.TaskGen import feature,after_method
+from waflib import Utils,Task,Logs,Options
+testlock=Utils.threading.Lock()
+@feature('test')
+@after_method('apply_link')
+def make_test(self):
+	if getattr(self,'link_task',None):
+		self.create_task('utest',self.link_task.outputs)
+class utest(Task.Task):
+	color='PINK'
+	after=['vnum','inst']
+	vars=[]
+	def runnable_status(self):
+		if getattr(Options.options,'no_tests',False):
+			return Task.SKIP_ME
+		ret=super(utest,self).runnable_status()
+		if ret==Task.SKIP_ME:
+			if getattr(Options.options,'all_tests',False):
+				return Task.RUN_ME
+		return ret
+	def run(self):
+		filename=self.inputs[0].abspath()
+		self.ut_exec=getattr(self.generator,'ut_exec',[filename])
+		if getattr(self.generator,'ut_fun',None):
+			self.generator.ut_fun(self)
+		try:
+			fu=getattr(self.generator.bld,'all_test_paths')
+		except AttributeError:
+			fu=os.environ.copy()
+			lst=[]
+			for g in self.generator.bld.groups:
+				for tg in g:
+					if getattr(tg,'link_task',None):
+						lst.append(tg.link_task.outputs[0].parent.abspath())
+			def add_path(dct,path,var):
+				dct[var]=os.pathsep.join(Utils.to_list(path)+[os.environ.get(var,'')])
+			if Utils.is_win32:
+				add_path(fu,lst,'PATH')
+			elif Utils.unversioned_sys_platform()=='darwin':
+				add_path(fu,lst,'DYLD_LIBRARY_PATH')
+				add_path(fu,lst,'LD_LIBRARY_PATH')
+			else:
+				add_path(fu,lst,'LD_LIBRARY_PATH')
+			self.generator.bld.all_test_paths=fu
+		cwd=getattr(self.generator,'ut_cwd','')or self.inputs[0].parent.abspath()
+		testcmd=getattr(Options.options,'testcmd',False)
+		if testcmd:
+			self.ut_exec=(testcmd%self.ut_exec[0]).split(' ')
+		proc=Utils.subprocess.Popen(self.ut_exec,cwd=cwd,env=fu,stderr=Utils.subprocess.PIPE,stdout=Utils.subprocess.PIPE)
+		(stdout,stderr)=proc.communicate()
+		tup=(filename,proc.returncode,stdout,stderr)
+		self.generator.utest_result=tup
+		testlock.acquire()
+		try:
+			bld=self.generator.bld
+			Logs.debug("ut: %r",tup)
+			try:
+				bld.utest_results.append(tup)
+			except AttributeError:
+				bld.utest_results=[tup]
+		finally:
+			testlock.release()
+def summary(bld):
+	lst=getattr(bld,'utest_results',[])
+	if lst:
+		Logs.pprint('CYAN','execution summary')
+		total=len(lst)
+		tfail=len([x for x in lst if x[1]])
+		Logs.pprint('CYAN','  tests that pass %d/%d'%(total-tfail,total))
+		for(f,code,out,err)in lst:
+			if not code:
+				Logs.pprint('CYAN','    %s'%f)
+		Logs.pprint('CYAN','  tests that fail %d/%d'%(tfail,total))
+		for(f,code,out,err)in lst:
+			if code:
+				Logs.pprint('CYAN','    %s'%f)
+def set_exit_code(bld):
+	lst=getattr(bld,'utest_results',[])
+	for(f,code,out,err)in lst:
+		if code:
+			msg=[]
+			if out:
+				msg.append('stdout:%s%s'%(os.linesep,out.decode('utf-8')))
+			if err:
+				msg.append('stderr:%s%s'%(os.linesep,err.decode('utf-8')))
+			bld.fatal(os.linesep.join(msg))
+def options(opt):
+	opt.add_option('--notests',action='store_true',default=False,help='Exec no unit tests',dest='no_tests')
+	opt.add_option('--alltests',action='store_true',default=False,help='Exec all unit tests',dest='all_tests')
+	opt.add_option('--testcmd',action='store',default=False,help='Run the unit tests using the test-cmd string'' example "--test-cmd="valgrind --error-exitcode=1'' %s" to run under valgrind',dest='testcmd')
Index: waflib/Tools/winres.py
===================================================================
--- waflib/Tools/winres.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/winres.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,85 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import re,traceback
+from waflib import Task,Logs,Utils
+from waflib.TaskGen import extension
+from waflib.Tools import c_preproc
+@extension('.rc')
+def rc_file(self,node):
+	obj_ext='.rc.o'
+	if self.env['WINRC_TGT_F']=='/fo':
+		obj_ext='.res'
+	rctask=self.create_task('winrc',node,node.change_ext(obj_ext))
+	try:
+		self.compiled_tasks.append(rctask)
+	except AttributeError:
+		self.compiled_tasks=[rctask]
+re_lines=re.compile('(?:^[ \t]*(#|%:)[ \t]*(ifdef|ifndef|if|else|elif|endif|include|import|define|undef|pragma)[ \t]*(.*?)\s*$)|''(?:^\w+[ \t]*(ICON|BITMAP|CURSOR|HTML|FONT|MESSAGETABLE|TYPELIB|REGISTRY|D3DFX)[ \t]*(.*?)\s*$)',re.IGNORECASE|re.MULTILINE)
+class rc_parser(c_preproc.c_parser):
+	def filter_comments(self,filepath):
+		code=Utils.readf(filepath)
+		if c_preproc.use_trigraphs:
+			for(a,b)in c_preproc.trig_def:code=code.split(a).join(b)
+		code=c_preproc.re_nl.sub('',code)
+		code=c_preproc.re_cpp.sub(c_preproc.repl,code)
+		ret=[]
+		for m in re.finditer(re_lines,code):
+			if m.group(2):
+				ret.append((m.group(2),m.group(3)))
+			else:
+				ret.append(('include',m.group(5)))
+		return ret
+	def addlines(self,node):
+		self.currentnode_stack.append(node.parent)
+		filepath=node.abspath()
+		self.count_files+=1
+		if self.count_files>c_preproc.recursion_limit:
+			raise c_preproc.PreprocError("recursion limit exceeded")
+		pc=self.parse_cache
+		Logs.debug('preproc: reading file %r',filepath)
+		try:
+			lns=pc[filepath]
+		except KeyError:
+			pass
+		else:
+			self.lines.extend(lns)
+			return
+		try:
+			lines=self.filter_comments(filepath)
+			lines.append((c_preproc.POPFILE,''))
+			lines.reverse()
+			pc[filepath]=lines
+			self.lines.extend(lines)
+		except IOError:
+			raise c_preproc.PreprocError("could not read the file %s"%filepath)
+		except Exception:
+			if Logs.verbose>0:
+				Logs.error("parsing %s failed"%filepath)
+				traceback.print_exc()
+class winrc(Task.Task):
+	run_str='${WINRC} ${WINRCFLAGS} ${CPPPATH_ST:INCPATHS} ${DEFINES_ST:DEFINES} ${WINRC_TGT_F} ${TGT} ${WINRC_SRC_F} ${SRC}'
+	color='BLUE'
+	def scan(self):
+		tmp=rc_parser(self.generator.includes_nodes)
+		tmp.start(self.inputs[0],self.env)
+		nodes=tmp.nodes
+		names=tmp.names
+		if Logs.verbose:
+			Logs.debug('deps: deps for %s: %r; unresolved %r'%(str(self),nodes,names))
+		return(nodes,names)
+def configure(conf):
+	v=conf.env
+	v['WINRC_TGT_F']='-o'
+	v['WINRC_SRC_F']='-i'
+	if not conf.env.WINRC:
+		if v.CC_NAME=='msvc':
+			conf.find_program('RC',var='WINRC',path_list=v['PATH'])
+			v['WINRC_TGT_F']='/fo'
+			v['WINRC_SRC_F']=''
+		else:
+			conf.find_program('windres',var='WINRC',path_list=v['PATH'])
+	if not conf.env.WINRC:
+		conf.fatal('winrc was not found!')
+	v['WINRCFLAGS']=[]
Index: waflib/Tools/xlc.py
===================================================================
--- waflib/Tools/xlc.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/xlc.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,45 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+from waflib.Tools import ccroot,ar
+from waflib.Configure import conf
+@conf
+def find_xlc(conf):
+	cc=conf.find_program(['xlc_r','xlc'],var='CC')
+	cc=conf.cmd_to_list(cc)
+	conf.get_xlc_version(cc)
+	conf.env.CC_NAME='xlc'
+	conf.env.CC=cc
+@conf
+def xlc_common_flags(conf):
+	v=conf.env
+	v['CC_SRC_F']=[]
+	v['CC_TGT_F']=['-c','-o']
+	if not v['LINK_CC']:v['LINK_CC']=v['CC']
+	v['CCLNK_SRC_F']=[]
+	v['CCLNK_TGT_F']=['-o']
+	v['CPPPATH_ST']='-I%s'
+	v['DEFINES_ST']='-D%s'
+	v['LIB_ST']='-l%s'
+	v['LIBPATH_ST']='-L%s'
+	v['STLIB_ST']='-l%s'
+	v['STLIBPATH_ST']='-L%s'
+	v['RPATH_ST']='-Wl,-rpath,%s'
+	v['SONAME_ST']=[]
+	v['SHLIB_MARKER']=[]
+	v['STLIB_MARKER']=[]
+	v['LINKFLAGS_cprogram']=['-Wl,-brtl']
+	v['cprogram_PATTERN']='%s'
+	v['CFLAGS_cshlib']=['-fPIC']
+	v['LINKFLAGS_cshlib']=['-G','-Wl,-brtl,-bexpfull']
+	v['cshlib_PATTERN']='lib%s.so'
+	v['LINKFLAGS_cstlib']=[]
+	v['cstlib_PATTERN']='lib%s.a'
+def configure(conf):
+	conf.find_xlc()
+	conf.find_ar()
+	conf.xlc_common_flags()
+	conf.cc_load_tools()
+	conf.cc_add_flags()
+	conf.link_add_flags()
Index: waflib/Tools/xlcxx.py
===================================================================
--- waflib/Tools/xlcxx.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Tools/xlcxx.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,45 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+from waflib.Tools import ccroot,ar
+from waflib.Configure import conf
+@conf
+def find_xlcxx(conf):
+	cxx=conf.find_program(['xlc++_r','xlc++'],var='CXX')
+	cxx=conf.cmd_to_list(cxx)
+	conf.get_xlc_version(cxx)
+	conf.env.CXX_NAME='xlc++'
+	conf.env.CXX=cxx
+@conf
+def xlcxx_common_flags(conf):
+	v=conf.env
+	v['CXX_SRC_F']=[]
+	v['CXX_TGT_F']=['-c','-o']
+	if not v['LINK_CXX']:v['LINK_CXX']=v['CXX']
+	v['CXXLNK_SRC_F']=[]
+	v['CXXLNK_TGT_F']=['-o']
+	v['CPPPATH_ST']='-I%s'
+	v['DEFINES_ST']='-D%s'
+	v['LIB_ST']='-l%s'
+	v['LIBPATH_ST']='-L%s'
+	v['STLIB_ST']='-l%s'
+	v['STLIBPATH_ST']='-L%s'
+	v['RPATH_ST']='-Wl,-rpath,%s'
+	v['SONAME_ST']=[]
+	v['SHLIB_MARKER']=[]
+	v['STLIB_MARKER']=[]
+	v['LINKFLAGS_cxxprogram']=['-Wl,-brtl']
+	v['cxxprogram_PATTERN']='%s'
+	v['CXXFLAGS_cxxshlib']=['-fPIC']
+	v['LINKFLAGS_cxxshlib']=['-G','-Wl,-brtl,-bexpfull']
+	v['cxxshlib_PATTERN']='lib%s.so'
+	v['LINKFLAGS_cxxstlib']=[]
+	v['cxxstlib_PATTERN']='lib%s.a'
+def configure(conf):
+	conf.find_xlcxx()
+	conf.find_ar()
+	conf.xlcxx_common_flags()
+	conf.cxx_load_tools()
+	conf.cxx_add_flags()
+	conf.link_add_flags()
Index: waflib/Utils.py
===================================================================
--- waflib/Utils.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/Utils.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,412 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import os,sys,errno,traceback,inspect,re,shutil,datetime,gc
+import subprocess
+try:
+	from collections import deque
+except ImportError:
+	class deque(list):
+		def popleft(self):
+			return self.pop(0)
+try:
+	import _winreg as winreg
+except ImportError:
+	try:
+		import winreg
+	except ImportError:
+		winreg=None
+from waflib import Errors
+try:
+	from collections import UserDict
+except ImportError:
+	from UserDict import UserDict
+try:
+	from hashlib import md5
+except ImportError:
+	try:
+		from md5 import md5
+	except ImportError:
+		pass
+try:
+	import threading
+except ImportError:
+	class threading(object):
+		pass
+	class Lock(object):
+		def acquire(self):
+			pass
+		def release(self):
+			pass
+	threading.Lock=threading.Thread=Lock
+else:
+	run_old=threading.Thread.run
+	def run(*args,**kwargs):
+		try:
+			run_old(*args,**kwargs)
+		except(KeyboardInterrupt,SystemExit):
+			raise
+		except Exception:
+			sys.excepthook(*sys.exc_info())
+	threading.Thread.run=run
+SIG_NIL='iluvcuteoverload'
+O644=420
+O755=493
+rot_chr=['\\','|','/','-']
+rot_idx=0
+try:
+	from collections import defaultdict
+except ImportError:
+	class defaultdict(dict):
+		def __init__(self,default_factory):
+			super(defaultdict,self).__init__()
+			self.default_factory=default_factory
+		def __getitem__(self,key):
+			try:
+				return super(defaultdict,self).__getitem__(key)
+			except KeyError:
+				value=self.default_factory()
+				self[key]=value
+				return value
+is_win32=sys.platform in('win32','cli')
+indicator='\x1b[K%s%s%s\r'
+if is_win32 and'NOCOLOR'in os.environ:
+	indicator='%s%s%s\r'
+def readf(fname,m='r',encoding='ISO8859-1'):
+	if sys.hexversion>0x3000000 and not'b'in m:
+		m+='b'
+		f=open(fname,m)
+		try:
+			txt=f.read()
+		finally:
+			f.close()
+		txt=txt.decode(encoding)
+	else:
+		f=open(fname,m)
+		try:
+			txt=f.read()
+		finally:
+			f.close()
+	return txt
+def writef(fname,data,m='w',encoding='ISO8859-1'):
+	if sys.hexversion>0x3000000 and not'b'in m:
+		data=data.encode(encoding)
+		m+='b'
+	f=open(fname,m)
+	try:
+		f.write(data)
+	finally:
+		f.close()
+def h_file(fname):
+	f=open(fname,'rb')
+	m=md5()
+	try:
+		while fname:
+			fname=f.read(200000)
+			m.update(fname)
+	finally:
+		f.close()
+	return m.digest()
+if hasattr(os,'O_NOINHERIT'):
+	def readf_win32(f,m='r',encoding='ISO8859-1'):
+		flags=os.O_NOINHERIT|os.O_RDONLY
+		if'b'in m:
+			flags|=os.O_BINARY
+		if'+'in m:
+			flags|=os.O_RDWR
+		try:
+			fd=os.open(f,flags)
+		except OSError:
+			raise IOError('Cannot read from %r'%f)
+		if sys.hexversion>0x3000000 and not'b'in m:
+			m+='b'
+			f=os.fdopen(fd,m)
+			try:
+				txt=f.read()
+			finally:
+				f.close()
+			txt=txt.decode(encoding)
+		else:
+			f=os.fdopen(fd,m)
+			try:
+				txt=f.read()
+			finally:
+				f.close()
+		return txt
+	def writef_win32(f,data,m='w',encoding='ISO8859-1'):
+		if sys.hexversion>0x3000000 and not'b'in m:
+			data=data.encode(encoding)
+			m+='b'
+		flags=os.O_CREAT|os.O_TRUNC|os.O_WRONLY|os.O_NOINHERIT
+		if'b'in m:
+			flags|=os.O_BINARY
+		if'+'in m:
+			flags|=os.O_RDWR
+		try:
+			fd=os.open(f,flags)
+		except OSError:
+			raise IOError('Cannot write to %r'%f)
+		f=os.fdopen(fd,m)
+		try:
+			f.write(data)
+		finally:
+			f.close()
+	def h_file_win32(fname):
+		try:
+			fd=os.open(fname,os.O_BINARY|os.O_RDONLY|os.O_NOINHERIT)
+		except OSError:
+			raise IOError('Cannot read from %r'%fname)
+		f=os.fdopen(fd,'rb')
+		m=md5()
+		try:
+			while fname:
+				fname=f.read(200000)
+				m.update(fname)
+		finally:
+			f.close()
+		return m.digest()
+	readf_old=readf
+	writef_old=writef
+	h_file_old=h_file
+	readf=readf_win32
+	writef=writef_win32
+	h_file=h_file_win32
+try:
+	x=''.encode('hex')
+except LookupError:
+	import binascii
+	def to_hex(s):
+		ret=binascii.hexlify(s)
+		if not isinstance(ret,str):
+			ret=ret.decode('utf-8')
+		return ret
+else:
+	def to_hex(s):
+		return s.encode('hex')
+to_hex.__doc__="""
+Return the hexadecimal representation of a string
+
+:param s: string to convert
+:type s: string
+"""
+listdir=os.listdir
+if is_win32:
+	def listdir_win32(s):
+		if not s:
+			try:
+				import ctypes
+			except ImportError:
+				return[x+':\\'for x in list('ABCDEFGHIJKLMNOPQRSTUVWXYZ')]
+			else:
+				dlen=4
+				maxdrives=26
+				buf=ctypes.create_string_buffer(maxdrives*dlen)
+				ndrives=ctypes.windll.kernel32.GetLogicalDriveStringsA(maxdrives*dlen,ctypes.byref(buf))
+				return[str(buf.raw[4*i:4*i+2].decode('ascii'))for i in range(int(ndrives/dlen))]
+		if len(s)==2 and s[1]==":":
+			s+=os.sep
+		if not os.path.isdir(s):
+			e=OSError('%s is not a directory'%s)
+			e.errno=errno.ENOENT
+			raise e
+		return os.listdir(s)
+	listdir=listdir_win32
+def num2ver(ver):
+	if isinstance(ver,str):
+		ver=tuple(ver.split('.'))
+	if isinstance(ver,tuple):
+		ret=0
+		for i in range(4):
+			if i<len(ver):
+				ret+=256**(3-i)*int(ver[i])
+		return ret
+	return ver
+def ex_stack():
+	exc_type,exc_value,tb=sys.exc_info()
+	exc_lines=traceback.format_exception(exc_type,exc_value,tb)
+	return''.join(exc_lines)
+def to_list(sth):
+	if isinstance(sth,str):
+		return sth.split()
+	else:
+		return sth
+re_nl=re.compile('\r*\n',re.M)
+def str_to_dict(txt):
+	tbl={}
+	lines=re_nl.split(txt)
+	for x in lines:
+		x=x.strip()
+		if not x or x.startswith('#')or x.find('=')<0:
+			continue
+		tmp=x.split('=')
+		tbl[tmp[0].strip()]='='.join(tmp[1:]).strip()
+	return tbl
+def split_path(path):
+	return path.split('/')
+def split_path_cygwin(path):
+	if path.startswith('//'):
+		ret=path.split('/')[2:]
+		ret[0]='/'+ret[0]
+		return ret
+	return path.split('/')
+re_sp=re.compile('[/\\\\]')
+def split_path_win32(path):
+	if path.startswith('\\\\'):
+		ret=re.split(re_sp,path)[2:]
+		ret[0]='\\'+ret[0]
+		return ret
+	return re.split(re_sp,path)
+if sys.platform=='cygwin':
+	split_path=split_path_cygwin
+elif is_win32:
+	split_path=split_path_win32
+split_path.__doc__="""
+Split a path by / or \\. This function is not like os.path.split
+
+:type  path: string
+:param path: path to split
+:return:     list of strings
+"""
+def check_dir(path):
+	if not os.path.isdir(path):
+		try:
+			os.makedirs(path)
+		except OSError ,e:
+			if not os.path.isdir(path):
+				raise Errors.WafError('Cannot create the folder %r'%path,ex=e)
+def def_attrs(cls,**kw):
+	for k,v in kw.items():
+		if not hasattr(cls,k):
+			setattr(cls,k,v)
+def quote_define_name(s):
+	fu=re.compile("[^a-zA-Z0-9]").sub("_",s)
+	fu=fu.upper()
+	return fu
+def h_list(lst):
+	m=md5()
+	m.update(str(lst))
+	return m.digest()
+def h_fun(fun):
+	try:
+		return fun.code
+	except AttributeError:
+		try:
+			h=inspect.getsource(fun)
+		except IOError:
+			h="nocode"
+		try:
+			fun.code=h
+		except AttributeError:
+			pass
+		return h
+reg_subst=re.compile(r"(\\\\)|(\$\$)|\$\{([^}]+)\}")
+def subst_vars(expr,params):
+	def repl_var(m):
+		if m.group(1):
+			return'\\'
+		if m.group(2):
+			return'$'
+		try:
+			return params.get_flat(m.group(3))
+		except AttributeError:
+			return params[m.group(3)]
+	return reg_subst.sub(repl_var,expr)
+def destos_to_binfmt(key):
+	if key=='darwin':
+		return'mac-o'
+	elif key in('win32','cygwin','uwin','msys'):
+		return'pe'
+	return'elf'
+def unversioned_sys_platform():
+	s=sys.platform
+	if s=='java':
+		from java.lang import System
+		s=System.getProperty('os.name')
+		if s=='Mac OS X':
+			return'darwin'
+		elif s.startswith('Windows '):
+			return'win32'
+		elif s=='OS/2':
+			return'os2'
+		elif s=='HP-UX':
+			return'hpux'
+		elif s in('SunOS','Solaris'):
+			return'sunos'
+		else:s=s.lower()
+	if s=='powerpc':
+		return'darwin'
+	if s=='win32'or s.endswith('os2')and s!='sunos2':return s
+	return re.split('\d+$',s)[0]
+def nada(*k,**kw):
+	pass
+class Timer(object):
+	def __init__(self):
+		self.start_time=datetime.datetime.utcnow()
+	def __str__(self):
+		delta=datetime.datetime.utcnow()-self.start_time
+		days=int(delta.days)
+		hours=delta.seconds//3600
+		minutes=(delta.seconds-hours*3600)//60
+		seconds=delta.seconds-hours*3600-minutes*60+float(delta.microseconds)/1000/1000
+		result=''
+		if days:
+			result+='%dd'%days
+		if days or hours:
+			result+='%dh'%hours
+		if days or hours or minutes:
+			result+='%dm'%minutes
+		return'%s%.3fs'%(result,seconds)
+if is_win32:
+	old=shutil.copy2
+	def copy2(src,dst):
+		old(src,dst)
+		shutil.copystat(src,dst)
+	setattr(shutil,'copy2',copy2)
+if os.name=='java':
+	try:
+		gc.disable()
+		gc.enable()
+	except NotImplementedError:
+		gc.disable=gc.enable
+def read_la_file(path):
+	sp=re.compile(r'^([^=]+)=\'(.*)\'$')
+	dc={}
+	for line in readf(path).splitlines():
+		try:
+			_,left,right,_=sp.split(line.strip())
+			dc[left]=right
+		except ValueError:
+			pass
+	return dc
+def nogc(fun):
+	def f(*k,**kw):
+		try:
+			gc.disable()
+			ret=fun(*k,**kw)
+		finally:
+			gc.enable()
+		return ret
+	f.__doc__=fun.__doc__
+	return f
+def run_once(fun):
+	cache={}
+	def wrap(k):
+		try:
+			return cache[k]
+		except KeyError:
+			ret=fun(k)
+			cache[k]=ret
+			return ret
+	wrap.__cache__=cache
+	return wrap
+def get_registry_app_path(key,filename):
+	if not winreg:
+		return None
+	try:
+		result=winreg.QueryValue(key,"Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\%s.exe"%filename[0])
+	except WindowsError:
+		pass
+	else:
+		if os.path.isfile(result):
+			return result
Index: waflib/__init__.py
===================================================================
--- waflib/__init__.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/__init__.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,4 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
Index: waflib/ansiterm.py
===================================================================
--- waflib/ansiterm.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/ansiterm.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,177 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import sys,os
+try:
+	if not(sys.stderr.isatty()and sys.stdout.isatty()):
+		raise ValueError('not a tty')
+	from ctypes import*
+	class COORD(Structure):
+		_fields_=[("X",c_short),("Y",c_short)]
+	class SMALL_RECT(Structure):
+		_fields_=[("Left",c_short),("Top",c_short),("Right",c_short),("Bottom",c_short)]
+	class CONSOLE_SCREEN_BUFFER_INFO(Structure):
+		_fields_=[("Size",COORD),("CursorPosition",COORD),("Attributes",c_short),("Window",SMALL_RECT),("MaximumWindowSize",COORD)]
+	class CONSOLE_CURSOR_INFO(Structure):
+		_fields_=[('dwSize',c_ulong),('bVisible',c_int)]
+	sbinfo=CONSOLE_SCREEN_BUFFER_INFO()
+	csinfo=CONSOLE_CURSOR_INFO()
+	hconsole=windll.kernel32.GetStdHandle(-11)
+	windll.kernel32.GetConsoleScreenBufferInfo(hconsole,byref(sbinfo))
+	if sbinfo.Size.X<9 or sbinfo.Size.Y<9:raise ValueError('small console')
+	windll.kernel32.GetConsoleCursorInfo(hconsole,byref(csinfo))
+except Exception:
+	pass
+else:
+	import re,threading
+	is_vista=getattr(sys,"getwindowsversion",None)and sys.getwindowsversion()[0]>=6
+	try:
+		_type=unicode
+	except NameError:
+		_type=str
+	to_int=lambda number,default:number and int(number)or default
+	wlock=threading.Lock()
+	STD_OUTPUT_HANDLE=-11
+	STD_ERROR_HANDLE=-12
+	class AnsiTerm(object):
+		def __init__(self):
+			self.encoding=sys.stdout.encoding
+			self.hconsole=windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE)
+			self.cursor_history=[]
+			self.orig_sbinfo=CONSOLE_SCREEN_BUFFER_INFO()
+			self.orig_csinfo=CONSOLE_CURSOR_INFO()
+			windll.kernel32.GetConsoleScreenBufferInfo(self.hconsole,byref(self.orig_sbinfo))
+			windll.kernel32.GetConsoleCursorInfo(hconsole,byref(self.orig_csinfo))
+		def screen_buffer_info(self):
+			sbinfo=CONSOLE_SCREEN_BUFFER_INFO()
+			windll.kernel32.GetConsoleScreenBufferInfo(self.hconsole,byref(sbinfo))
+			return sbinfo
+		def clear_line(self,param):
+			mode=param and int(param)or 0
+			sbinfo=self.screen_buffer_info()
+			if mode==1:
+				line_start=COORD(0,sbinfo.CursorPosition.Y)
+				line_length=sbinfo.Size.X
+			elif mode==2:
+				line_start=COORD(sbinfo.CursorPosition.X,sbinfo.CursorPosition.Y)
+				line_length=sbinfo.Size.X-sbinfo.CursorPosition.X
+			else:
+				line_start=sbinfo.CursorPosition
+				line_length=sbinfo.Size.X-sbinfo.CursorPosition.X
+			chars_written=c_int()
+			windll.kernel32.FillConsoleOutputCharacterA(self.hconsole,c_wchar(' '),line_length,line_start,byref(chars_written))
+			windll.kernel32.FillConsoleOutputAttribute(self.hconsole,sbinfo.Attributes,line_length,line_start,byref(chars_written))
+		def clear_screen(self,param):
+			mode=to_int(param,0)
+			sbinfo=self.screen_buffer_info()
+			if mode==1:
+				clear_start=COORD(0,0)
+				clear_length=sbinfo.CursorPosition.X*sbinfo.CursorPosition.Y
+			elif mode==2:
+				clear_start=COORD(0,0)
+				clear_length=sbinfo.Size.X*sbinfo.Size.Y
+				windll.kernel32.SetConsoleCursorPosition(self.hconsole,clear_start)
+			else:
+				clear_start=sbinfo.CursorPosition
+				clear_length=((sbinfo.Size.X-sbinfo.CursorPosition.X)+sbinfo.Size.X*(sbinfo.Size.Y-sbinfo.CursorPosition.Y))
+			chars_written=c_int()
+			windll.kernel32.FillConsoleOutputCharacterA(self.hconsole,c_wchar(' '),clear_length,clear_start,byref(chars_written))
+			windll.kernel32.FillConsoleOutputAttribute(self.hconsole,sbinfo.Attributes,clear_length,clear_start,byref(chars_written))
+		def push_cursor(self,param):
+			sbinfo=self.screen_buffer_info()
+			self.cursor_history.append(sbinfo.CursorPosition)
+		def pop_cursor(self,param):
+			if self.cursor_history:
+				old_pos=self.cursor_history.pop()
+				windll.kernel32.SetConsoleCursorPosition(self.hconsole,old_pos)
+		def set_cursor(self,param):
+			y,sep,x=param.partition(';')
+			x=to_int(x,1)-1
+			y=to_int(y,1)-1
+			sbinfo=self.screen_buffer_info()
+			new_pos=COORD(min(max(0,x),sbinfo.Size.X),min(max(0,y),sbinfo.Size.Y))
+			windll.kernel32.SetConsoleCursorPosition(self.hconsole,new_pos)
+		def set_column(self,param):
+			x=to_int(param,1)-1
+			sbinfo=self.screen_buffer_info()
+			new_pos=COORD(min(max(0,x),sbinfo.Size.X),sbinfo.CursorPosition.Y)
+			windll.kernel32.SetConsoleCursorPosition(self.hconsole,new_pos)
+		def move_cursor(self,x_offset=0,y_offset=0):
+			sbinfo=self.screen_buffer_info()
+			new_pos=COORD(min(max(0,sbinfo.CursorPosition.X+x_offset),sbinfo.Size.X),min(max(0,sbinfo.CursorPosition.Y+y_offset),sbinfo.Size.Y))
+			windll.kernel32.SetConsoleCursorPosition(self.hconsole,new_pos)
+		def move_up(self,param):
+			self.move_cursor(y_offset=-to_int(param,1))
+		def move_down(self,param):
+			self.move_cursor(y_offset=to_int(param,1))
+		def move_left(self,param):
+			self.move_cursor(x_offset=-to_int(param,1))
+		def move_right(self,param):
+			self.move_cursor(x_offset=to_int(param,1))
+		def next_line(self,param):
+			sbinfo=self.screen_buffer_info()
+			self.move_cursor(x_offset=-sbinfo.CursorPosition.X,y_offset=to_int(param,1))
+		def prev_line(self,param):
+			sbinfo=self.screen_buffer_info()
+			self.move_cursor(x_offset=-sbinfo.CursorPosition.X,y_offset=-to_int(param,1))
+		def rgb2bgr(self,c):
+			return((c&1)<<2)|(c&2)|((c&4)>>2)
+		def set_color(self,param):
+			cols=param.split(';')
+			sbinfo=CONSOLE_SCREEN_BUFFER_INFO()
+			windll.kernel32.GetConsoleScreenBufferInfo(self.hconsole,byref(sbinfo))
+			attr=sbinfo.Attributes
+			for c in cols:
+				if is_vista:
+					c=int(c)
+				else:
+					c=to_int(c,0)
+				if c in range(30,38):
+					attr=(attr&0xfff0)|self.rgb2bgr(c-30)
+				elif c in range(40,48):
+					attr=(attr&0xff0f)|(self.rgb2bgr(c-40)<<4)
+				elif c==0:
+					attr=self.orig_sbinfo.Attributes
+				elif c==1:
+					attr|=0x08
+				elif c==4:
+					attr|=0x80
+				elif c==7:
+					attr=(attr&0xff88)|((attr&0x70)>>4)|((attr&0x07)<<4)
+			windll.kernel32.SetConsoleTextAttribute(self.hconsole,attr)
+		def show_cursor(self,param):
+			csinfo.bVisible=1
+			windll.kernel32.SetConsoleCursorInfo(self.hconsole,byref(csinfo))
+		def hide_cursor(self,param):
+			csinfo.bVisible=0
+			windll.kernel32.SetConsoleCursorInfo(self.hconsole,byref(csinfo))
+		ansi_command_table={'A':move_up,'B':move_down,'C':move_right,'D':move_left,'E':next_line,'F':prev_line,'G':set_column,'H':set_cursor,'f':set_cursor,'J':clear_screen,'K':clear_line,'h':show_cursor,'l':hide_cursor,'m':set_color,'s':push_cursor,'u':pop_cursor,}
+		ansi_tokens=re.compile('(?:\x1b\[([0-9?;]*)([a-zA-Z])|([^\x1b]+))')
+		def write(self,text):
+			try:
+				wlock.acquire()
+				for param,cmd,txt in self.ansi_tokens.findall(text):
+					if cmd:
+						cmd_func=self.ansi_command_table.get(cmd)
+						if cmd_func:
+							cmd_func(self,param)
+					else:
+						self.writeconsole(txt)
+			finally:
+				wlock.release()
+		def writeconsole(self,txt):
+			chars_written=c_int()
+			writeconsole=windll.kernel32.WriteConsoleA
+			if isinstance(txt,_type):
+				writeconsole=windll.kernel32.WriteConsoleW
+			TINY_STEP=3000
+			for x in range(0,len(txt),TINY_STEP):
+				tiny=txt[x:x+TINY_STEP]
+				writeconsole(self.hconsole,tiny,len(tiny),byref(chars_written),None)
+		def flush(self):
+			pass
+		def isatty(self):
+			return True
+	sys.stderr=sys.stdout=AnsiTerm()
+	os.environ['TERM']='vt100'
Index: waflib/extras/__init__.py
===================================================================
--- waflib/extras/__init__.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/extras/__init__.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,4 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
Index: waflib/extras/compat15.py
===================================================================
--- waflib/extras/compat15.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/extras/compat15.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,220 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import sys
+from waflib import ConfigSet,Logs,Options,Scripting,Task,Build,Configure,Node,Runner,TaskGen,Utils,Errors,Context
+sys.modules['Environment']=ConfigSet
+ConfigSet.Environment=ConfigSet.ConfigSet
+sys.modules['Logs']=Logs
+sys.modules['Options']=Options
+sys.modules['Scripting']=Scripting
+sys.modules['Task']=Task
+sys.modules['Build']=Build
+sys.modules['Configure']=Configure
+sys.modules['Node']=Node
+sys.modules['Runner']=Runner
+sys.modules['TaskGen']=TaskGen
+sys.modules['Utils']=Utils
+from waflib.Tools import c_preproc
+sys.modules['preproc']=c_preproc
+from waflib.Tools import c_config
+sys.modules['config_c']=c_config
+ConfigSet.ConfigSet.copy=ConfigSet.ConfigSet.derive
+ConfigSet.ConfigSet.set_variant=Utils.nada
+Build.BuildContext.add_subdirs=Build.BuildContext.recurse
+Build.BuildContext.new_task_gen=Build.BuildContext.__call__
+Build.BuildContext.is_install=0
+Node.Node.relpath_gen=Node.Node.path_from
+def name_to_obj(self,s,env=None):
+	Logs.warn('compat: change "name_to_obj(name, env)" by "get_tgen_by_name(name)"')
+	return self.get_tgen_by_name(s)
+Build.BuildContext.name_to_obj=name_to_obj
+def env_of_name(self,name):
+	try:
+		return self.all_envs[name]
+	except KeyError:
+		Logs.error('no such environment: '+name)
+		return None
+Build.BuildContext.env_of_name=env_of_name
+def set_env_name(self,name,env):
+	self.all_envs[name]=env
+	return env
+Configure.ConfigurationContext.set_env_name=set_env_name
+def retrieve(self,name,fromenv=None):
+	try:
+		env=self.all_envs[name]
+	except KeyError:
+		env=ConfigSet.ConfigSet()
+		self.prepare_env(env)
+		self.all_envs[name]=env
+	else:
+		if fromenv:Logs.warn("The environment %s may have been configured already"%name)
+	return env
+Configure.ConfigurationContext.retrieve=retrieve
+Configure.ConfigurationContext.sub_config=Configure.ConfigurationContext.recurse
+Configure.ConfigurationContext.check_tool=Configure.ConfigurationContext.load
+Configure.conftest=Configure.conf
+Configure.ConfigurationError=Errors.ConfigurationError
+Options.OptionsContext.sub_options=Options.OptionsContext.recurse
+Options.OptionsContext.tool_options=Context.Context.load
+Options.Handler=Options.OptionsContext
+Task.simple_task_type=Task.task_type_from_func=Task.task_factory
+Task.TaskBase.classes=Task.classes
+def setitem(self,key,value):
+	if key.startswith('CCFLAGS'):
+		key=key[1:]
+	self.table[key]=value
+ConfigSet.ConfigSet.__setitem__=setitem
+@TaskGen.feature('d')
+@TaskGen.before('apply_incpaths')
+def old_importpaths(self):
+	if getattr(self,'importpaths',[]):
+		self.includes=self.importpaths
+from waflib import Context
+eld=Context.load_tool
+def load_tool(*k,**kw):
+	ret=eld(*k,**kw)
+	if'set_options'in ret.__dict__:
+		Logs.warn('compat: rename "set_options" to options')
+		ret.options=ret.set_options
+	if'detect'in ret.__dict__:
+		Logs.warn('compat: rename "detect" to "configure"')
+		ret.configure=ret.detect
+	return ret
+Context.load_tool=load_tool
+rev=Context.load_module
+def load_module(path):
+	ret=rev(path)
+	if'set_options'in ret.__dict__:
+		Logs.warn('compat: rename "set_options" to "options" (%r)'%path)
+		ret.options=ret.set_options
+	if'srcdir'in ret.__dict__:
+		Logs.warn('compat: rename "srcdir" to "top" (%r)'%path)
+		ret.top=ret.srcdir
+	if'blddir'in ret.__dict__:
+		Logs.warn('compat: rename "blddir" to "out" (%r)'%path)
+		ret.out=ret.blddir
+	return ret
+Context.load_module=load_module
+old_post=TaskGen.task_gen.post
+def post(self):
+	self.features=self.to_list(self.features)
+	if'cc'in self.features:
+		Logs.warn('compat: the feature cc does not exist anymore (use "c")')
+		self.features.remove('cc')
+		self.features.append('c')
+	if'cstaticlib'in self.features:
+		Logs.warn('compat: the feature cstaticlib does not exist anymore (use "cstlib" or "cxxstlib")')
+		self.features.remove('cstaticlib')
+		self.features.append(('cxx'in self.features)and'cxxstlib'or'cstlib')
+	if getattr(self,'ccflags',None):
+		Logs.warn('compat: "ccflags" was renamed to "cflags"')
+		self.cflags=self.ccflags
+	return old_post(self)
+TaskGen.task_gen.post=post
+def waf_version(*k,**kw):
+	Logs.warn('wrong version (waf_version was removed in waf 1.6)')
+Utils.waf_version=waf_version
+import os
+@TaskGen.feature('c','cxx','d')
+@TaskGen.before('apply_incpaths','propagate_uselib_vars')
+@TaskGen.after('apply_link','process_source')
+def apply_uselib_local(self):
+	env=self.env
+	from waflib.Tools.ccroot import stlink_task
+	self.uselib=self.to_list(getattr(self,'uselib',[]))
+	self.includes=self.to_list(getattr(self,'includes',[]))
+	names=self.to_list(getattr(self,'uselib_local',[]))
+	get=self.bld.get_tgen_by_name
+	seen=set([])
+	tmp=Utils.deque(names)
+	if tmp:
+		Logs.warn('compat: "uselib_local" is deprecated, replace by "use"')
+	while tmp:
+		lib_name=tmp.popleft()
+		if lib_name in seen:
+			continue
+		y=get(lib_name)
+		y.post()
+		seen.add(lib_name)
+		if getattr(y,'uselib_local',None):
+			for x in self.to_list(getattr(y,'uselib_local',[])):
+				obj=get(x)
+				obj.post()
+				if getattr(obj,'link_task',None):
+					if not isinstance(obj.link_task,stlink_task):
+						tmp.append(x)
+		if getattr(y,'link_task',None):
+			link_name=y.target[y.target.rfind(os.sep)+1:]
+			if isinstance(y.link_task,stlink_task):
+				env.append_value('STLIB',[link_name])
+			else:
+				env.append_value('LIB',[link_name])
+			self.link_task.set_run_after(y.link_task)
+			self.link_task.dep_nodes+=y.link_task.outputs
+			tmp_path=y.link_task.outputs[0].parent.bldpath()
+			if not tmp_path in env['LIBPATH']:
+				env.prepend_value('LIBPATH',[tmp_path])
+		for v in self.to_list(getattr(y,'uselib',[])):
+			if not env['STLIB_'+v]:
+				if not v in self.uselib:
+					self.uselib.insert(0,v)
+		if getattr(y,'export_includes',None):
+			self.includes.extend(y.to_incnodes(y.export_includes))
+@TaskGen.feature('cprogram','cxxprogram','cstlib','cxxstlib','cshlib','cxxshlib','dprogram','dstlib','dshlib')
+@TaskGen.after('apply_link')
+def apply_objdeps(self):
+	names=getattr(self,'add_objects',[])
+	if not names:
+		return
+	names=self.to_list(names)
+	get=self.bld.get_tgen_by_name
+	seen=[]
+	while names:
+		x=names[0]
+		if x in seen:
+			names=names[1:]
+			continue
+		y=get(x)
+		if getattr(y,'add_objects',None):
+			added=0
+			lst=y.to_list(y.add_objects)
+			lst.reverse()
+			for u in lst:
+				if u in seen:continue
+				added=1
+				names=[u]+names
+			if added:continue
+		y.post()
+		seen.append(x)
+		for t in getattr(y,'compiled_tasks',[]):
+			self.link_task.inputs.extend(t.outputs)
+@TaskGen.after('apply_link')
+def process_obj_files(self):
+	if not hasattr(self,'obj_files'):
+		return
+	for x in self.obj_files:
+		node=self.path.find_resource(x)
+		self.link_task.inputs.append(node)
+@TaskGen.taskgen_method
+def add_obj_file(self,file):
+	if not hasattr(self,'obj_files'):self.obj_files=[]
+	if not'process_obj_files'in self.meths:self.meths.append('process_obj_files')
+	self.obj_files.append(file)
+old_define=Configure.ConfigurationContext.__dict__['define']
+@Configure.conf
+def define(self,key,val,quote=True):
+	old_define(self,key,val,quote)
+	if key.startswith('HAVE_'):
+		self.env[key]=1
+old_undefine=Configure.ConfigurationContext.__dict__['undefine']
+@Configure.conf
+def undefine(self,key):
+	old_undefine(self,key)
+	if key.startswith('HAVE_'):
+		self.env[key]=0
+def set_incdirs(self,val):
+	Logs.warn('compat: change "export_incdirs" by "export_includes"')
+	self.export_includes=val
+TaskGen.task_gen.export_incdirs=property(None,set_incdirs)
Index: waflib/fixpy2.py
===================================================================
--- waflib/fixpy2.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
+++ waflib/fixpy2.py	(revision 0fa325b040d442d9b1c268f55d85c2879fff77f1)
@@ -0,0 +1,53 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import os
+all_modifs={}
+def fixdir(dir):
+	global all_modifs
+	for k in all_modifs:
+		for v in all_modifs[k]:
+			modif(os.path.join(dir,'waflib'),k,v)
+def modif(dir,name,fun):
+	if name=='*':
+		lst=[]
+		for y in'. Tools extras'.split():
+			for x in os.listdir(os.path.join(dir,y)):
+				if x.endswith('.py'):
+					lst.append(y+os.sep+x)
+		for x in lst:
+			modif(dir,x,fun)
+		return
+	filename=os.path.join(dir,name)
+	f=open(filename,'r')
+	try:
+		txt=f.read()
+	finally:
+		f.close()
+	txt=fun(txt)
+	f=open(filename,'w')
+	try:
+		f.write(txt)
+	finally:
+		f.close()
+def subst(*k):
+	def do_subst(fun):
+		global all_modifs
+		for x in k:
+			try:
+				all_modifs[x].append(fun)
+			except KeyError:
+				all_modifs[x]=[fun]
+		return fun
+	return do_subst
+@subst('*')
+def r1(code):
+	code=code.replace(',e:',',e:')
+	code=code.replace("",'')
+	code=code.replace('','')
+	return code
+@subst('Runner.py')
+def r4(code):
+	code=code.replace('next(self.biter)','self.biter.next()')
+	return code
