Ë <–“Ù0”/*ãó —dZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl m Z m Z ddlmZddlmZddlmZddlmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z.m/Z/ddl0m1Z1m2Z2m3Z3d d l4m5Z5d Z6ej4«Z7e7jpZ8e7jrZ9e7jtZ:e7jvZ;e7jxZ=e7j}d d d¬«e7j}d dd¬«e7j}d dd¬«e7j}d dd¬«e7j}d dd¬«e7j}d dd¬«e7j}d dd ¬«e7j}d dd¬«e7j}ddd¬«e7j}ddd¬«e7j}ddd¬«ddddd d!dd"d#d#d$œ Z?d%d&d%ed'«fgZ@e7jƒed(«d)„«ZBd¬d*„ZCd+„ZDd,„ZEd-„ZFd.„ZGeCd/ged0«d1¬2«d3„«ZHd4„ZIe j”d5«ZKe j”d6e j˜«ZMd7„ZNd8„ZOd9„ZPGd:„d;«ZQGd<„d=«ZRej¦Gd>„d?eT««ZUej¦Gd@„dA««ZVej¦GdB„dC««ZWdD„ZXdE„ZYdF„ZZdG„Z[dH„Z\dIdJdKdLœZ]dM„Z^dN„Z_dO„Z`dP„ZadQ„ZbdR„Zc d­dS„ZddT„ZedU„ZfdV„ZgeCddWdXgedY«edZ«fd%d[d1ed\«fd%d]ged^«fd%d_ged`«fdadbd%edc«fd%ddedd«fd%dededf«fgedg«e9jЬh«di„«Zie/jÔgdj¢«Zkdk„Zlhdl£Zmdm„ZndndodpdqdrdsdtdsduœZodv„Zpdw„Zqdx„Zrdy„Zsdz„Ztd{„Zud|„Zvd}„Zwd~„Zxd„Zyd€„ZzeCd�d%d‚dedƒ«fged„«e9jÐd1¬…«d†„«Z{eCdd%d‚ded‡«fged„«e9jЬh«dˆ„«Z|eCd‰d%dŠded‹«fd%dŒded�«fd%dŽded�«fd%d�ded‘«fd%d’ded“«fd%d”ded•«fd%d–ded—«fd%d˜ded™«fd%dšded›«fd%dœded�«fdadbd%edž«fdWdXd%edŸ«edZ«fg ed «e9jÐd1¬…«d¡„«Z}e7jwd¢d£h¬¤«d¥„«Z~e7jwd¦hd§£¬¤«d¨„«Ze5�jd¦d©¬ª«d«„«Z�y)®asimple Phabricator integration (EXPERIMENTAL) This extension provides a ``phabsend`` command which sends a stack of changesets to Phabricator, and a ``phabread`` command which prints a stack of revisions in a format suitable for :hg:`import`, and a ``phabupdate`` command to update statuses in batch. A "phabstatus" view for :hg:`show` is also provided; it displays status information of Phabricator differentials associated with unfinished changesets. By default, Phabricator requires ``Test Plan`` which might prevent some changeset from being sent. The requirement could be disabled by changing ``differential.require-test-plan-field`` config server side. Config:: [phabricator] # Phabricator URL url = https://phab.example.com/ # Repo callsign. If a repo has a URL https://$HOST/diffusion/FOO, then its # callsign is "FOO". callsign = FOO # curl command to use. If not set (default), use builtin HTTP library to # communicate. If set, use the specified curl command. This could be useful # if you need to specify advanced options that is not easily supported by # the internal library. curlcmd = curl --connect-timeout 2 --retry 3 --silent # retry failed command N time (default 0). Useful when using the extension # over flakly connection. # # We wait `retry.interval` between each retry, in seconds. # (default 1 second). retry = 3 retry.interval = 10 # the retry option can combine well with the http.timeout one. # # For example to give up on http request after 20 seconds: [http] timeout=20 [auth] example.schemes = https example.prefix = phab.example.com # API token. Get it from https://$HOST/conduit/login/ example.phabtoken = cli-xxxxxxxxxxxxxxxxxxxxxxxxxxxx éN)ÚbinÚshort)Ú_)Úgetattr)Úattr)ÚcmdutilÚcontextÚcopiesÚencodingÚerrorÚ exthelperÚgraphmodÚhttpconnectionÚ localrepoÚ logcmdutilÚmatchÚmdiffÚobsutilÚparserÚpatchÚphasesÚpycompatÚ rewriteutilÚscmutilÚsmartsetÚtagsÚtemplatefiltersÚ templateutilÚurlÚutil)ÚprocutilÚ stringutilÚurlutilé)Úshowsships-with-hg-coreó phabricatoró batchsizeé ©ÚdefaultócallsignócurlcmdódebugFórepophidóretryóretry.intervalóurlóphabsendóconfirmó phabimportósecretóobsoletesgreensmagentasbolds magenta dims green boldsyellowsred) sphabricator.action.createdsphabricator.action.skippedsphabricator.action.updatedóphabricator.drevsphabricator.status.abandonedsphabricator.status.acceptedsphabricator.status.closedsphabricator.status.needsreviews phabricator.status.needsrevisions!phabricator.status.changesplannedóstest-vcrs”Path to a vcr file. If nonexistent, will record a new vcr transcript, otherwise will mock all http requests using the specified vcr file. (ADVANCED)Úloadhgrccóü—d}i} tj|jd««} tjd„tj | ««}d}tj«} d|vr|d| d<d|vr|d| d <| r"|j| |jd«¬ «|||||g|¢­i|¤Žxs|S#t $r/|jtd«|jd«z«YŒšt$rYŒ¤wxYw) zBLoad ``.arcconfig`` content into a ui instance on repository open.Fs .arcconfigcóP—t|t«rtj|«S|S©N©Ú isinstanceÚstrr Ú unitolocal©Úxs ú5usr/lib/python3.12/site-packages/hgext/phabricator.pyÚz_loadhgrc..Þs €´ ¸1¼cÔ0B”h×)Ñ)¨!Ó,ÐIÈÐIr8Tsinvalid JSON in %s srepository.callsign)r&r+sphabricator.uri©r&r1)Úsource)r Ú unifromlocalÚreadrÚrapplyÚ json_loadsÚ ValueErrorÚwarnrÚjoinÚIOErrorr ÚsortdictÚ applyconfig) ÚorigÚuiÚwdirvfsÚhgvfsÚ requirementsÚargsÚoptsÚresultÚ arcconfigÚ rawparamsÚcfgs rCÚ _loadhgrcr\Ós€ð€FØ€Ið  ä×)Ñ)¨'¯,©,°}Ó*EÓFˆ ä—O‘OÙ IÜ × Ñ   Ó *ó ˆ ð ˆô �-‰-‹/€Cà Ñ*Ø-6Ð7MÑ-NˆÐ )Ñ*à˜YÑ&Ø(1Ð2DÑ(EˆÐ $Ñ%á Ø �‰�s 7§<¡<° Ó#>ˆÔ?ñ ˆR�˜% Ð=°Ò=¸Ñ=ÒGÀðøô! òJØ �‰”Ð)Ó*¨W¯\©\¸-Ó-HÑHÖIÜ ò Ù ð ús†AB9Â95C;Ã0C;Ã:C;cóR‡‡‡‡‡‡‡‡ —|tzŠd„Šd„Šd„Š ˆˆˆˆˆˆˆ ˆfd„}|S)Ncó—|j|jk7s|j|jk7rytjj |j «}tjj |j «}|D]w}||vry||d}|j d«rI|jd«r8tj|«}tj||d«}||k7sŒiy||d|k7sŒwyy)NFró{ó}T) ÚuriÚmethodr ÚurlreqÚparseqsÚbodyÚ startswithÚendswithrrJ)Úr1Úr2Úr1paramsÚr2paramsÚkeyÚvalueÚr1jsonÚr2jsons rCÚ hgmatcherzvcrcommand..hgmatcherûsÝ€Ø �6‰6�R—V‘VÒ ˜rŸy™y¨B¯I©IÒ5ØÜ—;‘;×&Ñ& r§w¡wÓ/ˆÜ—;‘;×&Ñ& r§w¡wÓ/ˆÛˆCؘ(Ñ"ÙØ˜S‘M !Ñ$ˆEà×Ñ Ô%¨%¯.©.¸Ô*>Ü!×,Ñ,¨UÓ3�Ü!×,Ñ,¨X°c©]¸1Ñ-=Ó>�ؘVÓ#٠ؘ#‘˜qÑ! UÓ*Ùððr8cóR—tjdd|j«|_|S)Ns cli-[a-z0-9]+scli-hahayouwish)ÚreÚsubre)Úrequests rCÚsanitiserequestz#vcrcommand..sanitiserequests%€Ü—v‘vØ Ð2°G·L±Ló ˆŒ ðˆr8có —d|dvr|dd=|S)Nz set-cookieÚheaders©)Úresponses rCÚsanitiseresponsez$vcrcommand..sanitiseresponses!€Ø ˜8 IÑ.Ñ .ؘÑ# LÐ1؈r8c󴕇—ˆˆˆˆ fd„}tj|d¬«}‰j|_‰j|_t ‰‰‰ ‰‰¬«|«S)Nc óÚ•—|jd«}|r®tj|«}ddl}|j «5ddl}ddlm}|jd‰ ‰ td|jftd|jfg¬«}|jd‰«|j|dg¬«5‰|i|¤Žcddd«cddd«S‰|i|¤ŽS#1swYnxYw ddd«Œ#1swYŒ'xYw) NÚtest_vcrrÚjsonrÚhttpsconnection)Ú serializerÚbefore_record_requestÚbefore_record_responseÚcustom_patchesrp)Úmatch_on)ÚpoprÚfsdecodeÚhgdemandimportÚ deactivatedÚvcrÚ vcr.stubsÚstubsÚVCRÚurlmodÚVCRHTTPConnectionÚVCRHTTPSConnectionÚregister_matcherÚ use_cassette) rVÚkwargsr‰Úcassetter‡Úvcrmodr‹Úfnrprurzs €€€€rCÚinnerz+vcrcommand..decorate..innersøø€Ø—*‘*˜ZÓ(ˆCÙÜ#×,Ñ,¨SÓ1�Û%à#×/Ñ/Õ1ã(Ý-ð!Ÿ*™*Ø#)Ø.=Ø/?ô!'Ø 0Ø %× 7Ñ 7ðô !'Ø 1Ø %× 8Ñ 8ðð (ð %ó�Cð"×(Ñ(¨°iÔ@Ø×)Ñ)¨(¸k¸]Ð)ÕKÙ! 4Ð2¨6Ñ2÷LÐK÷32Ñ1ñ6�tÐ&˜vÑ&Ð &÷LÐKúÐK÷32×1Ñ1ús$¾A*C!Â(C Â0 C!à C ÃC!Ã!C*é)Údepth©Ú helpcategoryÚ optionalrepo)r ÚchecksignatureÚ__name__Ú__doc__Úcommand) r•r–ÚcmdÚ fullflagsršrpÚnamer›rurzÚspecs ` €€€€€€€€rCÚdecoratezvcrcommand..decorates]ù€÷! 'ôF×!Ñ! %¨qÔ1ˆØ—{‘{ˆŒ Ø—j‘jˆŒ ð ŒwØ Ø Ø Ø%Ø%ô  ð ó ð r8)Ú _VCR_FLAGS) r¢Úflagsr£ršr›r¤r¡rprurzs ` ``` @@@@rCÚ vcrcommandr§øs.ÿ€Øœ Ñ"€Iòò&ò ÷ .ó.ð` €Or8cóœ—|jdd«r.|j} d|_|j|i|¤Ž||_yy#||_wxYw)z»write debug output for Phabricator if ``phabricator.debug`` is set Specifically, this avoids dumping Conduit and HTTP auth chatter that is printed with the --debug argument. r&r-TN)Ú configboolÚ debugflagÚwrite)rRÚmsgrWÚflags rCÚ_debugr®LsQ€ð  ‡}�}�^ XÔ.Ø�|‰|ˆð ؈BŒLØ ˆB�H‰H�cÐ "˜TÒ "àˆB�Lð /øð  ˆB�Lús  AÁ A c󘇇—tj«Šdtfˆˆfd„ Љd|«tjj ‰«S)alike urlencode, but works with nested parameters. For example, if params is {'a': ['b', 'c'], 'd': {'e': 'f'}}, it will be flattened to {'a[0]': 'b', 'a[1]': 'c', 'd[e]': 'f'} and then passed to urlencode. Note: the encoding is consistent with PHP's http_build_query. Úprefixcóî•—t|t«rdddœ|}d„}t|td„ij t |««}|€|‰|<y||«D]\}}|r‰d||fz|«Œ‰||«Œ!y)Nstruesfalse)TFcóT—t|«D��cgc] \}}d|z|f‘Œc}}Scc}}w)Nó%d)Ú enumerate)ÚlÚkÚvs rCrDz2urlencodenested..process..gs&€´yÀ´|ÔD±|©t¨q°!˜U Q™Y¨šN°|ÓDùÓDs�$có"—|j«Sr<)ÚitemsrAs rCrDz2urlencodenested..process..js €¨q¯w©w¬yr8s%s[%s])r>ÚboolÚlistÚdictÚgetÚtype)r°ÚobjÚlisterr¹r¶r·Ú flatparamsÚprocesss €€rCrÂz urlencodenested..processds�ø€Ü �cœ4Ô Ø ¨Ñ2°3Ñ7ˆCÙDˆô�vœtÑ%8Ð9×=Ñ=¼dÀ3»iÓHˆà ˆ=Ø!$ˆJ�vÒ á˜cž ‘��1ÙÙ˜I¨°¨ Ñ3°QÕ7á˜A˜q•Mñ #r8r8)r rOÚbytesr#rcÚ urlencode)ÚparamsrÁrÂs @@rCÚurlencodenestedrÆ[s=ù€ô—‘“€Jð"œö"ñ" ˆC�ÔÜ �>‰>× #Ñ # JÓ /Ð/r8có€—|jdd«}|s!tjtd«dz«‚t j ||t j|«j«}d}|r*|\}}|jd|z«|jd«}|s"tjtd«|fz«‚||fS) zºreturn conduit url, token and make sure they exist Currently read from [auth] config section. In the future, it might make sense to read from .arcconfig and .arcrc as well. r&r1sconfig %s.%s is requiredrENs#using auth.%s.* for authentication s phabtokens)Can't find conduit token associated to %s) Úconfigr ÚAbortrÚhttpconnectionmodÚreadauthforurir#rÚuserÚdebugr½)rRrÚresÚtokenÚgroupÚauths rCÚ readurltokenrÒys½€ð �)‰)�N FÓ +€CÙ Ü�k‰kÜ Ð)Ó *Ð-EÑ Eó ð ô × *Ñ *¨2¨s´G·K±KÀÓ4D×4IÑ4IÓ J€CØ €Eá Ø‰ ˆˆtà �‰Ð8¸5Ñ@ÔAà—‘˜Ó&ˆá Ü�k‰kÜ Ð;Ó <À¸vÑ Eó ð ð �ˆ:Ðr8cóö—t|«\}}tjdj|d|g««j «\}}|j d|t j|«fz«|j«}d|i|d<tj|«dddœ}t|«}|jd d «} | rbtjd | tj|«fz«\} } | j!|«| j#«| j%«} nÇt'j(||«} t*j,j/t j0|«|¬ «}|j3d d «dz}|j5t6dd«}t9|«D]C} t;j<| j?||¬««5}|j%«} ddd«n|j d z«t jHd„t jJtMjN| «««}|jQd«r+tSd«|d|dfz}tUjV|«‚|dS#1swYŒžxYw#t*j@jB$rU}||dz k(r‚|j d|dz||fz«|j3d d«}tEjF|«Yd}~�ŒQd}~wwxYw)zEcall Conduit API, params is a dict. return json.loads result, or Noneó/sapisConduit Call: %s %s stokenó __conduit__sjsonr$)sparamssoutputrÕr&r,s %s -d @- %s)Údatar/shttpstimeout)ÚtimeoutNs'Conduit Request failed (try %d/%d): %r r0sConduit Response: %s cóP—t|t«rtj|«S|Sr<r=rAs rCrDzcallconduit..Æó €¬J°q¼#Ô,>”(×%Ñ% aÓ(ÐEÀAÐEr8s error_codesConduit Error (%s): %ss error_infosresult),rÒr#rrMÚauthinforÍrÚbytereprÚcopyrr~rÆrÈr!Úpopen2Ú shellquoter«ÚcloserHr�Úopenerr rcrtÚstrurlÚ configintÚ configwithÚfloatÚrangeÚ contextlibÚclosingÚopenÚurlerrÚurlerrorÚtimeÚsleeprIrJr rGr½rr rÉ)rRr¢rÅÚhostrÏrrÚÚrawdatarÖÚcurlcmdÚsinÚsoutreÚ urlopenerrtÚmax_tryr×Ú try_countÚrspÚerrÚretry_intervalÚparsedr¬s rCÚ callconduitrù—s¨€ä˜rÓ"�K€Dˆ%Ü—K‘K § ¡ ¨4°¸Ð*>Ó ?Ó@×IÑIÓK�M€CˆØ‡H�HÐ %¨¬h×.?Ñ.?ÀÓ.GÐ(HÑ HÔIØ �[‰[‹]€Fà�%ð€Fˆ>Ñô#×'Ñ'¨Ó/ØØñ€Gô ˜7Ó #€DØ�i‰i˜¨ Ó3€GÙÜ—O‘OØ ˜g¤x×':Ñ':¸3Ó'?Ð@Ñ @ó ‰ ˆˆTð � ‰ �$ŒØ � ‰ Œ Ø�y‰y‹{‰ä—M‘M " hÓ/ˆ Ü—+‘+×%Ñ%¤h§o¡o°cÓ&:ÀÐ%ÓFˆØ—,‘,˜~¨xÓ8¸1Ñ<ˆØ—-‘-¤ w° Ó;ˆÜ˜wžˆIð +Ü×'Ñ'Ø—N‘N 7°G�NÓ<ôàØŸ8™8›:�D÷ñð (ð"‡H�HÐ &¨Ñ -Ô.Ü �_‰_ÙEä×ÑœH×1Ñ1°$Ó7Ó8ó€Fð ‡z�z�-Ô ÜÐ)Ó*Ø �=Ñ !Ø �=Ñ !ð. ñ ˆô�k‰k˜#ÓÐØ �)Ñ Ð÷7ðûô —;‘;×'Ñ'ò +Ø ¨!¡ Ò+ØØ—‘Ø?Ø  1‘} g¨sÐ3ñ4ôð "$§¡¨nÐ>OÓ!P�Ü— ‘ ˜>×*Ò*ûð +ús1Æ&&JÇ I:ÇJÉ:J É?JÊK8Ê#A K3Ë3K8sdebugcallconduitsMETHODT)r›cóv—tj|jj««}t j d„t j |««}t j d„t|||««}tj|ddd¬«}|jdtj|«z«y) zƒcall Conduit API Call parameters are read from stdin as a JSON blob. Result will be written to stdout as a JSON blob. cóP—t|t«rtj|«S|Sr<r=rAs rCrDz"debugcallconduit..ÞrÙr8cóP—t|t«rtj|«S|Sr<)r>rÃr rGrAs rCrDz"debugcallconduit..ãs €¬j¸¼EÔ.B”(×'Ñ'¨Ó*ÐIÈÐIr8Tr—)Ú,z: )Ú sort_keysÚindentÚ separatorss%s N) r rGÚfinrHrrIrJrùr~Údumpsr«r@)rRÚrepor¢rZrÅrXÚss rCÚdebugcallconduitrÓsŽ€ô×%Ñ% b§f¡f§k¡k£mÓ4€Iä �_‰_ÙEÜ×јIÓ&ó€Fô �_‰_ÙIÜ�B˜˜fÓ%ó€Fô � ‰ �6 T°!À ÔN€A؇H�HˆW”x×*Ñ*¨1Ó-Ñ -Õ.r8có0—|jjdd«}|r|S|jjdd«}|syt|jddd|gii«}t|d«d k(ry|dd d }|jj dd|«|S) z.given callsign, return repository PHID or Noner&r.r+Nsdiffusion.repository.searchó constraintss callsignsódataróphid)rRrÈrùÚlenÚ setconfig)rÚrepophidÚcallsignÚquerys rCÚ getrepophidrês¡€ð�w‰w�~‰~˜n¨kÓ:€HÙØˆØ�w‰w�~‰~˜n¨kÓ:€HÙ ØÜ Ø �‰Ø&Ø ˜,¨¨ Ð3Ð4ó €Eô  ˆ5�‰>Ó˜aÒØØ�W‰~˜aÑ  Ñ)€H؇G�G×Ñ�n k°8Ô<Ø €Or8s\AD([1-9][0-9]*)\Zs>^Differential Revision:\s*(?P(?:.*)D(?P[1-9][0-9]*))$cóâ—|j«}|jjj}i}t j «}|D]ê}||}t tj|j|g««}|D]e} || «sŒ |j| «D]D} tj| «} | sŒdt|«t| jd««f||<nŒeŒ›t j#|j%««} | sŒÂdt|«t| jd««f||<Œì|�rŸ|j'«D� � �cgc]\} } }|‘Œ }} } }t)|j*dd|i«}d„}|j-«D�]J\}\} }}|j'«D�cgc]}t|d«|k(sŒ|‘Œ}}|D�� chc]}|||«D]} | ’ŒŒ}}} | sU|sSd|z}t/j0|||j2d d d d ¬ «|j*j5t7d «|z«Œ°d x}}|r�t9|d „¬«}|||«}t;|j*dt=|«t?j@tC|«D� cgc] } t=| «‘Œc} «fz«tE|«dk(r|d}|r ||«sd }|||f||<�ŒM|Scc}} } wcc}wcc} }wcc} w)aþfind previous nodes that has been sent to Phabricator return {node: (oldnode, Differential diff, Differential Revision ID)} for node in nodelist with known previous sent versions, or associated Differential Revision IDs. ``oldnode`` and ``Differential diff`` could be ``None``. Examines commit messages like "Differential Revision:" to get the association information. If such commit message line is not found, examines all precursors and their tags. Tags with format like "D1234" are considered a match and the node with that tag, and the number after "D" (ex. 1234) will be returned. The ``old node``, if not None, is guaranteed to be the last diff of corresponding Differential Revision, and exist in the repo. rr$Úidódifferential.querydiffss revisionIDscóH—t|«D�cgc] }||vsŒ|‘Œ c}Scc}wr<)Úgetlocalcommits)ÚdÚprecsetÚns rCÚgetnodesz#getoldnodedrevmap..getnodes9s)€ô /¨qÔ1ÓBÑ1˜!°Q¸'²\’AÐ1ÑBÐ BùÒBsŽ ˜s revisionIDóD%dNT©ÚmessagerÌÚdateÚlocals=D%d: local tag removed - does not match Differential history có—t|d«S)Nóid©Úint)rs rCrDz#getoldnodedrevmap..`s €´C¸¸%¹´Mr8)rls%s mapped to old nodes %s )#Ú unfilteredÚ changelogÚindexÚhas_noder rOr»rÚallpredecessorsÚobsstoreÚnodetagsÚ_differentialrevisiontagrerÚsetr!rÐÚ_differentialrevisiondescreÚsearchÚ descriptionÚvaluesrùrRr¹rÚtagÚnullidrLrÚmaxr®rr"ÚpprintÚsortedr )rÚnodelistÚunfir%rXÚ toconfirmÚnodeÚctxÚ precnodesrr/ÚmÚforceÚprecsÚdrevÚdrevsÚalldiffsrÚnewnoderrÚdiffsÚ phprecsetÚtagnameÚoldnodeÚlastdiffÚoldnodess rCÚgetoldnodedrevmaprGsù€ð$ �?‰?Ó €DØ�~‰~×#Ñ#×,Ñ,€Hà €Fä— ‘ “€IÛˆØ�4‰jˆäœ×0Ñ0°·±ÀÀÓGÓHˆ ÛˆAÙ˜�{ØŸ=™=¨Ö+�CÜ2×8Ñ8¸Ó=�AÚØ+,¬c°)«n¼cÀ!Ç'Á'È!Ã*»oÐ*N˜  $™Ùð ,ð Ùðô,×2Ñ2°3·?±?Ó3DÓEˆAÚØ#$¤c¨)£n´c¸!¿'¹'À$»-Ó6HÐ"I� ˜$’ð%ò,Ø09×0@Ñ0@Ô0BÕCÑ0BÑ,˜% ¨’Ð0BˆÒCÜØ �G‰GÐ/°.À%Ð1Hó ˆò Cð 09¯©×/@Ñ +ˆGÑ+�e˜W dà#Ÿ?™?Ô,óÙ,�a´°A°mÑ4DÓ0EÈÓ0M’Ð,ð ðñ %*ÔH¡E˜q±8¸A¸wÖ3G¨ašÐ3G˜ EˆIÑHñ¡Ø  4™-�Ü—‘ØØØ—K‘KØ ØØØõð—‘— ‘ Üð2óðñ ôðð"&Ð %ˆG�hÙܘuÑ*AÔB�Ù# H¨gÓ6�䨗G‘GØ2ä˜g›Ü"×)Ñ)¼VÀHÔ=MÓ*NÑ=M¸¬5°­8Ð=MÑ*NÓOðñôô.�x“= AÒ%Ø& q™k�GÙ¡8¨GÔ#4Ø"�Gà&¨°$Ð7ˆF�7‹OðC0AðF €Mùô[Dùòùó IùòH+OsÅ KÆ'K!Æ>K!Ç K&ÊK,cóf—i}|D]©}d||<||}tj|j««}|rt|j d««||<ŒP|j |j ««D]8}tj|«}|sŒt|j d««||<Œ©Œ«|S)z\Return a dict mapping each rev in `revs` to their Differential Revision ID or None. Nrr$) r+r,r-r!rÐr(r7r)r)rÚrevsrXÚrevr8r:r/s rCÚ getdrevmaprK„s£€ð€Fۈ؈ˆs‰ Ø�3‰iˆä '× .Ñ .¨s¯©Ó/@Ó AˆÙ ܘaŸg™g d›mÓ,ˆF�3‰KØ à—=‘= §¡£Ö,ˆCÜ*×0Ñ0°Ó5ˆAÚÜ! !§'¡'¨!£*›o��s‘ Ùñ -ðð €Mr8có —tj«}tj|j «|j «j «|j «d|¬«D]\}}|j|«Œ|j«S)z:plain-text diff without header (user, commit message, etc)N©rW) r ÚstringiorÚdiffuirÚp1r7r«Úgetvalue)Úbasectxr8ÚdiffoptsÚoutputÚchunkÚ_labels rCÚgetdiffrW›sg€ä �]‰]‹_€FÜŸ™Ø �‰‹ �G—J‘J“L×%Ñ%Ó'¨¯©«°TÀ÷‰ ˆˆvð � ‰ �UÕðð �?‰?Ó Ðr8có,—eZdZdZdZdZdZdZdZdZ dZ y ) ÚDiffChangeTyper$r—ééééééN) r�Ú __module__Ú __qualname__ÚADDÚCHANGEÚDELETEÚ MOVE_AWAYÚ COPY_AWAYÚ MOVE_HEREÚ COPY_HEREÚ MULTICOPYrxr8rCrYrY¥s*„Ø €CØ €FØ €FØ€IØ€IØ€IØ€IØ�Ir8rYcó—eZdZdZdZdZy)Ú DiffFileTyper$r—rZN)r�r`raÚTEXTÚIMAGEÚBINARYrxr8rCrkrk°s„Ø €DØ €EØ �Fr8rkcó—eZdZdZej d¬«Zej d¬«Zej d¬«Zej d¬«Z ej d¬«Z ej d¬«Z ej d¬«Z y)ÚphabhunkzGRepresents a Differential hunk, which is owned by a Differential changerr)ÚN) r�r`raržrÚibÚ oldOffsetÚ oldLengthÚ newOffsetÚ newLengthÚcorpusÚaddLinesÚdelLinesrxr8rCrprp¶su„áQà�—‘ Ô"€IØ�—‘ Ô"€IØ�—‘ Ô"€IØ�—‘ Ô"€IØ ˆT�W‰W˜RÔ €Fàˆt�w‰w˜qÔ!€H؈t�w‰w˜qÔ!�Hr8rpcó¸—eZdZdZej d¬«Zej d¬«Zej eje «¬«Z ej eje «¬«Z ej eje «¬«Z ej eje «¬«Zej ej ¬«Zej ej&¬«Zej d¬«Zej d¬«Zej d¬«Zej eje «¬«Zd„Zd„Zd„Zd„Zy) Ú phabchangez�Represents a Differential change, owns Differential hunks and owned by a Differential diff. Each one represents one file in a diff. Nr)rcó°—t|jj««D]0}|jdd«}|j||j|<Œ2y)Nsnew:sold:)r»ÚmetadataÚkeysÚreplace)ÚselfrlÚnewkeys rCÚcopynewmetadatatooldzphabchange.copynewmetadatatoold×sE€Ü˜Ÿ ™ ×*Ñ*Ó,Ö-ˆCØ—[‘[ ¨'Ó2ˆFØ$(§M¡M°#Ñ$6ˆD�M‰M˜&Ò !ñ.r8có"—||jd<y©Ns unix:filemode)Ú oldProperties©r€rms rCÚ addoldmodezphabchange.addoldmodeÜó€Ø/4ˆ×ÑÐ+Ò,r8có"—||jd<yr„)Ú newPropertiesr†s rCÚ addnewmodezphabchange.addnewmodeßrˆr8cóL—t|t«stjd«‚|jj t jtj|«««|xj|jz c_ |xj|jz c_ y)Ns'phabchange.addhunk only takes phabhunks) r>rpr rÉÚhunksÚappendrÚ byteskwargsrÚasdictrxry)r€Úhunks rCÚaddhunkzphabchange.addhunkâsh€Ü˜$¤Ô)Ü—+‘+ÐHÓIÐ IØ � ‰ ×Ñœ(×.Ñ.¬t¯{©{¸4Ó/@ÓAÔBð � Š ˜Ÿ™Ñ&� Ø � Š ˜Ÿ™Ñ&Ž r8)r�r`raržrrrÚ currentPathÚoldPathÚFactoryr»Ú awayPathsr¼r}r…rŠrYrcr¾rkrlÚfileTypeÚ commitHashrxryr�r‚r‡r‹r’rxr8rCr{r{Äs „ñð�$—'‘' $Ô'€K؈d�g‰g˜dÔ#€GØ�—‘   § ¡ ¨TÓ 2Ô3€I؈t�w‰w˜|˜tŸ|™|¨DÓ1Ô2€HØ�D—G‘G L D§L¡L°Ó$6Ô7€MØ�D—G‘G L D§L¡L°Ó$6Ô7€MØ ˆ4�7‰7˜>×0Ñ0Ô 1€D؈t�w‰w˜|×0Ñ0Ô1€HØ�—‘ Ô&€J؈t�w‰w˜qÔ!€H؈t�w‰w˜qÔ!€HØ ˆD�G‰G˜L˜DŸL™L¨Ó.Ô /€Eò7ò 5ò5ó'r8r{cóþ—eZdZdZej d¬«Zej d¬«Zej d¬«Zej d¬«Z ej d¬«Z ej d¬«Z ej d¬«Z ej d ¬«Z ej d ¬«Zej d ¬«Zej ej e«¬«Zej d¬«Zd „Zy) Úphabdiffz]Represents a Differential diff, owns Differential changes. Corresponds to a commit. r8r)rÔs(0000000000000000000000000000000000000000shgsdefaultNr2snonecóÌ—t|t«stjd«‚t j t j|««|j|j<y)Ns)phabdiff.addchange only takes phabchanges) r>r{r rÉrr�rr�Úchangesr“)r€Úchanges rCÚ addchangezphabdiff.addchangesG€Ü˜&¤*Ô-Ü—+‘+ÐJÓKÐ KÜ+3×+?Ñ+?Ü �K‰K˜Ó ó, ˆ� ‰ �V×'Ñ'Ò(r8)r�r`raržrrrÚ sourceMachineÚ sourcePathÚsourceControlBaseRevisionÚsourceControlPathÚsourceControlSystemÚbranchÚbookmarkÚcreationMethodÚ lintStatusÚ unitStatusr•r¼rœÚrepositoryPHIDržrxr8rCršršísÜ„ñð �D—G‘G CÔ(€MØ�—‘ Ô&€JØ ' §¡° Ô :ÐØ˜Ÿ™¨Ô-ÐØ!˜$Ÿ'™'¨%Ô0ÐØ ˆT�W‰W˜ZÔ (€F؈t�w‰w˜tÔ$€HØ�T—W‘W [Ô1€NØ�—‘ Ô)€JØ�—‘ Ô)€J؈d�g‰g˜l˜dŸl™l¨4Ó0Ô1€GØ�T—W‘W TÔ*€Nó r8ršc ó.—|j«}tj|g«}tjdd¬«}t t j||j«|||¬««\}}} } | D]�} | \\} } }}}dj|dd«}t| «}|j|«t jt jtj|«««\}}}}}|j!t#| | |||||««ŒŸy)z'populate the phabchange for a text fileTéÿ©Úgitr rMr8r$N)rrÚexactrrSÚnextrÚ diffhunksrPrMr»ÚextendÚ diffstatsumÚ diffstatdatar Ú iterlinesr’rp)ÚpchangerRr8ÚfnamerÚfmatcherrSÚ_pfctxÚ_fctxÚheaderÚfhunksÚfhunkrsrtrurvÚlinesrwÚshunkÚ_mfÚ_mtrxryÚ_hbs rCÚmaketextr sÿ€à �8‰8‹:€DÜ�{‰{˜E˜7Ó#€HÜ�~‰~ $°Ô6€HÜ$(Ü �‰˜˜gŸj™j›l¨C°ÀÔIó%Ñ!€FˆE�6˜6óˆØ>CÑ;Ñ4ˆ�I˜y¨)°eØ—‘˜%  ˜)Ó$ˆÜ�V“ ˆØ � ‰ �UÔÜ,1×,=Ñ,=Ü × Ñ œtŸ~™~¨eÓ4Ó 5ó- Ñ)ˆˆS�(˜H cð �‰Ü ØØØØØØØó õ ñr8c ó¾—|j«j}t|dd|i«}|jt d«t d«t |«¬«5}|D]j}|j «|drŒt|d«}t|d«}t|d ||tj|j«||«d d œ«Œl d d d «y #1swYy xYw) ztupload large binary files as separate chunks. Phab requests chunking over 8MiB, and splits into 4MiB chunks sfile.querychunksófilePHIDsuploading file chunksschunks)ÚunitÚtotalscompleteó byteStartsbyteEndsfile.uploadchunksbase64)rÄrÇrs dataEncodingN) rrRrùÚ makeprogressrr Ú incrementr!Úbase64Ú b64encoderÖ)ÚfctxÚfphidrRÚchunksÚprogressrUÚbstartÚbends rCÚ uploadchunksrÒ'sÖ€ð �‰‹�‰€BÜ ˜Ð0°;ÀÐ2FÓ G€FØ �‰Ü Ð "Ó#¬!¨I«,¼cÀ&»kð ô à ÛˆEØ × Ñ Ô Ø�[Ò!ØÜ˜˜|Ñ,Ó-ˆFÜ�u˜ZÑ(Ó)ˆDÜ ØØ#à!&Ø"(Ü#×-Ñ-¨d¯i©i«k¸&ÀÐ.FÓGØ%.ñ õ ñ ÷ ÷ ñ ús ÁA0CÃCcó’—|j«}|j}|j«}|j«}t j t j|j««j««}|||dœ}t|d|«}|d}|dri|jtd«t|«z«|s4|tj|j««dœ} t|d| «}n*t!||«n|j#dt|«z«|s!t%j&d t|«z«‚|S) z"upload binary files to Phabricator)ónames contentLengths contentHashs file.allocaterÄsuploads uploading %s )rÔs data_base64s file.uploadsserver already has %s sUpload of %s failed.)rrRÚpathÚsizerÚbytestrÚhashlibÚsha256rÖÚ hexdigestrùr«rrÃrÊrËrÒrÍr rÉ) rÌrrRr¶rÖÚfhashÚallocateparamsÚ fileallocrÍÚ uploadparamss rCÚ uploadfilerßBs€à �9‰9‹;€DØ �‰€BØ �I‰I‹K€EØ �9‰9‹;€DÜ × Ñ œWŸ^™^¨D¯I©I«KÓ8×BÑBÓDÓ E€Eð ØØñ€Nô ˜BÐ 0°.ÓA€IØ �kÑ "€Eà�ÒØ �‰”Ð$Ó%¬¨d« Ñ3Ô4ÙàÜ &× 0Ñ 0°·±³Ó =ñˆLô   N°LÓA‰Eä ˜˜uÕ %à �‰Ð+¬e°D«kÑ9Ô:á Ü�k‰kÐ1´E¸$³KÑ?Ó@Ð@à €Lr8cóž—|r|j|«r•|j«|jd<tjt j |j«««\}}|r"tj|«|jd<t|«}||jd<ytj|_ |j«y)zòadd the metadata for the previous version of a binary file to the phabchange for the new version ``oldfctx`` is the previous version of the file; ``fctx`` is the new version of the file, or None if the file is being removed. s old:file:sizesold:file:mime-typesold:binary-phidN)ÚcmprÖr}Ú mimetypesÚ guess_typer rGrÕrr×rßrkrlr—r‚)rµÚoldfctxrÌÚ mimeguessÚ_encrÍs rCÚ addoldbinaryrçgs®€ñ �4—8‘8˜GÔ$à-4¯\©\«^ˆ×ÑÐ)Ñ*Ü#×.Ñ.Ü × !Ñ ! '§,¡,£.Ó 1ó ‰ˆ �4ñ Ü6>×6FÑ6FØó7ˆG× Ñ Ð2Ñ 3ô˜7Ó#ˆØ/4ˆ×ÑÐ+Ò,ô(×,Ñ,ˆÔØ×$Ñ$Õ&r8cóª—tj|_t|«}||jd<|j «|jd<t jtj|j«««\}}|rLtj|«}||jd<|jd«rtj|_yyy)z)populate the phabchange for a binary filesnew:binary-phids new:file:sizesnew:file:mime-typesimage/N)rkrnr—rßr}rÖrârãr rGrÕrr×rfrm)rµrÌrÍråræs rCÚ makebinaryré€s±€ä#×*Ñ*€GÔÜ �tÓ €EØ+0€G×ÑÐ'Ñ(Ø)-¯©«€G×ÑÐ%Ñ&Ü×*Ñ*¬8×+@Ñ+@ÀÇÁÃÓ+MÓN�O€IˆtÙÜ×$Ñ$ YÓ/ˆ Ø2;ˆ×ÑÐ.Ñ/Ø × Ñ   Ô *Ü+×1Ñ1ˆGÕ ð +ðr8s120000s100755s100644)ólóxr8cóè— |j«jd«y#t$rF|j«jj t d«|j«z«YywxYw)z[detect non-UTF-8 text files since Phabricator requires them to be marked as binary zutf-8Fs0file %s detected as non-UTF-8, marked as binary T)rÖÚdecodeÚUnicodeDecodeErrorrrRr«rrÕ)rÌs rCÚnotutf8rï’sa€ðØ � ‰ ‹ ×ј7Ô#ØøÜ òØ � ‰ ‹ �‰×ÑÜ ÐBÓ CØ�i‰i‹kñ ô ñð ús‚"¢A A1Á0A1có0—|D]‘}t||tj¬«}|j«|}|j t |j ««|j«st|«st||||«|j|«Œ“y)z:add removed files to the phabdiff. Shouldn't include moves)r“r”r¾N) r{rYrdrPr‡Úgitmoder¦ÚisbinaryrïrÂrž)ÚpdiffrRr8Úremovedr¶rµräs rCÚ addremovedrõ¡s{€ãˆÜØ u´>×3HÑ3Hô ˆð—*‘*“,˜uÑ%ˆØ×Ñœ7 7§=¡=£?Ñ3Ô4Ø× Ñ Ô"¤g¨gÔ&6Ü �W˜g s¨EÔ 2à �‰˜Õ ñr8cóä—|D]ë}||}|j«|}t||¬«}t|j«}t|j«} || k7r"|j | «|j |«|j «s&t|«s|j «s t|«rt||«t|||«nt||||«|j|«Œíy)z"add modified files to the phabdiff)r“r”N) rPr{rñr¦r‡r‹ròrïrérçrÂrž) rórRr8Úmodifiedr¶rÌrärµÚfilemodeÚ originalmodes rCÚ addmodifiedrú¯sË€ãˆØ�5‰zˆØ—*‘*“,˜uÑ%ˆÜ¨¸Ô>ˆÜ˜4Ÿ:™:›<Ñ(ˆÜ˜wŸ}™}›Ñ/ˆ Ø �|Ò #Ø × Ñ ˜|Ô ,Ø × Ñ ˜xÔ (ð �M‰MŒOÜ�tŒ}Ø×ÑÔ!Ü�wÔä �w Ô %Ü ˜ '¨4Õ 0ä �W˜g s¨EÔ 2à �‰˜Õ ñ+r8cóî—i}i}i}||k7r$tj|j«|«}|D�]n}||} d} t|¬«} t| j «} |r|j ||«} n%|} | j«r| j«d} || k7}|�rQ|j«| } t| j «}| | _| |vrJt| | tj|g¬«}||| <|j| «tj| _ nª| |vrLtj|| _ || jj!|«tj"| _ nZ| |vr!t| tj$¬«}||| <n|| }|jj!|«tj"| _ | |k7r^| j'|«| j)| «n;| j)t| j ««tj*| _ | j-«s(t/| «s| r7| j-«s t/| «rt1| | «|rt3| | | «nt5| |||«|j7| «�Œq|j9«D]\}}|j7|«Œ|j9«D]\}}|j7|«Œy)z>add file adds to the phabdiff, both new files and copies/movesN)r“r)r“r”r¾r–)r“r¾)r Ú pathcopiesrPr{rñr¦r½Úrenamedr”rYreÚremovergr¾rir–rŽrhrfr‡r‹rbròrïrérçrÂržr¹)rórRr8ÚaddedrôÚ copiedchangesÚ movedchangesrÜr¶rÌrärµrøÚ originalfnamerýrùÚ origpchangeÚ_pathÚ copiedchangeÚ movedchanges rCÚaddaddedrÉs™€ð€MØ€Là €DØ�#‚~Ü× Ñ  §¡£¨sÓ3ˆäˆØ�5‰zˆØˆÜ¨Ô/ˆä˜4Ÿ:™:›<Ñ(ˆá Ø ŸH™H U¨EÓ2‰Mà!ˆMØ�|‰|Œ~Ø $§ ¡ £¨qÑ 1� à˜=Ñ(ˆâ Ø—j‘j“l =Ñ1ˆGÜ" 7§=¡=£?Ñ3ˆLØ+ˆGŒOà Ñ'Ü(Ø -Ø)Ü'×1Ñ1Ø$˜gô � ð /:� ˜]Ñ+Ø—‘˜}Ô-Ü-×7Ñ7�• Ø ,Ñ.Ü3A×3KÑ3K� ˜]Ñ+Ô0ؘ]Ñ+×5Ñ5×<Ñ<¸UÔCÜ-×7Ñ7�• à ¨ Ñ5Ü",Ø$1¼×8PÑ8Pô#�Kð4?�M -Ò0à"/° Ñ">�KØ×%Ñ%×,Ñ,¨UÔ3Ü-×7Ñ7�” à˜<Ò'Ø×"Ñ" <Ô0Ø×"Ñ" 8Õ,à × Ñ œw t§z¡z£|Ñ4Ô 5Ü)×-Ñ-ˆGŒLð �M‰MŒOÜ�tŒ}Ù˜W×-Ñ-Ô/´7¸7Ô3Cä �w Ô %ÙܘW g¨tÕ4ä �W˜g s¨EÔ 2à �‰˜Ö ðAðD -×2Ñ2Ö4шˆ|Ø �‰˜ Õ%ð 5à*×0Ñ0Ö2шˆ{Ø �‰˜ Õ$ñ3r8c ó\—|j«}t|«}td|j«j «zd|j «z¬«}|j«j |«\}}}}} } } t|||||«t||||«t||||«|r||_ t|jdtjtj |«««} | s9||k7rt#d«||fz} nt#d«|z} t%j&| «‚| S)zcreate a Differential Diffs%s)r¡r¤sdifferential.creatediffscannot create diff for %s::%sscannot create diff for %s)rrršrPÚhexr¤Ústatusrrúrõr©rùrRrr�rr�rr rÉ)rRr8rr rór÷rÿrôÚ_dÚ_uÚ_iÚ_cÚdiffr¬s rCÚ creatediffrs€à �8‰8‹:€Dܘ4Ó €Hä Ø"'¨'¯*©*«,×*:Ñ*:Ó*<Ñ"<Ø�s—z‘z“|Ñ#ô €Eð07¯z©z«|×/BÑ/BÀ3Ó/GÑ,€Hˆe�W˜b " b¨"ô ˆU�G˜S %¨Ô1Ü��w  XÔ.܈u�g˜s GÔ,ÙØ'ˆÔÜ Ø �‰Ø"Ü×ÑœTŸ[™[¨Ó/Ó0ó €Dñ Ø �cŠ>ÜÐ4Ó5¸À#¸ÑF‰CäÐ0Ó1°CÑ7ˆCÜ�k‰k˜#ÓÐØ €Kr8c ó|—|jd|jd««}|d}|d}|dtj|j«d|j «z|j «|j «|j«j «dœ«dœ}t|j«jd |«i}|D]±}tj|j««tj|j««t|j «d«|j «|j«j «g|j «d œ||j «<Œ³|d tj|«dœ}t|j«jd |«y ) zôwrite metadata to diff so patches could be applied losslessly ``ctxs`` is the list of commits that created the diff, in ascending order. The list is generally a single commit, but may be several when using ``phabsend --fold``. sdiffidrréÿÿÿÿóhg:metas%d %d)óuseródateóbranchónodeóparent)sdiff_idrÔrsdifferential.setdiffproperty)óauthoró authorEmailótimeócommitóparentsró local:commitsN)r½rr~rÌrr¤r rPrùrrRr"ÚpersonÚemailr!)ÚctxsrÚdiffidrRÚtipctxrÅÚcommitsr8s rCÚwritediffpropertiesr%;s]€ð�X‰X�i §¡¨%£Ó 1€FØ�1‰g€GØ �"‰X€FðØÜ ×%Ñ%àŸ™›Ø! F§K¡K£MÑ1Ø!Ÿ=™=›?ØŸ™›Ø"Ÿ:™:›<×+Ñ+Ó-ñ  ó ñ €Fô�— ‘ “×!Ñ!Ð#BÀFÔKà€GÛˆä!×(Ñ(¨¯©«Ó4Ü&×,Ñ,¨S¯X©X«ZÓ8ܘŸ™› A™Ó'Ø—w‘w“yØŸ™›Ÿ™›Ð(Ø—z‘z“|ñ  ˆ�—‘“ ÒððØ!Ü ×%Ñ% gÓ.ñ€Fô �— ‘ “×!Ñ!Ð#BÀFÕKr8c óv—|d}|d} |j«} |rMtjdd¬«} | j«} | |} | |}t | || «t || | «k7}nd}g}|r:t | |«}|j d|ddœ«|r|j d |dœ«n|sJ‚|}t||«|r|j d |gdœ«|r||z }tj«}t|«D]©\}}|j«}t| jd d |i«}d D]v}|dj|«}|sŒ|dk(r|j«||<Œ3|dk(rd}dj!t#d|j|«|j«g««||<ŒxŒ«|j%«D]\}}|j ||dœ«Œd|i}|�||d<t| jd|«}|sBt'|«dk(rt)d«|z}nt)d«| |fz}t+j,|«‚||fS)aÆcreate or update a Differential Revision If revid is None, create a new Differential Revision, otherwise update revid. If parentrevphid is not None, set it as a dependency. If there is a single commit for the new Differential Revision, ``ctxs`` will be a list of that single context. Otherwise, it is a list that covers the range of changes for the differential, where ``ctxs[0]`` is the first change to include and ``ctxs[-1]`` is the last. If oldnode is not None, check if the patch content (without commit message and metadata) has changed before creating another diff. For a Revision with a single commit, ``oldbasenode`` and ``oldnode`` have the same value. For a Revision covering multiple commits, ``oldbasenode`` corresponds to ``ctxs[0]`` the previous time this Revision was posted, and ``oldnode`` corresponds to ``ctxs[-1]``. If actions is not None, they will be appended to the transaction. rrTr«r¬supdater ©stypesvalueócomments parents.setsdifferential.parsecommitmessagescorpus)ótitleósummaryótestPlanófieldsr)r*ó Nó transactionsóobjectIdentifieródifferential.revision.editr$scannot create revision for %ss!cannot create revision for %s::%s)rrrSr"rWrrŽr%r rOr´r-rùrRr½ÚrstriprMÚfilterr¹r rr rÉ)r!ÚrevidÚ parentrevphidÚ oldbasenoderDÚolddiffÚactionsÚcommentr8rRrrSr5ÚoldctxÚ oldbasectxÚ neednewdiffÚ transactionsrÚfieldsÚiÚ_ctxÚdescÚinfor¶r·rÅÚrevisionr¬s rCÚcreatedifferentialrevisionrChsi€ð: ˆr‰(€CØ�1‰g€Gà �8‰8‹:€DÙÜ—>‘> d°EÔ:ˆØ�‰Ó ˆØ�g‘ˆØ˜+Ñ&ˆ ܘg s¨HÓ5¼Ø ˜ ó: ñ ‰ ðˆ à€LÙܘ' 3Ó'ˆØ×Ñ i¸4À¹=ÑIÔJÙ Ø × Ñ ¨*ÀÑ HÕ Iñ ˆˆw؈ܘ˜dÔ#ñØ×ÑØ$°°Ñ @ô ñؘш ô�]‰]‹_€Fä˜T–?‰ˆˆ4à×ÑÓ!ˆÜØ �G‰GÐ7¸)ÀTÐ9Jó ˆó5ˆAØ�Y‘×#Ñ# AÓ&ˆAÙØà�AŠvðŸH™H›J��q‘ ØØ�h’ð�ð Ÿ ™ ¤V¨D°6·:±:¸a³=À!Ç(Á(Ã*Ð2MÓ%NÓOˆF�1ŠIñ!5ð#ð2— ‘ –‰ˆˆ1Ø×Ñ a°1Ñ5Õ6ðð˜|Ð ,€FØ Ðà&+ˆÐ"Ñ#ä˜4Ÿ7™7Ð$AÀ6ÓJ€HÙ Ü ˆt‹9˜Š>ÜÐ4Ó5¸Ñ;‰CäÐ8Ó9¸WÀc¸NÑJˆCÜ�k‰k˜#ÓÐà �Tˆ>Ðr8cóˆ—|D�cgc]}|j«‘Œ}}dd|ii}t|d|«}|d}|D�chc]}|ddj«’Œ}}t|«|z }|r9tjt d«dj t|««z«‚|D�cgc]}|d ‘Œ c}Scc}wcc}wcc}w) zconvert user names to PHIDsrs usernamess user.searchrr,susernamesunknown username: %só r )Úlowerrùr*r rÉrrMr3) rRÚnamesr¢rrXrÖÚentryÚresolvedÚ unresolveds rCÚ userphidsrKàsÔ€á&+Ó ,¡e˜dˆT�Z‰Z�\ e€EÐ ,Ø ˜l¨EÐ2Ð 3€EÜ ˜˜^¨UÓ 3€Fð �'‰?€DÙCGÓHÁ4¸%��iÑ  Ñ-×3Ñ3Õ5À4€HÐHÜ�U“˜hÑ&€JÙÜ�k‰kÜ Ð%Ó &¨¯©´6¸*Ó3EÓ)FÑ Fó ð ñ)-Ó -©˜uˆE�'‹N¨Ñ -Ð-ùò -ùò Iùò .s…B5ºB:Â& B?có —|jtd«td«td«dœ|d|z«}|jd|zd«}tj||d«}|j td «|||fz«y ) zßprint the ``action`` that occurred when posting ``ctx`` for review This is a utility function for the sending phase of ``phabsend``, which makes it easier to show a status for all local commits with `--fold``. ócreatedóskippedóupdated)rMrNrOsphabricator.action.%srr7r2s %s - %s - %s N)ÚlabelrrÚformat_changeset_summaryr«)rRr8ÚnewrevidÚactionÚ actiondescÚdrevdescÚsummarys rCÚ_print_phabsend_actionrWñsŠ€ð —‘ä˜*› ܘ*› ܘ*› ñ ð ñ  ð ! 6Ñ)ó €Jð�x‰x˜ Ñ)Ð+>Ó?€HÜ×.Ñ.¨r°3¸ ÓD€G؇H�HŒQÐ Ó ! X¨z¸7Ð$CÑ CÕDr8c ó\—t|jdtj|D�cgc] }t |«‘Œc}«z« t |D�cgc]}||‘Œ c}|«ycc}wcc}w#t jj$r!|jjd|z«YywxYw)zÃupdate the local commit list for the ``diff`` associated with ``drevid`` This is a utility function for the amend phase of ``phabsend``, which converts failures to warning messages. snew commits: %s s"Failed to update metadata for D%d N) r®rRr"r2rr%r rérêÚ warnnoi18n)r5ÚdrevidÚnewnodesrrr@s rCÚ_amend_diff_propertiesr\s�€ô  Ø �‰Øœz×0Ñ0ÁHÓ1MÁH¸q´%¸µ(ÀHÑ1MÓNÑNôð Lܹ(ÓC¹(¨w˜T '›]¸(ÑCÀTÕJùò 2NùòDøÜ �;‰;× Ñ òLð �‰×ÑÐAÀFÑJÖKðLús)¥A#Á A-Á A(ÁA-Á(A-Á-;B+Â*B+órórevsrevisions to sendsREVóamendsupdate commit messagesóreviewersspecify reviewersóblockersspecify blocking reviewersómr(s1add a comment to Revisions with new/updated Diffss#ask for confirmation before sendingófolds%combine the revisions into one reviews REV [OPTIONS])ršcó�‡—tj|«}t|«|jdg«z}t j ‰|«}|j «|stjtd««‚|jd«rtj‰«|D�cgc]}‰|‘Œ }}td„|D««rtjtd««‚ˆfd„}‰jd|«}t|«dkDr ||d «‰jd |«}t|«dkDr ||d «|jd «} | r×t|«dk(rtjtd ««‚|jd«stjtd««‚|D� cgc]%} tj!| j#««‘Œ'} } t| D� chc]} | sŒ| j%d«’Œc} «dkDrtjtd««‚t'‰|D� cgc]} ‰| j)«‘Œc} «}|j+dd«}|t-|jd««z}|r-t/‰||«}|stjtd««‚g}|jdg«}|jdg«}g}|r%|j1t3‰j4|««|r0|j1t7d„t3‰j4|«««|r|j9d|dœ«g}i}d}|D�]F} | r6|j;d| j=«|dj=«fz«n"|j;d| j=«z«|j| j)«d«\}}}|||}}}| r'|j|dj)«d«\}}}|| j)«k7s|jd«rít?| r|n| g|||||||jd««\}}| r|D]} ||| j)«<Œn||| j)«<tA|dd «} |dd!}!|rd"}"nd#}"| s•tj!| j#««} | rtA| j%d$««| k7rSd%| z}#tCjD‰|#| j)«dddd&¬'«n#tG‰j4d(|z«d)d!}!|} d*}"|j9| «|!}| r?|D]8}$|j|$j)«d«d+rd"}"nd#}"tI||$| |"«Œ:ntI|| | |"«�ŒI|jd«�r]‰jK«}%tM|d,d-|i«}&‰jO«5‰jQ«5‰jSd«5‰jUd.||«D�$cgc]}$|$‘Œ}'}$|%d/j)«}(i})g}*|d)}+tW|«D�]„\},}|%|}-| s||,}+|&D�.cgc]}.tA|.d «|+k(sŒ|.‘Œc}.d)}/tY|/|-| «}0|-j#«|0k7sA|-j[«j)«|)vs!|-j]«j)«|)v�rÉ|-j_«t`jbk(r1|jetd0«tgjh|-«z«Œë|)j|-j[«j)«|-j[«f«d)|)j|-j]«j)«|-j]«f«d)g}1tkjl‰|0|)«}0tojp‰|-|1|0|-js«|-ju«|-jw«¬1«}2|2jy«}3|3g|)|-j)«<| r|*j9|3«�Œt{|%|+|3g||-j)««d%|+z}#|#‰jC«vs�Œ:tCjD‰|#‰j|dddd&¬'«�Œb| s�Œf|*j9|-j)««�Œ‡| r\|*rZ|-j)«}rtU|*«t|«k7rt�|d2|+z«t{|%|+|*|«nt�|d3|+z«n| r t�|d4«|'D�]|}-|)j|-j[«j)«|-j[«f«d)|)j|-j]«j)«|-j]«f«d)g}1tojp‰|-|1tkjl‰|-j#«|)«|-js«|-ju«|-jw«¬1«}2|2jy«}3|3|-j)«k7rG|3g|)|-j)«<t�|d5tƒ|-j)««tƒ|3«fz«�ŒWt�|d6tƒ|-j)««z«�Œtgj„‰|)dd&¬7«|(|)vr|%j‡|)|(d)«ddd«ddd«ddd«yycc}wcc} wcc} wcc} wcc}$wcc}.w#1swYŒ9xYw#1swYŒ=xYw#1swYyxYw)8aíupload changesets to Phabricator If there are multiple revisions specified, they will be send as a stack with a linear dependencies relationship using the order specified by the revset. For the first time uploading changesets, local tags will be created to maintain the association. After the first time, phabsend will check obsstore and tags information so it can figure out whether to update an existing Differential Revision, or create a new one. If --amend is set, update commit messages so they have the ``Differential Revision`` URL, remove related tags. This is similar to what arcanist will do, and is more desired in author-push workflows. Otherwise, use local tags to record the ``Differential Revision`` association. The --confirm option lets you confirm changesets before sending them. You can also add following to your configuration file to make it default behaviour:: [phabsend] confirm = true By default, a separate review will be created for each commit that is selected, and will have the same parent/child relationship in Phabricator. If ``--fold`` is set, multiple commits are rolled up into a single review as if diffed from the parent of the first revision to the last. The commit messages are concatenated in the summary field on Phabricator. phabsend will check obsstore and the above association to decide whether to update an existing Differential Revision, or create a new one. r^s(phabsend requires at least one changesetr_c3óBK—|]}|j«sŒ|–—Œy­wr<)Úobsolete)Ú.0Úcs rCÚ zphabsend..Wsèø€Ð +‘d�˜aŸj™j�lŒ1‘dùs‚˜s,obsolete commits cannot be posted for reviewcóÒ•—|D�cgc]}‰|j«‘Œ}}tjtd«|t j ‰|«fztd«¬«‚cc}w)Ns)cannot phabsend multiple %s revisions: %ss&the revisions must form a linear chain)Úhint)r7r rÉrrÚ nodesummaries)rIÚrevtypeÚrÚbadnodesrs €rCÚ_fail_nonlinear_revsz&phabsend.._fail_nonlinear_revs^scø€Ù,0Ó1©D q�D˜‘G—L‘L•N¨DˆÐ1Ü�k‰kÜ Ð:Ó ;Øœ×-Ñ-¨d°HÓ=Ð>ñ ?äÐ<Ó=ô ð ùò2s†A$s heads(%ld)r$sheads roots(%ld)srootrcscannot fold a single revisionscannot fold with --no-amendrs0cannot fold revisions with different DREV valuesr2r3sphabsend cancelledr`racó —d|zS)Ns blocking(%s)rx)Úphids rCrDzphabsend..žs €˜_¨tÒ3r8s reviewers.addr'Nssending rev %d::%d rssending rev %d ©NNNr(sobjectrr rOrMrrTrr³rrNr—ódifferential.queryóidss4(%ld::) - (%ld) - unstable() - obsolete() - public()ó.s'warning: not updating public commit %s )ÚparentsÚtextrÌrÚextras#updating local commit list for D%d s0local commit list for D%d is already up-to-date sno newnodes to update srestabilizing %s as %s snot restabilizing unchanged %s )Úfixphase)Drr�r»r½rÚrevrangeÚsortr rÉrrÚcheckunfinishedÚanyrIr r+r,r-rÐrGr7r©rºÚ_confirmbeforesendr±rKrRÚmaprŽrÍrJrCr!rr/Ú querydrevrWr"rùÚwlockÚlockÚ transactionr*r´Úget_amended_descrPÚp2ÚphaserÚpublicrLrÚformatchangeidrÚupdate_hash_refsr ÚmetadataonlyctxrÌrryÚcommitr\r0rr®rÚ cleanupnodesÚ setparents)4rRrrIrWrJr!rpÚheadsÚrootsÚfoldr8Ú drevmatchersr:rnÚoldmapÚconfirmÚ confirmedr7Ú reviewersÚblockersÚphidsÚdrevidsÚdiffmapÚ lastrevphidrDr6r3r5Ú oldbasediffÚ oldbaserevidrBrrRÚ newrevphidrSrCrhr5r>ÚrestackÚwnodeÚmappingr[rZr>Úoldrr=ÚnewdescrwÚnewr@s4 ` rCÚphabsendr¥s ø€ôh × Ñ  Ó %€DÜ �‹:˜Ÿ™ ¨Ó,Ñ ,€DÜ × Ñ ˜t TÓ *€D؇I�I„Ká Ü�k‰kœ!ÐGÓHÓIÐIØ ‡x�x�ÔÜ×Ñ Ô%á!%Ó &¡˜#ˆD�‹I €DÐ &ä Ñ +‘dÓ +Ô+Ü�k‰kœ!ÐKÓLÓMÐMô  ð �I‰I�m TÓ *€EÜ ˆ5ƒz�A‚~Ù˜U GÔ,à �I‰I�m TÓ *€EÜ ˆ5ƒz�A‚~Ù˜U GÔ,à �8‰8�GÓ €DÙ Ü ˆt‹9˜Š>ä—+‘+œaÐ @ÓAÓBÐ Bð�x‰x˜Ô!Ü—+‘+œaÐ >Ó?Ó@Ð @ñó á�ô (× .Ñ .¨s¯©Ó/@Õ AØð ð ô © Ó:©  1º�—‘˜•¨ Ñ:Ó ;¸aÒ ?Ü—+‘+ÜÐEÓFóð ô ˜t¹dÓ%C¹d¸ d¨1¡g§l¡l¥n¸dÑ%CÓ D€Fà�m‰m˜K¨Ó4€GØ Œt�D—H‘H˜ZÓ(Ó)Ñ)€GÙÜ& t¨T°6Ó:ˆ ÙÜ—+‘+œaÐ 5Ó6Ó7Ð 7à€GØ—‘˜ bÓ)€IØ�x‰x˜  BÓ'€HØ €EÙØ � ‰ ”Y˜tŸw™w¨ Ó2Ô3ÙØ � ‰ Ü Ù3ܘ$Ÿ'™' 8Ó,ó ô ñ  Ø�‰Ð!1¸UÑCÔDà€GØ€Gð€KÜˆÙ Ø �H‰HÐ,°·±³ ¸4À¹8¿<¹<»>Ð/JÑJÕ Kà �H‰HÐ(¨3¯7©7«9Ñ4Ô 5ð#)§*¡*¨S¯X©X«ZÐ9KÓ"Lш�˜%Ø18¸'À5 ,�[ˆ á Ø5;·Z±ZØ�R‘— ‘ “Ð!3ó6Ñ 2ˆK˜ lð �c—h‘h“jÒ  D§H¡H¨XÔ$6ä7Ù‘ 3 %ØØØØØØØ—‘˜Ó$ó ‰NˆH�dñÛ�CØ*.�G˜CŸH™H›JÒ'ñ ð'+�˜Ÿ™› Ñ#ä˜8 IÑ.¨uÑ5Ó6ˆHØ! )Ñ,¨WÑ5ˆJÙØ#‘à#�ñÜ/×6Ñ6°s·±Ó7HÓI�ÙœC §¡¨£ Ó.°(Ò:Ø$ xÑ/�GÜ—H‘HØØØŸ™› Ø $Ø!Ø!Ø"öô# 4§7¡7¨E°E©MÓ:¸1Ñ=¸gÑFˆJ؈H؈Fà�‰�xÔ Ø ˆ á Û�Ø—:‘:˜aŸf™f›hÐ(:Ó;¸AÒ>Ø'‘Fà'�FÜ& r¨1¨h¸Õ?ð ñ ä˜r 3¨°&Ö9ðWð\ ‡x�x�ÕØ�‰Ó ˆÜ˜BÐ 5¸ÀÐ7HÓIˆØ �Z‰Z�\˜4Ÿ9™9�;¨×(8Ñ(8¸Õ(Eð Ÿ™ØKØØôóñ�Aòðð ðð˜‘J—O‘OÓ%ˆE؈G؈Hà˜Q‘ZˆFä# DŸ/‘��3ؘ3‘i�ÙØ$ Q™Z�FÙ#(ÓD¡5˜a¬C°°%±«M¸VÓ,Cš 5ÑDÀQÑG�ä*¨4°°dÓ;�ð—O‘OÓ%¨Ò0Ø—v‘v“x—}‘}“¨'Ñ1Ø—v‘v“x—}‘}“¨'Ò1à—y‘y“{¤f§m¡mÒ3ØŸ™ÜÐIÓJÜ%×4Ñ4°SÓ9ñ:ôð!àŸ ™  C§F¡F£H§M¡M£O°c·f±f³h°[ÓAÀ!ÑDØŸ ™  C§F¡F£H§M¡M£O°c·f±f³h°[ÓAÀ!ÑDð�Gô*×:Ñ:ØØØó�Gô "×1Ñ1ØØØ 'Ø$Ø ŸX™X›ZØ ŸX™X›ZØ!Ÿi™i›kô�Cð"Ÿj™j›l�Gà+2¨)�G˜CŸH™H›JÑ'áð!Ÿ™¨Ô0Ù ä*ؘf w i°¸¿¹»Ñ1Dôð % v™o�GØ $§)¡)£+Ó-ÜŸ™Ø Ø#Ø ŸK™KØ$(Ø!%Ø!%Ø"&÷óð —O‘O C§H¡H£JÖ/ðM*ñT™Ø˜sŸx™x›zÑ*�ñ ¤# h£-´?À7Ó3KÒ"Kܘ2ÐFÈÑOÔPÜ*¨4°¸À4ÕH䨨LØ ñ!õñ Ü�rÐ5Ô6ô �à—K‘K §¡£§ ¡ £°#·&±&³(°Ó=¸aÑ@Ø—K‘K §¡£§ ¡ £°#·&±&³(°Ó=¸aÑ@ð�ô×-Ñ-ØØØ#Ü$×5Ñ5ؘcŸo™oÓ/°ó🙛؟™›ØŸ)™)›+ô �ðŸ*™*›,�ð˜cŸh™h›jÒ(Ø+2¨)�G˜CŸH™H›JÑ'ÜØØ3Ü  §¡£Ó,¬e°G«nÐ=ñ>öô ØØ;¼eÀCÇHÁHÃJÓ>OÑOöð;ôD × Ñ   w° ÀdÕ KØ˜ÑØ—‘ ¨¡¨qÑ 1Ô2÷m)FŸ;�\ˆ\ðùòI 'ùòZ ùò;ùò &Dùòhùò$E÷-)FÐ(EúŸ;˜;ú�\ˆ\ús�Â% lÆ,*l Ç!lÇ)lÈ.l ×l<×(l0×:l$Ø l ØAl$Ùl Ù0l Ù4Hl$á<*l$â(Il$ë,l0ë4l<ì l$ì$l- ì)l0ì0l9 ì5l<ì<m))rsUser)rsDate)rsBranch)rsNode ID)rsParent c ó¶—t|j«\}}|j}|D]’}||}|j|j«d«\}} } | r|j d| zd«} n|j t d«d«} |j t d«| tj||d«fz«Œ”|jt d«|z«ryy ) Nrsrr7sNEWs%s - %s r2s1Send the above changes to %s (Y/n)?$$ &Yes $$ &NoFT) rÒrRr½r7rPrr«rrQÚ promptchoice) rrIr“rrÏrRrJr8rDr6rZrUs rCrr¢sрܘdŸg™gÓ&�J€CˆØ �‰€BÛˆØ�3‰iˆØ#)§:¡:¨c¯h©h«jÐ:LÓ#MÑ ˆ�˜&Ù Ø—x‘x ¨¡Ð1DÓE‰Hà—x‘x¤ &£ Ð+>Ó?ˆHà �‰Ü ˆl‹OàÜ×0Ñ0°°S¸+ÓFðñ õ ðð  ‡�Ü Ð >Ó?À#ÑEôðà r8>óclosedóacceptedó abandonedó needsreviewó needsrevisionóchangesplannedcóH—|djdd«j«S)z7get normalized status name from a Differential Revisionó statusNamerEr8)rrF)r=s rCÚ_getstatusnamer°Çs#€à � Ñ × &Ñ & t¨SÓ 1× 7Ñ 7Ó 9Ð9r8)r(N)ógroupr$ó)NN)r_N)ó ancestorsr_NN)r\NN)óand_r\N)r[NN)óaddr[N)r[NN)ósubr[N)rNNNN)rósymbolNNN)ó(ó:ó&ó+ó-r²r·óendc #óL‡K—t|«}dŠd}t|«}||krydjtjˆfd„t j ||d«««}|rd||f–—|t|«z }n|||dzdk7r |||dzd|f–—|dz }||krŒydd|f–—y­w) Ns():+-& rr8có •—|‰vSr<rx)ÚchÚspecials €rCrDz_tokenize..äs ø€˜2 WÑ,r8r·r$rEr½)Ú memoryviewr rMÚ itertoolsÚ takewhilerÚ iterbytestr)rxÚviewÚposÚlengthÚsymbolrÁs @rCÚ _tokenizerÊÜsÉøèø€Ü �dÓ €DØ€GØ €CÜ �‹Y€FØ �Š,Ø—‘Ü × Ñ Û,¬h×.BÑ.BÀ4ÈÈÀ:Ó.Nó ó ˆñ ؘf cÐ*Ò *Ø ”3�v“;Ñ ‰Cà�C˜# ™'Ð" dÒ*ؘC #¨¡'Ð*¨D°#Ð6Ò6Ø �1‰HˆCð �‹,ð �4˜Ð Óùs ƒBB$ÂB$có¶—tjt«jt|««\}}|t |«k7rt j d|«‚|S)Ns invalid token)rÚ _elementsÚparserÊr r Ú ParseError)rxÚtreerÇs rCÚ_parserÐñsH€Ü— ‘ œiÓ(×.Ñ.¬y¸«Ó?�I€Dˆ#Ø Œc�$‹iÒÜ×ÑÐ/°Ó5Ð5Ø €Kr8cóž—|jd«r!|ddj«rt|dd«S|j«r t|«Sy)z int or None, ex. 'D45' -> 45; '12' -> 12; 'x' -> NoneóDr$N)rfÚisdigitr!)rÉs rCÚ _parsedrevrÔøsJ€à ×јԠ6¨!¨" :×#5Ñ#5Ô#7Ü�6˜!˜"�:‹ÐØ ‡~�~ÔÜ�6‹{Ððr8cóž—t«}t«}|d}|dk(r%t|d«}|r|j|«||fS|dk(rHt|d«\}}|j |«|j |«|j |«||fS|ddD]2}t|«\}}|j |«|j |«Œ4||fS)z9return ({single-drev-id}, {ancestor-drev-id}) to prefetchrr·r$r³N)r*rÔÚaddÚ_prefetchdrevsÚupdate)rÏr>Ú ancestordrevsÚoprnÚaÚts rCr×r×s߀ä ‹E€EÜ“E€MØ ˆa‰€BØ ˆY‚Ü �t˜A‘wÓ ˆÙ Ø �I‰I�aŒLð �-Ð Ðð ˆ|Ò Ü˜d 1™gÓ&‰ˆˆ1Ø � ‰ �QŒØ×јQÔØ×јQÔð �-Ð Ðð �a�b“ˆAÜ! !Ó$‰DˆAˆqØ �L‰L˜ŒOØ × Ñ  Õ #ðð �-Ð Ðr8c ó̇‡‡ ‡ ‡ ‡ —ˆ ˆfd„Šˆfd„Š iŠ t|«}t|«\}}‰jdd«}t|«}|D]-}|j t t d||z «|dz««Œ/|r‰dt|«i«tt‰ t|«««t|«z«Š ˆ ˆ ˆ ˆ fd„Š ‰ |«D�cgc]}‰ |‘Œ c}Scc}w)aòreturn a list of "Differential Revision" dicts spec is a string using a simple query language, see docstring in phabread for details. A "Differential Revision dict" looks like: { "activeDiffPHID": "PHID-DIFF-xoqnjkobbm6k4dk6hi72", "authorPHID": "PHID-USER-tv3ohwc4v4jeu34otlye", "auxiliary": { "phabricator:depends-on": [ "PHID-DREV-gbapp366kutjebt7agcd" ] "phabricator:projects": [], }, "branch": "default", "ccs": [], "commits": [], "dateCreated": "1499181406", "dateModified": "1499182103", "diffs": [ "3", "4", ], "hashes": [], "id": "2", "lineCount": "2", "phid": "PHID-DREV-672qvysjcczopag46qty", "properties": {}, "repositoryPHID": "PHID-REPO-hub2hx62ieuqeheznasv", "reviewers": [], "sourcePath": null "status": "0", "statusName": "Needs Review", "summary": "", "testPlan": "", "title": "example", "uri": "https://phab.example.com/D2", } có•—|jd«xs|jd«xsdgd}|‰vr‰|St‰d|«}|D]}|‰|d<|‰t|d«<Œ|‰vr!tjt d«|z«‚‰|S) zparams -> single drev or NoneruóphidsNrrtr rs#cannot get Differential Revision %r)r½rùr!r rÉr)rÅrlr>r=Ú prefetchedrRs €€rCÚfetchzquerydrev..fetchDs¬ø€à�z‰z˜&Ó!ÒC V§Z¡Z°Ó%9ÒC¸d¸VÀQÑGˆØ �*Ñ Ø˜c‘?Ð "ܘBÐ 5°vÓ>ˆãˆDØ(,ˆJ�t˜G‘}Ñ %Ø+/ˆJ”s˜4 ™;Ó'Ò (ðð �jÑ Ü—+‘+ÜÐ8Ó9¸FÑBóð ð˜#‰Ðr8c󾕗t«}g}|D�cgc]}d|gi‘Œ }}|r“|j«}‰ |«}|d|vrŒ"|j|d«|jt |d««|j di«}|j dg«}|D]} |jd| gi«Œ|rŒ“|j «tj|«Scc}w)z6given a top, get a stack from the bottom, [id] -> [id]rurs auxiliarysphabricator:depends-onrß) r*r…rÖrŽr!r½ÚreverserÚbaseset) Ú topdrevidsÚvisitedrXr>ÚqueuerÅr=Ú auxiliaryÚdependsrrrás €rCÚgetstackzquerydrev..getstackTsÙø€ä“%ˆØˆÙ(2Ó3©  1�&˜1˜#’¨ ˆÐ3ÙØ—Y‘Y“[ˆFÙ˜“=ˆDØ�E‰{˜gÑ%ØØ �K‰K˜˜U™ Ô $Ø �M‰Mœ#˜d 5™kÓ*Ô +ØŸ™ ¨rÓ2ˆIØ—m‘mÐ$=¸rÓBˆGÛ�Ø— ‘ ˜h¨¨Ð/Õ0ð òð �‰ÔÜ×Ñ Ó'Ð'ùò4s’ Cr&r'r$rucó2•—|d}|dk(r�t|d«}|rtj|g«S|dtvr8‰D�cgc]}t ‰|«|dk(r|‘Œ}}tj|«St j td«|dz«‚|dvr9t|«dk(sJ‚tt|«‰|d«‰|d««S|dk(r ‰|d«S|d k(r‰‰|d««St jd |z«‚cc}w) Nrr·r$sunknown symbol: %s>rµr¶r´rZr—r±r³sillegal tree: %r) rÔrräÚ_knownstatusnamesr°r rÉrr rÚoperatorÚProgrammingError) rÏrÚr=rnr>rêràÚvalididsÚwalks €€€€rCrðzquerydrev..walkys7ø€Ø �!‰WˆØ �Š?ܘd 1™gÓ&ˆDÙÜ×'Ñ'¨¨Ó/Ð/Ø�a‘Ô-Ñ-ñ&óá%˜Ü% j°¡mÓ4¸¸Q¹Ò?òØ%ððô  ×'Ñ'¨Ó.Ð.ä—k‘k¤!Ð$9Ó":¸TÀ!¹WÑ"DÓEÐEØ Ð,Ñ ,Ü�t“9 ’>Ð !�>Ø(”7œ8 RÓ(©¨d°1©g«¹¸TÀ!¹W» ÓFÐ FØ �8Š^Ù˜˜Q™“=Ð Ø �<Ò Ù™D  a¡›MÓ*Ð *ä×(Ñ(Ð)<¸tÑ)CÓDÐ Dùò!sÁD) rÐr×râr*rØrår1r»r3) rRr£rÏr>rÙÚ batchsizeÚtofetchrnrárêràrïrðs ` @@@@@rCr�r�sÔý€õ\ô (ð(€Jä �$‹<€DÜ)¨$Ó/Ñ€Eˆ=ð— ‘ ˜^¨\Ó:€Iô�%‹j€GÛ ˆØ�‰”uœS  A¨ ¡MÓ2°A¸±EÓ:Õ;ðá Ù ˆv”t˜G“}Ð%Ô&Ü”c™(¤4¨ Ó#6Ó7Ó8¼3¸u»:ÑEÓF€H÷Eñ2$(¨¤:Ó .¡:˜aˆJ�q‹M :Ñ .Ð.ùÒ .sà C!c ó´—|d}|dj«}|dj«}|rd|z}d|dz}djtd||||g««S) zÌget description (commit message) from "Differential Revision" This is similar to differential.getcommitmessage API. But we only care about limited fields: title, summary, test plan, and URL. r)r*r+s Test Plan: %sóDifferential Revision: %sóurir-N)r1rMr2)r=ÚtitlerVÚtestplanras rCÚgetdescfromdrevrø•sm€ð �‰N€EØ�:Ñ×%Ñ%Ó'€GØ�KÑ ×'Ñ'Ó)€HÙØ$ xÑ/ˆØ &¨¨f©Ñ 5€CØ �<‰<œ˜t e¨W°hÀÐ%DÓEÓ FÐFr8có—|s t|«Sd|dz}tj|j««}|s!dj |j«|g«Stj ||j««S)a1similar to ``getdescfromdrev``, but supports a folded series of commits This is used when determining if an individual commit needs to have its message amended after posting it for review. The determination is made for each individual commit, even when they were folded into one review. rôrõr-)rør+r,r-rMrs)r=r8Úfoldedrar:s rCr…r…¤sq€ñ ܘtÓ$Ð$à &¨¨f©Ñ 5€Cô $×*Ñ*¨3¯?©?Ó+<Ó=€AÙ Ø�|‰|˜SŸ_™_Ó.°Ð4Ó5Ð5ä &× *Ñ *¨3°·±Ó0AÓ BÐBr8có—|jd«xsi}|jd«xsi}t|«dkDr'|j«D�chc] }t|«’Œc}Stt |«jdd««xsdhScc}w)zkget the set of local commits from a diff object See ``getdiffmeta()`` for an example diff object. ó propertiesrr$rr8N)r½r r~rÚ getdiffmeta)rÚpropsr$rhs rCrr¿s‚€ð �H‰H�]Ó #Ò ) r€EØ�i‰iÐ(Ó)Ò/¨R€GÜ ˆ7ƒ|�aÒØ '§ ¡ ¤Ó/¡˜1”�A• Ñ/Ð/ô ” ˜DÓ!×%Ñ% g¨sÓ3Ó 4Ò <¸Ð =Ð=ùò 0sÁ B cót—|jd«xsi}|jd«}|sÂ|jd«r¯t|dj««d}i}d|vrd|vrd|d|dfz|d<d |vrd t|d «z|d <d |vr|d |d <|jd |jd««}|r||d<t |jdd««dk\r|dd|d<ni}d |vrd|vr d|dz|d <d |vr|jd «r|d |d <d|vr|jd«r|d|d<|S)aÅget commit metadata (date, node, user, p1) from a diff object The metadata could be "hg:meta", sent by phabsend, like: "properties": { "hg:meta": { "branch": "default", "date": "1499571514 25200", "node": "98c08acae292b2faf60a279b4189beb6cff1414d", "user": "Foo Bar ", "parent": "6d0abad76b30e4724a37ab8721d630394070fe16" } } Or converted from "local:commits", sent by "arc", like: "properties": { "local:commits": { "98c08acae292b2faf60a279b4189beb6cff1414d": { "author": "Foo Bar", "authorEmail": "foo@example.com" "branch": "default", "commit": "98c08acae292b2faf60a279b4189beb6cff1414d", "local": "1000", "message": "...", "parents": ["6d0abad76b30e4724a37ab8721d630394070fe16"], "rev": "98c08acae292b2faf60a279b4189beb6cff1414d", "summary": "...", "tag": "", "time": 1499546314, } } } Note: metadata extracted from "local:commits" will lose time zone information. rürrrrrs%s <%s>rrs%d 0rrrr^rrrxr$rs dateCreateds%s 0ssourceControlBaseRevision)r½r3r.r!r )rrþÚmetarŒr7s rCrýrýÎs�€ðL �H‰H�]Ó #Ò ) r€EØ �9‰9�ZÓ €DÙ Ø �9‰9Ð%Ô &ܘEÐ"2Ñ3×:Ñ:Ó<Ó=¸aÑ@ˆF؈DؘFÑ" ~¸Ñ'?Ø *ؘ9Ñ%ؘ>Ñ*ð.ñ!��W‘ ð˜&Ñ Ø '¬#¨f°W©oÓ*>Ñ >��W‘ ؘFÑ"Ø"(¨Ñ"3��Y‘Ø—:‘:˜i¨¯©°FÓ);Ó<ˆDÙØ $��W‘ Ü�6—:‘:˜j¨"Ó-Ó.°!Ò3Ø"(¨Ñ"4°QÑ"7��Y’àˆDØ�dј~°Ñ5Ø $ ~Ñ"6Ñ6ˆˆW‰ ؘѠ§¡¨)Ô!4ؘy™/ˆˆY‰Ø˜Ñ §¡Ð*FÔ!GØÐ;Ñ<ˆˆY‰Ø €Kr8cóЇ—t|«dkDr:ˆfd„}djtj||««}t ||«}|r|St j td««‚)z‡convert user supplied DREVSPECs into "Differential Revision" dicts See ``hg help phabread`` for how to specify each DREVSPEC. rcó•—‰rd|z}d|zS)Ns:(%s)s(%s)rx)rÚstacks €rCÚ _formatspecz_getdrevs.._formatspecsø€Ùؘq‘L�ؘQ‘;Ð r8r»sempty DREVSPEC set)r rMrÚmaplistr�r rÉr)rRrÚspecsrr£r>s ` rCÚ _getdrevsrs[ø€ô  ˆ5ƒz�A‚~ô ð �y‰yœ×)Ñ)¨+°uÓ=Ó>ˆä˜"˜dÓ#ˆÙ ؈Lä �+‰+”aÐ-Ó.Ó /Ð/r8c ó —t|D�chc]}td„|dD««’Œc}«}t|dd|i«}g}|D]´}|jt d«|dz«td„|dD««}t|dd |i«}t |«} d } t |d |z«} tj«D]} | | vsŒ| d t| | | fzz } Œd | | |fz} |j|d| f«Œ¶||«ycc}w)a/generate plain-text patch readable by 'hg import' write takes a list of (DREV, bytes), where DREV is the differential number (as bytes, without the "D" prefix) and the bytes are the text of a patch to be imported. drevs is what "querydrev" returns, results of "differential.query". c3ó2K—|]}t|«–—Œy­wr<r ©rgr·s rCrizreadpatch..1sèø€Ð9©. Qœ#˜aŸ&©.ùó‚sdiffsrrus reading D%s rc3ó2K—|]}t|«–—Œy­wr<r r s rCrizreadpatch..:sèø€Ð4¡^ ”S˜—V¡^ùr sdifferential.getrawdiffsdiffIDs# HG changeset patch r³s# %s %s s%s%s %sN) r3r1rùÚnoterrørýÚ _metanamemapr~rŽ)rRr>r«r=ÚdiffidsrAÚpatchesr"rer@rºrr¶Úcontents rCÚ readpatchr(s%€ôÁeÓLÁe¸d”cÑ9¨$¨xª.Ó9Õ9ÀeÑLÓM€GÜ ˜Ð6¸ÀÐ8IÓ J€Eà€GóˆØ �‰”Ð"Ó# d¨5¡kÑ1Ô2äÑ4 T¨(¢^Ó4Ó4ˆÜ˜2Ð9¸IÀvÐ;NÓOˆÜ˜tÓ$ˆØ*ˆô ˜5 ¨¡Ñ0Ó1ˆÜ×"Ñ"Ö$ˆAØ�DŠyؘ,¬,°q©/¸4À¹7Ð)CÑCÑC‘ð%𠨨tÐ 4Ñ4ˆØ�‰˜˜U™  WÐ-Õ.ð#ñ( ˆ'…Nùò5MsŠDsphabreadóstacksread dependenciessDREVSPEC... [OPTIONS]r™c󌇗tj|«}t‰|jd«|«}ˆfd„}t ‰||«y)aprint patches from Phabricator suitable for importing DREVSPEC could be a Differential Revision identity, like ``D123``, or just the number ``123``. It could also have common operators like ``+``, ``-``, ``&``, ``(``, ``)`` for complex queries. Prefix ``:`` could be used to select a stack. If multiple DREVSPEC values are given, the result is the union of each individually evaluated value. No attempt is currently made to reorder the values to run from parent to child. ``abandoned``, ``accepted``, ``closed``, ``needsreview``, ``needsrevision`` could be used to filter patches by status. For performance reason, they only represent a subset of non-status selections and cannot be used alone. For example, ``:D6+8-(2+D4)`` selects a stack up to D6, plus D8 and exclude D2 and D4. ``:D9 & needsreview`` selects "Needs Review" revisions in a stack up to D9. If --stack is given, follow dependencies information and read all patches. It is equivalent to the ``:`` operator. rcó<•—|D]\}}‰j|«Œyr<)r«)rr=rrRs €rCÚ_writezphabread.._writemsø€Û$‰MˆD�'Ø �H‰H�WÕ ñ%r8N)rr�rr½r)rRrrrWr>rs` rCÚphabreadrNs?ø€ô8 × Ñ  Ó %€DÜ �b˜$Ÿ(™( 8Ó,¨eÓ 4€Eôôˆb�%˜Õ r8simport dependencies as wellcó,‡‡‡—tj‰«Šd‰d<d‰d<d‰d<d‰d<‰jd d «rd‰d <‰jd d«rd‰d<ˆˆˆfd „}t‰‰j d «|«}t ‰j ||«y )zãimport patches from Phabricator for the specified Differential Revisions The patches are read and applied starting at the parent of the working directory. See ``hg help phabread`` for how to specify DREVSPEC. Tsbypassr$sstripr8sprefixFr6r4r5có�•—‰ dj«}‰ j«5‰ j«5‰ jd«5|D]°\}}‰ j t d«|z«t j‰ tj|««5}tj‰ ‰ ||‰gd«\}}}|s!tjt d«|z«‚‰ j|dz«‰ |g}ddd«Œ² ddd«ddd«ddd«y#1swYŒÖxYw#1swYŒ&xYw#1swYŒ*xYw#1swYyxYw)Nr4sapplying patch from D%s sD%s: no diffs foundó )rwr‚rƒr„r rrÚextractÚioÚBytesIOrÚ tryimportoner rÉr ) rrwr=ÚcontentsÚ patchdatar¬r7ÚrejrWrrRs €€€rCrzphabimport.._write”sø€Ø�t‘*×$Ñ$Ó&ˆà �Z‰Z�\˜4Ÿ9™9�;¨×(8Ñ(8¸Õ(GÛ")‘��hØ— ‘ œ!Ð8Ó9¸DÑ@ÔAä—]‘] 2¤r§z¡z°(Ó';Ô<À Ü%,×%9Ñ%9ØØØ!ØØØØó&‘N�C˜˜sñ Ü#Ÿk™k¬!Ð,BÓ*CÀdÑ*JÓKÐKà—G‘G˜C %™KÔ(Ø# D™z˜l�G÷=Ð<ñ#*÷)HŸ;�\ˆ\÷=Ð<ú÷ )HÐ(GúŸ;˜;ú�\ˆ\úsT¥D<¶D0ÁAD$ÂAD Ã4 D$Ã?D0ÄD<ÄD!ÄD$Ä$D- Ä)D0Ä0D9 Ä5D<Ä<ErN)rr�r©rr½rrR)rRrrrWrr>s`` ` rCÚ phabimportr"ts›ú€ô × Ñ  Ó %€Dð €Dˆ�Oð€Dˆ�NØ€Dˆ�Oà€DˆÑà ‡}�}�] IÔ.؈ˆY‰Ø ‡}�}�] KÔ0Ø ˆˆ[Ñö+ô0 �b˜$Ÿ(™( 8Ó,¨eÓ 4€Eä ˆd�g‰g�u˜fÕ%r8s phabupdateóacceptsaccept revisionsórejectsreject revisionsórequest-reviewsrequest review on revisionsóabandonsabandon revisionsóreclaimsreclaim revisionsóclosesclose revisionsóreopensreopen revisionsó plan-changessplan changes for revisionsóresigns#resign as a reviewer from revisionsó commandeerscommandeer revisionsscomment on the last revisionslocal revision to updates"[DREVSPEC...| -r REV...] [OPTIONS]c ó<—tj|«}gd¢}|D�cgc]&}|j|jdd««sŒ%|‘Œ(}}t |«dkDr0t j td«dj|«z«‚g}|D]}|j|ddœ«Œ|jd «} | rß|st jtd ««‚|rt jtd ««‚t|tj|| g««} g}g} | j«D]0\} } | €| j|| «Œ|jd | z«Œ2| r5t jtd«tj || «z«‚t#||jd«|«}t%|«D]V\}}|dzt |«k(r(|jd«r|jd|ddœ«|sŒB|d|dœ}t'|d|«ŒXy cc}w)zrupdate Differential Revision in batch DREVSPEC selects revisions. See :hg:`help phabread` for its usage. ) r&r#r(r,r*r'r$r)r%r+r¼ó_r$s%s cannot be used togethers, Tr'r^s--rev requires a repositorys&cannot specify both DREVSPEC and --revNrs-selected revisions without a Differential: %srr(r )r/r.r0)rr�r½rr r rÉrrMrŽÚ InputErrorrKrr{r¹rrlrr´rù)rRrrrWr<rr¦r7ÚfrIÚdrevmapÚunknownrnrr>r>r=rÅs rCÚ phabupdater3±sö€ô2 × Ñ  Ó %€Dò €Lñ%Ó H™ �1¨¯©°·±¸4ÀÓ1FÕ(GŠQ˜ €EÐ HÜ ˆ5ƒz�A‚~Ü�k‰kœ!Ð9Ó:¸U¿Z¹ZÈÓ=NÑNÓOÐOà€GÛ ˆØ�‰ ¨dÑ3Õ4ðð �8‰8�FÓ €DÙ ÙÜ×"Ñ"¤1Ð%CÓ#DÓEÐ Eá Ü×"Ñ"¤1Ð%NÓ#OÓPÐ Pä˜T¤:×#6Ñ#6°t¸d¸VÓ#DÓEˆØˆØˆØ—M‘M–O‰DˆAˆq؈yØ—‘˜t A™wÕ'à— ‘ ˜V a™ZÕ(ð $ñ Ü×"Ñ"ÜÐBÓCÜ×'Ñ'¨¨gÓ6ñ7óð ô �b˜$Ÿ(™( 8Ó,¨eÓ 4€EܘUÖ#‰ˆˆ4Ø ˆq‰5”C˜“JÒ  4§8¡8¨JÔ#7Ø �N‰N Z¸4À Ñ;KÑLÔ MÚ à%)¨'¡]Ø!(ñˆFô ˜Ð9¸6Õ Bñ$ùò? Is ž&HÁHs phabreviewóctx)Úrequirescó6—|j|d«}tj|j««}|r9t j |j d«d|j d«zdœ«S|j«j|j««}|D]v}tj|«sŒ|j«jjdd«}|jd«s|dz }||z }t j ||dœ«cSy ) ze:phabreview: Object describing the review for this changeset. Has attributes `url` and `id`. r4rsD%sr)r1rr&r1rÔN)Úresourcer+r,r-rÚ hybriddictrÐrr(r7r)rrRrÈrg)r r¡r8r:rrÜrs rCÚtemplate_reviewr9 sø€ð ˆ'× Ñ ˜7 FÓ +€CÜ#×*Ñ*¨3¯?©?Ó+<Ó=€AÙÜ×&Ñ&àŸ™ ›Ø §¡¨£ Ñ-ñ ó ð ð�x‰x‹z×"Ñ" 3§8¡8£:Ó.ˆÛˆAÜ)×/Ñ/°Õ2Ø—h‘h“j—m‘m×*Ñ*¨>¸6ÓB�Ø—|‘| DÔ)ؘ4‘K�CØ�q‘�ä#×.Ñ.à #Ø ñóòðð r8s phabstatus>óuir4órepocóf—|j|d«}|j|d«}|j|d«}|j«} t||g«|}t |dd|gi«}|D]3}t |d«|k(sŒt j|d|d d œ«cSy#t$rYywxYw) z8:phabstatus: String. Status of Phabricator differential.r4r;r:Nrtrurrõr¯)r1sstatus)r7rJrKÚKeyErrorrùr!rr8) r r¡r8rrRrJrZr>r=s rCÚtemplate_statusr>! sÖ€ð ˆ'× Ñ ˜7 FÓ +€CØ ˆ7× Ñ ˜G WÓ -€DØ ˆ× Ñ ˜' 5Ó )€Bà �'‰'‹)€CðܘD 3 %Ó(¨Ñ-ˆô ˜Ð1°F¸V¸HÐ3EÓ F€EÛˆÜ ˆt�E‰{Ó ˜vÓ %Ü×*Ñ*à  ™LØ# MÑ2ñóò ðð øô òÙðúsÁ B$Â$ B0Â/B0swork)Ú csettopicc óÀ‡‡—|jd«}t||«}gt«i}}}|j«D]S\}} | �;|j | «|j | t««j |«ŒC|j |«ŒUt‰ddt|«i«} iŠ| D]} |t| d«D]}| ‰|<Œ Œˆˆfd„} |tj|«z}tj||«} ‰jddd «| |_t!j"||«}t%j&‰|| |tj(d |i¬ «y) z Phabricator differiential statuszsort(_underway(), topo)Nrtrurcó •—‰|j«}‰jd|zdt|«z«}‰jd|d|fz«y)Ns%(statusName)ssphabricator.status.%ss %s %s rõ)rJrPr°r«)r8r=r Ú drevsbyrevrRs €€rCÚ phabstatusz&phabstatusshowview..phabstatusL sRø€Ø˜#Ÿ'™'›)Ñ$ˆØ—‘Ø  Ñ $Ø $¤~°dÓ';Ñ ;ó ˆð �‰�  f¡¨vÐ 6Ñ6Õ7r8s experimentals graphshortenTsnodelen)rþ)rIrKr*r¹rÖÚ setdefaultrŽrùr»r!rrärÚ dagwalkerr Ú_exthookr%ÚlongestshortestrÚ displaygraphÚ asciiedges)rRrÚ displayerrIr1Ú unknownrevsr™Ú revsbydrevidrJrZr>r=rCÚrevdagÚnodelenrBs` @rCÚphabstatusshowviewrO9 sMù€ð �9‰9Ð.Ó /€Dܘ˜tÓ$€GØ)+¬S«U°B˜,�€KØ—}‘}–‰ ˆˆVØ Ð Ø �K‰K˜Ô Ø × #Ñ # F¬C«EÓ 2× 6Ñ 6°sÕ ;à × Ñ ˜sÕ #ð 'ô ˜Ð1°F¼DÀ»MÐ3JÓ K€EØ€Jۈؤ D¨¡KÓ 0Ô1ˆCØ"ˆJ�sŠOñ2ðõ8ð ŒH× Ñ ˜[Ó )Ñ)€DÜ × Ñ   dÓ +€Fà‡L�L� /°4Ô8Ø#€IÔÜ×"Ñ" 4¨Ó.€GÜ×ÑØ Ø ØØÜ×ÑØ˜7Ð#ö r8)NF)NNNNNNN)‚ržrÊrærØrrÃr~rârírrrëÚmercurial.noderrÚmercurial.i18nrÚmercurial.pycompatrÚmercurial.thirdpartyrÚ mercurialrr r r r r rrrÊrrrrrrrrrrrrrrrrr�r Úmercurial.utilsr!r"r#rqr%Ú testedwithÚehÚcmdtablerŸÚ configtableÚtemplatekeywordÚ finaluisetupÚuisetupÚ configitemÚ colortabler¥Ú wrapfunctionr\r§r®rÆrÒrùrrÚcompiler)ÚMr+rGrKrWrYrkrr¼rpr{ršrÂrÒrßrçrérñrïrõrúrrr%rCrKrWr\ÚCATEGORY_IMPORT_EXPORTr¥rOrrrìr°rÌrÊrÐrÔr×r�rør…rrýrrrr"r3r9r>ÚshowviewrOrxr8rCÚrdsðñ3ólÛÛÛ ÛÛ ÛÛÛ Û ç%ÝÝ&Ý%÷÷÷÷÷÷õ÷6ñõ ð#€ à€Y×ÑÓ€à �;‰;€Ø �*‰*€Ø�n‰n€ Ø×$Ñ$€Ø �/‰/€ð‡ � ØØØ ðôð ‡ � ØØØ ðôð ‡ � ØØØ ðôð ‡ � ØØ Ø ðôð ‡ � ØØØ ðôð ‡ � ØØ Ø ðôð ‡ � ØØØ ðôð ‡ � ØØ Ø ðôð ‡ � ØØØ ðôð ‡ � ØØ Ø ðôð ‡ � ØØØ ðôð$,Ø#-Ø#-Ø Ø%3Ø$1Ø"*Ø'0Ø)/Ø*0ñ € ð ØØ Ù ð ó ð ð € ð‡��˜JÓ'ñ!ó(ð!óHQòh  ò0ò<ò<9ñx Ð  ¡Q y£\ÀÔEñ/óFð/ò,ð*(˜RŸZ™ZÐ(>Ó?ÐØ(˜bŸj™jØFÈÏÉóÐò |ò~ò.÷ñ÷ñð ‡�ô "ˆtó "óð "ð‡�÷%'ð%'óð%'ðP‡�÷ ð óð ò6 ò<ò6"òJ'ò2 2ð )°)Ñ <€ò ò !ò!ò4P%òfò>*Lð^ ØØØ Ø Ø Ø óuòp.ò"Eò&Lñ& Øà ˆv�r™1Ð1Ó2±A°f³IÐ>Ø ˆh˜™aÐ 9Ó:Ð;Ø ˆk˜2™qÐ!5Ó6Ð7Ø ˆj˜"™aÐ =Ó>Ð?à Ø Ø Ù ÐBÓ Cð  ð ˆj˜$¡Ð"HÓ IÐJØ ˆg�u™aÐ HÓIÐJð ñÐÓØ×/Ñ/ô#ñ&h3ó'ð&h3ðZ ˆt�}‰}òó€ òò6Ðò:ð 6Ø 2Ø -Ø ,Ø ,Ø %Ø/Ø 'ñ € òò*òò ò,|/ò~ GòCò6 >òBòJ0ò*#ñL ØØ ˆ8�U™AÐ2Ó3Ð4Ð5ÙÐÓØ×/Ñ/Øô ñ!óð!ñ> ØØ ˆ8�U™AÐ<Ó=Ð>Ð?ÙÐÓØ×/Ñ/ô ñ 4&ó ð 4&ñn Øà ˆi˜¡Ð"5Ó 6Ð7Ø ˆi˜¡Ð"5Ó 6Ð7Ø Ð ©Ð*HÓ(IÐJØ ˆj˜%¡Ð#7Ó!8Ð9Ø ˆj˜%¡Ð#7Ó!8Ð9Ø ˆh˜™qÐ!3Ó4Ð5Ø ˆi˜¡Ð"5Ó 6Ð7Ø ˆo˜u¡aÐ(EÓ&FÐGØ ˆi˜¡Ð"HÓ IÐJØ ˆm˜U¡AÐ&=Ó$>Ð?Ø ˆz˜3¡Ð"AÓ BÐCØ ˆv�s™AÐ9Ó:¹A¸f»IÐFð ñÐ+Ó,Ø×/Ñ/Øô%ñ(9Có)ð(9Cðx×Ñ�M¨V¨HÐÓ5ñó6ðð>×Ñ�MÒ,DÐÓEñóFðð.€‡‚ˆ}¨Ô0ñ'ó1ñ'r8