Ë ŸïlO¥±ãóV—ddlZddlZddlZddlZddlZddlZddlZddlmZddl m Z ddl m Z ddl mZmZmZmZmZmZmZmZmZddlmZmZddlmZej>d «Z Gd „d ej.«Z!Gd „d e!«Z"Gd„dejF«Z$Gd„d«Z%d„Z&Gd„dejNjP«Z)Gd„d«Z*Gd„d«Z+Gd„d«Z,Gd„d«Z-e*e*e+e,e-dœZ.d„Z/d„Z0d%d „Z1Gd!„d"ejd«Z3Gd#„d$ejh«Z5y)&éN)Ú_)Úgetattr)Úhex) ÚencodingÚerrorÚhttpconnectionÚpathutilÚpycompatÚurlÚutilÚvfsÚworker)Ú stringutilÚurlutilé)Úlfutils\A[a-f0-9]{64}\Zcó&‡—eZdZˆfd„Zdd„ZˆxZS)Úlfsvfscó’•—tj|«stjd|z«‚tt |�|dd|dd«S)z9split the path at first two characters, like: XX/XXXXX...sunexpected lfs path: %srrN)Ú_lfsreÚmatchrÚProgrammingErrorÚsuperrÚjoin)ÚselfÚpathÚ __class__s €ú7usr/lib/python3.12/site-packages/hgext/lfs/blobstore.pyrz lfsvfs.join-sFø€ä�|‰|˜DÔ!Ü×(Ñ(Ð)CÀdÑ)JÓKÐ KÜ”V˜TÑ'¨¨Q¨q¨ °4¸¸°8Ó<Ð<óc #óÐK—tjj|j«}t t j |««}g}tj|j|j|xsd«|¬«D]U\}}}||d}t |«dk(sŒ|j|D� cgc] } tj|| z«sŒ|| z‘Œ"c} «ŒWdg|f–—ycc} w­w)zˆYield (dirpath, [], oids) tuple for blobs under path Oids only exist in the root of this vfs, so dirpath is always ''. r)ÚonerrorNr) ÚosrÚnormpathÚbaseÚlenr Ú normasprefixÚwalkÚreljoinÚextendrr) rrr!ÚrootÚ prefixlenÚoidsÚdirpathÚdirsÚfilesÚfs rr'z lfsvfs.walk3sÏèø€ô �w‰w×Ñ § ¡ Ó*ˆôœ×-Ñ-¨dÓ3Ó4ˆ ؈ä$&§G¡GØ �L‰L˜Ÿ™ D¢K¨CÓ 0¸'÷% Ñ ˆG�T˜5ð˜i˜jÐ)ˆGô�7‹|˜qÓ Ø— ‘ Ù*/ÓM©% Q´6·<±<ÀÈ!Á Õ3L�W˜q“[¨%ÑMõð% ð�B˜ˆoÓùòNùs‚BC&ÂC&Â+C! à C! ÃC&©NN)Ú__name__Ú __module__Ú __qualname__rr'Ú __classcell__©rs@rrr,s ø„ô=÷ rrcó,—eZdZd„Zd„Zd„Zdd„Zd„Zy)Únullvfscó—y©N©©rs rÚ__init__znullvfs.__init__Mó€Ø rcó—y)NFr;©rÚoids rÚexistsznullvfs.existsPs€Ørcób—ttjtjd|z««‚)Ns%s: No such file or directory)ÚIOErrorÚerrnoÚENOENTr Úsysstrr@s rÚreadz nullvfs.readSs*€ô Ü �L‰LÜ �O‰OÐ<¸sÑBÓ Có ð rNcó —dggfS)Nrr;)rrr!s rr'z nullvfs.walk]s€Ø�R˜ˆ}Ðrcó—yr:r;)rrAÚdatas rÚwritez nullvfs.write`r>rr1)r2r3r4r=rBrHr'rLr;rrr8r8Ls„ò òò óó rr8có(‡—eZdZdZˆfd„Zd„ZˆxZS)Ú lfsuploadfilez+a file-like object that supports keepalive.cóf•—tt|� ||d«|jj|_y©Nsrb)rrNr=Ú_datarH)rÚuiÚfilenamers €rr=zlfsuploadfile.__init__gs%ø€Ü Œm˜TÑ+¨B°¸%Ô@Ø—J‘J—O‘Oˆ� rcó—yr:r;r<s rÚ _makeprogresszlfsuploadfile._makeprogressks€Ør)r2r3r4Ú__doc__r=rUr5r6s@rrNrNdsø„Ù5ô$örrNcóT—eZdZdZd„Zd„Zd„Zd„Zd„Zd„Z d„Z dd „Z d „Z d „Z d „Zy )Úlocalz«Local blobstore for large file contents. This blobstore is used both as a cache and as a staging area for large blobs to be uploaded to the remote blobstore. có4—|jjd«}t|«|_|jj dd«rt «|_n0tj|jd«}t|«|_|j|_y)Ns lfs/objectsó experimentalslfs.disableusercacheólfs) Úsvfsrrr rRÚ configboolr8ÚcachevfsrÚ _usercachedir)rÚrepoÚfullpathÚ usercaches rr=zlocal.__init__vsk€Ø—9‘9—>‘> .Ó1ˆÜ˜(Ó#ˆŒà �7‰7× Ñ ˜oÐ/FÔ GÜ#›IˆD�Mä×,Ñ,¨T¯W©W°fÓ=ˆIÜ" 9Ó-ˆDŒMØ—'‘'ˆ�rcó8—t|j|«d«S)zgOpen a read-only file descriptor to the named blob, in either the usercache or the local store.Úrb)Úopenrr@s rrez local.open�s€ô�D—I‘I˜c“N DÓ)Ð)rcó¤—|jj|«r|jj|«S|jj|«S)a{Build the path for the given blob ``oid``. If the blob exists locally, the path may point to either the usercache or the local store. If it doesn't, it will point to the local store. This is meant for situations where existing code that isn't LFS aware needs to open a blob. Generally, prefer the ``open`` method on this class. )r^rBrr r@s rrz local.path†s>€ð �=‰=× Ñ  Ô $Ø—=‘=×%Ñ% cÓ*Ð *à�x‰x�}‰}˜SÓ!Ð!rcó—tj«}d}|j|dd¬«5}tj|d¬«D]2}|j |«|j |«|t|«z }Œ4|�3t|«|k7r%d}tt|«|t|«|fz«‚t|j««} | |k7rttd «|z«‚ ddd«|j|«y#1swYŒxYw) znRead the blob from the remote source in chunks, verify the content, and write to this local blobstore.rówbT©Ú atomictempé©ÚsizeNsEResponse length (%d) does not match Content-Length header (%d) for %sscorrupt remote lfs object: %s)ÚhashlibÚsha256r r Ú filechunkiterrLÚupdater%ÚintÚLfsRemoteErrorrrÚdigestÚLfsCorruptionErrorÚ_linktousercache) rrAÚsrcÚcontent_lengthrormÚfpÚchunkÚmsgÚrealoids rÚdownloadzlocal.downloadšsú€ô—‘Ó!ˆØˆà �X‰X�c˜5¨TˆXÔ 2°bÜ×+Ñ+¨C°g×>�Ø—‘˜”Ø— ‘ ˜eÔ$Øœ˜E› Ñ"‘ð?ðÐ)¬c°.Ó.AÀTÒ.Ið*ðô%¤Q s£V¨t´S¸Ó5HÈ#Ð.NÑ%NÓOÐOä˜&Ÿ-™-›/Ó*ˆGؘ#Š~Ü(ÜÐ6Ó7¸#Ñ=óðð÷/3ð8 ×јcÕ"÷93Ð 2ús «B7C=Ã=Dcóš—|j|dd¬«5}|j|«ddd«|j|«y#1swYŒxYw)zëWrite blob to local blobstore. This should only be called from the filelog during a commit or similar. As such, there is no need to verify the data. Imports from a remote store must use ``download()`` instead.rhTriN)r rLrv)rrArKrys rrLz local.write¾sA€ð �X‰X�c˜5¨TˆXÔ 2°bØ �H‰H�TŒN÷3ð ×јcÕ"÷3Ð 2ús •AÁA cóP—t|jt«sŒ|jj |«sp|j j td«|z«tj|jj|«|jj|««yyy)a�Link blobs found in the user cache into this store. The server module needs to do this when it lets the client know not to upload the blob, to ensure it is always available in this store. Normally this is done implicitly when the client reads or writes the blob, but that doesn't happen when the server tells the client that it already has the blob. ólfs: found %s in the usercache N) Ú isinstancer^r8r rBrRÚnoterrÚlinkrr@s rÚlinkfromusercachezlocal.linkfromusercacheÉso€ô˜$Ÿ-™-¬Ô1¸$¿(¹(¿/¹/È#Ô:NØ �G‰G�L‰LœÐ>Ó?À#ÑEÔ FÜ �K‰K˜Ÿ ™ ×*Ñ*¨3Ó/°·±·±¸sÓ1CÕ Dð;OÐ1rcóP—|jj|«s‹t|jt«sp|jj t d«|z«tj|jj|«|jj|««yyy)Ns lfs: adding %s to the usercache ) r^rBr�r8rRr‚rrrƒr rr@s rrvzlocal._linktousercacheÖsu€ð�}‰}×#Ñ# CÔ(´Ø �M‰Mœ7ô2 ð �G‰G�L‰LœÐ?Ó@À3ÑFÔ GÜ �K‰K˜Ÿ™Ÿ ™  cÓ*¨D¯M©M×,>Ñ,>¸sÓ,CÕ Dð 2 Ð(rcóB—|jj|«s¿|j|j||«}|s/t t j |«j««|k(ro|jjtd«|z«tj|jj|«|jj|««|S|jjtd«|z«|j|j||«}|S)zRead blob from local blobstore.r€s%lfs: found %s in the local lfs store )r rBÚ_readr^rrnrortrRr‚rrrƒr)rrAÚverifyÚblobs rrHz local.readßsÏ€à�x‰x�‰˜sÔ#Ø—:‘:˜dŸm™m¨S°&Ó9ˆDñœœWŸ^™^¨DÓ1×8Ñ8Ó:Ó;¸sÒBØ—‘— ‘ œQÐBÓCÀcÑIÔJÜ— ‘ ˜DŸM™M×.Ñ.¨sÓ3°T·X±X·]±]À3Ó5GÔHðˆ ð �G‰G�L‰LœÐDÓEÈÑKÔ LØ—:‘:˜dŸh™h¨¨VÓ4ˆD؈ rcóD—|j|«}|r t||«|S)z0Read blob (after verifying) from the given store)rHÚ_verify)rr rArˆr‰s rr‡z local._readñs!€à�x‰x˜‹}ˆÙ Ü �C˜Ô ؈ rcó —tj«}|j|«5}tj|d¬«D]}|j |«Œ ddd«|t |j««k(S#1swYŒ%xYw)zQIndicate whether or not the hash of the underlying file matches its name.rkrlN)rnrorer rprqrrt)rrAroryrzs rrˆz local.verifyøse€ô—‘Ó!ˆà �Y‰Y�sŒ^˜rÜ×+Ñ+¨B°W×=�Ø— ‘ ˜eÕ$ñ>÷ð”c˜&Ÿ-™-›/Ó*Ñ*Ð*÷ ˆ^ús ¦.A9Á9Bcór—|jj|«xs|jj|«S)zYReturns True if the local blobstore contains the requested blob, False otherwise.)r^rBr r@s rÚhasz local.hass+€ð�}‰}×#Ñ# CÓ(Ò@¨D¯H©H¯O©O¸CÓ,@Ð@rN)T)r2r3r4rVr=rerr}rLr„rvrHr‡rˆrŽr;rrrXrXosB„ñò ò*ò "ò("#òH #ò EòEóò$ò +óArrXcóÄ—|}t|jt«r |j}tj|d«rA |jj d}t|t«rtj|«}|St|dd«rtj|j«Stj|«S#t tf$r|j}YŒ…wxYw)zbCreate a friendly message for the given URLError to be used in an LfsRemoteError message. sreasonéÚstrerrorN)r�ÚreasonÚ Exceptionr Ú safehasattrÚargsÚAttributeErrorÚ IndexErrorÚstrrÚ unitolocalrÚ strtolocalr‘rÚ forcebytestr)ÚurlerrorÚinstr’s rÚ_urlerrorreasonrž s»€ð €Dä�(—/‘/¤9Ô-Ø�‰ˆä ×ј˜iÔ(ð !Ø—[‘[×%Ñ% aÑ(ˆFô �fœcÔ "ä×(Ñ(¨Ó0ˆF؈ Ü ��z 4Ô (Ü×"Ñ" 4§=¡=Ó1Ð1ä×&Ñ& xÓ0Ð0øô¤ Ð+ò !à—[‘[ŠFð !úsÁCÃCÃCcó—eZdZdZd„Zy)Úlfsauthhandleriàcó—|jdd«}|ru|j«d}|j«dk7rOtd«}tj j |j«|tj|«||«‚y)z€Enforces that any authentication performed is HTTP Basic Authentication. No authentication is also acceptable. zwww-authenticateNrÚbasics,the server must support Basic Authentication) ÚgetÚsplitÚlowerrr ÚurlerrÚ httperrorÚ get_full_urlrÚ strfromlocal)rÚreqryÚcoder{ÚheadersÚauthreqÚschemes rÚhttp_error_401zlfsauthhandler.http_error_401%s€€ð—+‘+Ð0°$Ó7ˆÙ Ø—]‘]“_ QÑ'ˆFà�|‰|‹~ Ò(ÜÐGÓH�Ü—k‘k×+Ñ+Ø×$Ñ$Ó&ØÜ×)Ñ)¨#Ó.ØØó ððrN)r2r3r4Ú handler_orderr¯r;rrr r "s „Ø€Mórr cóB—eZdZd„Zd„Zd„Zd„Zd„Zd„Zd„Z d„Z d „Z y ) Ú _gitlfsremotecó’—|j}||_|j«\}}|jd«|_|jj dd«}|sdt j «z}tj|||«|_ |jjt««|jdd«|_ y)Nó/rZslfs.user-agentsgit-lfs/2.3.4 (Mercurial %s)r[sretry)rRÚauthinfoÚrstripÚbaseurlÚconfigr ÚversionÚurlmodÚopenerÚ urlopenerÚ add_handlerr Ú configintÚretry)rr`r rRr·rµÚ useragents rr=z_gitlfsremote.__init__:s•€Ø �W‰WˆØˆŒØŸL™L›Nш�Ø—~‘~ dÓ+ˆŒ Ø—G‘G—N‘N ?Ð4EÓFˆ ÙØ7¼$¿,¹,».ÑHˆIÜŸ™ r¨8°YÓ?ˆŒØ �‰×"Ñ"¤>Ó#3Ô4Ø—\‘\ &¨(Ó3ˆ� rcó<—|jt|«|d«y)z,Batch upload from local to remote blobstore.óuploadN©Ú_batchÚ _deduplicate©rÚpointersÚ fromstores rÚ writebatchz_gitlfsremote.writebatchFs€à � ‰ ”L Ó*¨I°yÕArcó<—|jt|«|d«y)z-Batch download from remote to local blostore.ódownloadNrérrÇÚtostores rÚ readbatchz_gitlfsremote.readbatchJs€à � ‰ ”L Ó*¨G°[ÕArc ó|—|D�cgc]6}tj|j««|j«dœ‘Œ8}}tjt j |tj|«dœ««}d|jz}tjjtj|«|¬«}|jdd«|jdd« tj|jj|««5}|j!«} ddd« tj6 «} |j<j>rý|j<jAdjBz«tjD|jG««jI«}|j<jAddjKtM|jO«««z«d| vrtM| dd„¬«| d<|j<jAdtjt j | ddd¬««z«d„}tjP|| «Scc}w#1swY�ŒQxYw#tj"j$$rŽ} t'd «|j|fzt'd «|jzd œ} | j)| j*t'd «||fz«} t-t'd «t/j0| «z| ¬«‚d} ~ wtj"j2$r?} t'd «|jz} t-t'd«t5| «z| ¬«‚d} ~ wwxYw#t8$r't-t'd« j;d«z«‚wxYw)zäGet metadata about objects pointed by pointers for given action Return decoded JSON object like {'objects': [{'oid': '', 'size': 1}]} See https://github.com/git-lfs/git-lfs/blob/master/docs/api/batch.md )rArm)ÚobjectsÚ operations%s/objects/batch)rKÚAcceptzapplication/vnd.git-lfs+jsonú Content-TypeNs=check that lfs serving is enabled on %s and "%s" is supporteds/the "lfs.url" config may be used to override %s)i�é”sapi=%s, action=%ssLFS HTTP error: %s©Úhintó LFS error: %ss#LFS server returns invalid JSON: %súutf-8ó Status: %d ó%s ó rÐcó —|dS)NrAr;)Úps rÚz-_gitlfsremote._batchrequest..Žs€°q¸²xr©Úkeyr)Úz: T)ÚindentÚ separatorsÚ sort_keyscóH—t|t«r|jd«S|S)NrØ)r�r˜Úencode)Úxs rÚ encodestrz._gitlfsremote._batchrequest..encodestrœs €Ü˜!œSÔ!Ø—x‘x Ó(Ð(؈Hr))r ÚstrurlrArmÚbytesurlÚjsonÚdumpsr·r ÚurlreqÚrequestÚ add_headerÚ contextlibÚclosingr¼rerHr¦r§rr£r«rsrr›rœržÚ json_loadsÚ ValueErrorrærRÚ debugflagÚdebugÚstatusÚbytestrÚinfoÚstriprÚsortedÚ splitlinesÚrapply)rrÇÚactionrÝrÐÚ requestdatar ÚbatchreqÚrspÚrawjsonÚexÚhintsrÖÚresponser¬rès rÚ _batchrequestz_gitlfsremote._batchrequestNs:€ñó á�ô—O‘O A§E¡E£GÓ,°a·f±f³hÓ ?Øð ð ô×'Ñ'Ü �J‰Jà&Ü!)§¡°Ó!8ñó ó ˆ ð" D§L¡LÑ0ˆÜ—;‘;×&Ñ&¤x§¡°sÓ';À+Ð&ÓNˆØ×јHÐ&DÔEØ×јNÐ,JÔKð Ü×#Ñ# D§N¡N×$7Ñ$7¸Ó$AÔBÀcØŸ(™(›*�÷Cð2 Ü×*Ñ*¨7Ó3ˆHð �7‰7× Ò Ø �G‰G�M‰M˜/¨C¯J©JÑ6Ô 7ä×&Ñ& s§x¡x£zÓ2×8Ñ8Ó:ˆGØ �G‰G�M‰M˜' E§J¡J¬v°g×6HÑ6HÓ6JÓ/KÓ$LÑLÔ Mà˜HÑ$Ü&,ؘYÑ'Ñ-?ô'�˜Ñ#ð �G‰G�M‰MØÜ×#Ñ#Ü—J‘JØ Ø Ø#-Ø"&ô óñô ò ô �‰˜y¨(Ó3Ð3ùò[ ÷"CÑBûä�{‰{×$Ñ$ò äð!óð—<‘< Ð(ñ )ô ÐIÓJØ—,‘,ññ ˆEð—9‘9˜RŸW™W¤aÐ(<Ó&=ÀÀfÀ Ñ&MÓNˆDÜ ÜÐ'Ó(¬:×+BÑ+BÀ2Ó+FÑFØôð ûô�{‰{×#Ñ#ò äÐDÓEØ—,‘,ñð ô!ÜÐ"Ó#¤o°bÓ&9Ñ9Àôð ûð  ûôò Ü ÜÐ8Ó9Ø—.‘. Ó)ñ*óð ð úsN…;I1Ã(.JÄI6Ä'JÄ0N É6JÉ;JÊNÊ B L)Ì) NÍ :NÎNÎ 0N;cóÀ—|D]Ô}d|vr|dk(r||jdg«vrd}n"Œ$|jd«jdd«}|D�cic]}|j«|“Œ}}|j|dd«}|rBt|d d «}d d d ddœ} | j|d|z«} tt d«|| fz«‚tt d«|dz«‚ycc}w)zUScans errors from objects Raises LfsRemoteError if any objects have an errorserrorrËóactionsrÔscodeéôóoidNrSsunknownsThe object does not exists#The object was removed by the ownersValidation errorsInternal server error)rÔiši¦rsstatus code %dsLFS server error for "%s": %ss1LFS server error. Unsolicited response for oid %s)r£rArrsr) rrÇÚ responsesrýrr«rÝÚptrmaprSÚerrorsr{s rÚ_checkforservererrorz"_gitlfsremote._checkforservererror£s€ó"ˆHð ˜xÑ'ؘ[Ò(¨V¸8¿<¹<Ø ó<ñ.ð‘Dàð —|‘| HÓ-×1Ñ1°'¸3Ó?�á*2Ó3©( Q�a—e‘e“g˜q‘j¨(ˆFÐ3Ø— ‘ ˜8 FÑ+¨TÓ2ˆAÙÜ" 1 j°*Ó=�à5Ø?Ø,Ø1ñ �ð —j‘j Ð'8¸4Ñ'?Ó@�Ü$ÜÐ6Ó7¸8ÀS¸/ÑIóðô%ÜÐJÓKؘvÑ&ñ'óðñA"ùò"4sÁ Ccó¢—|jdg«}|j|||«|D�cgc]}||jdg«vsŒ|‘Œ}}|Scc}w)zÒextract objects from response of the batch API response: parsed JSON object returned by batch API return response['objects'] filtered by action raise if any object has an error sobjectsr)r£r )rrrÇrýrÐÚoÚfilteredobjectss rÚ_extractobjectsz_gitlfsremote._extractobjectsÌsc€ð—,‘,˜z¨2Ó.ˆØ ×!Ñ! (¨G°VÔ<ñ ó Ù�! &¨A¯E©E°*¸bÓ,AÒ"AŠA�wð ð ðÐùò  s ªA ÁA c ó–—|d}|d|jd«}|d|jdi«j«}tjj t j |««}|dk(r=|j|«s,tjtd«|ztd«¬«‚|D]=\}} |jt j |«t j | ««Œ? |dk(rjt|j|j|««|_d „|_|jd d «|jd |jj"«t%j&|j(j+|««5} | j-«jd «} |j} |jj.r‰| j1d| j2z«t j4| j-««j7«}| j1ddj9t;|j=«««z«|dk(r|j?|| | «nRg} | jAd«}|sn| jC|«Œ&dj9| «}|r| j1d||fz«ddd«|jr|jjY«yy#1swYŒ1xYw#tjDjF$rv}|jj.r.|jj1d||jA«fz«tItd«tKjL|«||fz«‚d}~wtjDjN$re}td«t jPtjRjU|««z}tItd«tW|«z|¬«‚d}~wwxYw#|jr|jjY«wwxYw)aCDownload or upload a single object using basic transfer protocol obj: dict, an object description returned by batch API action: string, one of ['upload', 'download'] localstore: blobstore.local See https://github.com/git-lfs/git-lfs/blob/master/docs/api/ basic-transfers.md r rshrefsheaderrÂódetected corrupt lfs object: %só run hg verifyrÕcó—y)NÚPUTr;r;rrrÞz._gitlfsremote._basictransfer..üs€¨UrrÓzapplication/octet-streamzContent-Lengthscontent-lengthrÙrÚrÛrËrkrslfs %s response: %sNs%s: %s s&LFS HTTP error: %s (oid=%s, action=%s)sattempted connection to %sr×)-r£Úitemsr rírîr rérˆrÚAbortrrïrNrRrrKÚ get_methodÚlengthrðrñr¼rerørôrõrör÷rùrrúrûr}rHÚappendr¦r§rsrr›rœrêÚ urllibcompatÚ getfullurlržÚclose)rÚobjrýÚ localstorerAÚhrefr¬rîÚkÚvÚresÚ contentlengthrRÚblocksrKrrrÖs rÚ_basictransferz_gitlfsremote._basictransferßs„€ð�&‰kˆØ�:‰˜vÑ&×*Ñ*¨7Ó3ˆØ�j‘/ &Ñ)×-Ñ-¨i¸Ó<×BÑBÓDˆä—+‘+×%Ñ%¤h§o¡o°dÓ&;Ó<ˆØ �YÒ à×$Ñ$ SÔ)Ü—k‘kÜÐ8Ó9¸CÑ?ÜÐ+Ó,ôðó ‰DˆAˆqØ × Ñ œxŸ™¨qÓ1´8·?±?À1Ó3EÕ Fðð2 %ؘÒ"Ü,¨T¯W©W°j·o±oÀcÓ6JÓK�” Ù%2�Ô"Ø×"Ñ" >Ð3MÔNØ×"Ñ"Ð#3°W·\±\×5HÑ5HÔIä×#Ñ# D§N¡N×$7Ñ$7¸Ó$@ÔAÀSØ #§¡£ §¡Ð/@Ó A� Ø—W‘W�Ø—7‘7×$Ò$Ø—H‘H˜_¨s¯z©zÑ9Ô:ô'×.Ñ.¨s¯x©x«zÓ:×@Ñ@ÓB�GØ—H‘H˜W u§z¡z´&¸×9KÑ9KÓ9MÓ2NÓ'OÑOÔPà˜[Ò(ð×'Ñ'¨¨S°-Õ@à�FØØ"Ÿx™x¨Ó0˜Ù#Ø!ØŸ ™  dÔ+ð ð #Ÿx™x¨Ó/�HÙØŸ™Ð!7¸6À8Ð:LÑ!LÔM÷1BðT�|Š|Ø— ‘ ×"Ñ"Õ$ð÷UBÐAûô2�{‰{×$Ñ$ò Ø�w‰w× Ò Ø—‘— ‘ Ø 3¨¯©« Ð"2Ñ2ôô!ÜÐ;Ó<Ü×*Ñ*¨2Ó.°°VÐ<ñ=óð ûô�{‰{×#Ñ#ò ÜÐ2Ó3´h×6GÑ6GÜ×!Ñ!×,Ñ,¨WÓ5ó7ñˆDô!ÜÐ"Ó#¤o°bÓ&9Ñ9Àôð ûð  ûð�|Š|Ø— ‘ ×"Ñ"Õ$ðúsLÃ:BL ÆD6K=Ë L Ë=LÌL Ì PÌ&A1NÎ PÎ7A PÐPÐPÐ)Qc 󇇇—‰dvrtjd‰z«‚‰j|‰«}‰j||‰«}t d„|D««}i}|D]&}|j dd«||j d«<Œ(t d«t d«dœ‰} t|«d kDrE‰jjt d «t|«tj|«fz«ˆˆˆfd „} ‰jjd d «r7ˆfd„} tj‰jd| dt|d„¬«| ¬«} n| t|d„¬««} ‰jj| t d«|¬«5} | j!d«d}d}| D]J\}}|||z }|d z }| j!|«‰jjt d«|z«ŒL ddd«dkDr…‰dk(r=‰jj#t d«|tj«fz«y‰dk(r=‰jj#t d«|tj«fz«yyy#1swYŒ”xYw)N)rÂrËsinvalid Git-LFS action: %sc3ó@K—|]}|jdd«–—Œy­w)ósizerN©r£)Ú.0rçs rÚ z'_gitlfsremote._batch..3sèø€Ð7©w¨!�A—E‘E˜' 1×%©wùs‚r*rr s lfs uploadingslfs downloadingr�s&lfs: need to transfer %d objects (%s) c3ól•K—|D]Ã}|jdd«}‰jjrc‰dk(r td«}n‰dk(r td«}‰jj |jd«t j |«fz«‰j} ‰j|‰‰«d|jd«f–—ŒÅy#tj$rQ}|dkDrF‰jj td «tj|«|fz«|dz}Yd}~Œ‹‚d}~wwxYw­w) Nr*rrËslfs: downloading %s (%s) rÂslfs: uploading %s (%s) r r�s%lfs: failed: %r (remaining retry %d) ) r£rRÚverboserr‚r Ú bytecountr¿r'Úsocketrrr›) rzrÚobjsizer{r¿rrýr rs €€€rÚtransferz&_gitlfsremote._batch..transferAsøèø€Û�ØŸ'™' '¨1Ó-�Ø—7‘7—?’?Ø Ò,ÜÐ =Ó>™Ø 9Ò,ÜÐ ;Ó<˜Ø—G‘G—L‘LؘsŸw™w v›´·±¸wÓ0GÐHÑHô🠙 �Øð Ø×+Ñ+¨C°¸ÔDØ §¡¨£Ð0Ò0Øñøô "Ÿ<™<òØ  1š9Ø ŸG™GŸL™LÜ !Ð"KÓ LÜ#-×#:Ñ#:¸2Ó#>ÀÐ"Fñ!Gôð" Q™J˜EÜ$Øûðüs7ƒBD4Â"(C à D4à D1à AD,Ä&D4Ä+D,Ä,D1Ä1D4rZslfs.worker-enablecób•—‰jjD]}t|dd„««Œy)NÚ close_allcó—yr:r;r;rrrÞz7_gitlfsremote._batch..prefork..ks€°Dr)r¼Úhandlersr)Úhrs €rÚpreforkz%_gitlfsremote._batch..preforkis(ø€ØŸ™×0Ô0�AØ9”G˜A˜{©LÓ9Õ;ñ1rgš™™™™™¹?r;có$—|jd«S©Nr r+©rs rrÞz&_gitlfsremote._batch..rs €¨a¯e©e°F¬mrrß)r9có$—|jd«Sr;r+r<s rrÞz&_gitlfsremote._batch..vs €¸!¿%¹%À¼-rsbytes)ÚunitÚtotalslfs: processed: %s rÂslfs: uploaded %d files (%s) rËslfs: downloaded %d files (%s) )rrrrÚsumr£rr%rRr‚r r0r]rrúÚ makeprogressrqrö)rrÇr rýrrÐr?ÚsizesrÚtopicr3r9r,ÚprogressÚ processedÚblobsÚ_onerAs` `` rrÄz_gitlfsremote._batch-shú€Ø Ð1Ñ 1Ü×(Ñ(Ð)FÈÑ)OÓPÐ Pà×%Ñ% h°Ó7ˆØ×&Ñ& x°¸6ÓBˆÜÑ7©wÓ7Ó7ˆØˆÛˆCØ%(§W¡W¨W°aÓ%8ˆE�#—'‘'˜&“/Ò "ðôÐ)Ó*ÜÐ-Ó.ñ ð ñˆô ˆw‹<˜!Ò Ø �G‰G�L‰LÜÐ<Ó=Ü�w“<¤§¡°Ó!6Ð7ñ8ô ö  ð< �7‰7× Ñ ˜oÐ/CÔ Dô <ô—=‘=Ø—‘ØØØÜ�wÑ$;Ô<Øô ‰DñœF 7Ñ0GÔHÓIˆDà �W‰W× !Ñ !Ø œ˜(› ¨5ð"ô à Ø �O‰O˜AÔ ØˆI؈EÛ!‘ ��cؘU 3™ZÑ'� ؘ‘ �Ø—‘  Ô*Ø—‘— ‘ œQÐ6Ó7¸#Ñ=Õ>ñ "÷  ð �1Š9ؘÒ"Ø—‘—‘ÜÐ6Ó7ØœdŸn™n¨YÓ7Ð8ñ9õð˜;Ò&Ø—‘—‘ÜÐ8Ó9ØœdŸn™n¨YÓ7Ð8ñ9õð'ð ÷ ð ús ÆA%I?É?JcóŒ—t|dd«}|r5|jD]%}|j«t|dd„««Œ'yy)Nr¼r5có—yr:r;r;rrrÞz'_gitlfsremote.__del__..–s€°r)rr7r)rr¼r8s rÚ__del__z_gitlfsremote.__del__�sB€ä˜D +¨tÓ4ˆ Ù Ø×'Ô'�Ø—‘” Ø5”˜˜;© Ó5Õ7ñ(ð rN) r2r3r4r=rÉrÎrr rr'rÄrJr;rrr²r²9s8„ò 4òBòBòS4òj'òRò&L%ò\aóF8rr²có"—eZdZdZd„Zd„Zd„Zy)Ú _dummyremotez,Dummy store storing blobs to temp directory.cóp—|jjd|j«}t|«|_y)Nr[)r rrr)rr`r ras rr=z_dummyremote.__init__œs&€Ø—8‘8—=‘= ¨¯©Ó2ˆÜ˜(Ó#ˆ�rcóö—t|«D]_}|j|j«d¬«}|j|j«dd¬«5}|j |«ddd«Œay#1swYŒlxYw)NT)rˆrhri)rÅrHrAr rL)rrÇrÈrÝÚcontentrys rrÉz_dummyremote.writebatch s^€Ü˜hÖ'ˆAØ—n‘n Q§U¡U£W°T�nÓ:ˆGØ—‘˜!Ÿ%™%›' 5°T�Ô:¸bØ—‘˜Ô!÷;Ð:ñ(ç:Ð:ús ÁA/Á/A8 cóЗt|«D]L}|j|j«d«5}|j|j«|d«ddd«ŒNy#1swYŒYxYwrP)rÅr rAr})rrÇrÍrÝrys rrÎz_dummyremote.readbatch¦sN€Ü˜hÖ'ˆAØ—‘˜!Ÿ%™%›' 5Ô)¨RØ× Ñ  §¡£¨"¨dÔ3÷*Ð)ñ(ß)Ð)ús ¯"AÁA% N©r2r3r4rVr=rÉrÎr;rrrLrL™s„Ù6ò$ò"ó 4rrLcó"—eZdZdZd„Zd„Zd„Zy)Ú _nullremotez&Null store storing blobs to /dev/null.có—yr:r;©rr`r s rr=z_nullremote.__init__¯r>rcó—yr:r;rÆs rrÉz_nullremote.writebatch²r>rcó—yr:r;rÌs rrÎz_nullremote.readbatchµr>rNrQr;rrrSrS¬s„Ù0ò ò ó rrScó,—eZdZdZd„Zdd„Zdd„Zd„Zy)Ú _promptremotez)Prompt user to set lfs.url when accessed.có—yr:r;rUs rr=z_promptremote.__init__¼r>rNcó$—|j«yr:©Ú_prompt)rrÇrÈrRs rrÉz_promptremote.writebatch¿ó €Ø � ‰ �rcó$—|j«yr:r\)rrÇrÍrRs rrÎz_promptremote.readbatchÂr^rcó>—tjtd««‚)Nslfs.url needs to be configured)rrrr<s rr]z_promptremote._promptÅs€Ü�k‰kœ!Ð=Ó>Ó?Ð?rr:)r2r3r4rVr=rÉrÎr]r;rrrYrY¹s„Ù3ò óóó@rrY)óhttpsóhttpsfilesnullNcó~—tj«}|D]}|||j«<Œ|j«S)z0Remove any duplicate oids that exist in the list)r ÚsortdictrAÚvalues)rÇÚreducedrÝs rrÅrÅÒs4€ä�m‰m‹o€GÛ ˆØˆ�—‘“Òðà �>‰>Ó Ðrcóª—ttj|«j««}||k7r"t t d«|zt d«¬«‚y)NrrrÕ)rrnrortrur)rArOr|s rr‹r‹ÚsN€Ü”'—.‘. Ó)×0Ñ0Ó2Ó3€GØ�#‚~Ü Ü Ð0Ó 1°CÑ 7ÜÐ#Ó$ô ð ðrcóî—|jjdd«}tj|xsd«}|€û|r|}nCt j |d«r |j }n |jjdd«xsd}tj|«}|jdvr�|jr'|jdd d k7r|xjd z c_|jxsdd z|_tjt|««}|jjtd «|z«|j}|tvr!tjtd «|z«‚t|||«S)a©remotestore factory. return a store in _storemap depending on config If ``lfs.url`` is specified, use that remote endpoint. Otherwise, try to infer the endpoint, based on the remote repository using the same path adjustments as git. As an extension, 'http' is supported as well so that ``hg serve`` works out of the box. https://github.com/git-lfs/git-lfs/blob/master/docs/api/server-discovery.md r[surlrNs _subtoppathspathssdefault)rbraéÿÿÿÿr´s .git/info/lfsslfs: assuming remote store: %s slfs: unknown url scheme: %s)rRr¸rr r r”Ú _subtoppathr®rÚbytesr‚rÚ _storemaprr)r`ÚremoteÚlfsurlr rÚ defaulturlr®s rrmrmãs6€ð�W‰W�^‰^˜F FÓ +€FÜ �+‰+�f’m Ó $€CØ €~٠؉DÜ × Ñ ˜d NÔ 3ð×#Ñ#‰Dð—7‘7—>‘> (¨JÓ7Ò>¸3ˆDä—[‘[ Ó&ˆ ð × Ñ Ð 3Ñ 3Ø�Š :§?¡?°3°BÐ#7¸4Ò#?Ø—’ 4Ñ'•Ø)Ÿ™Ò5°#Ð9IÑIˆJŒOä—+‘+œe JÓ/Ó0ˆCØ �G‰G�L‰LœÐ>Ó?À#ÑEÔ Fà �Z‰Z€FØ ”YÑÜ�k‰kœ!Ð:Ó;¸fÑDÓEÐEÜ �VÑ ˜T 3Ó 'Ð'rcó —eZdZy)rsN)r2r3r4r;rrrsrss„Ørrscó—eZdZdZy)ruz~Raised when a corrupt blob is detected, aborting an operation It exists to allow specialized handling on the server side.N)r2r3r4rVr;rrrurus„òCrrur:)6rðrErnrër"Úrer1Úmercurial.i18nrÚmercurial.pycompatrÚmercurial.noderÚ mercurialrrrÚhttpconnectionmodr r r rºr r ÚvfsmodrÚmercurial.utilsrrÚ largefilesrÚcompilerrr8Ú httpsendfilerNrXržríÚ basehandlerr r²rLrSrYrlrÅr‹rmÚ StorageErrorrsrrur;rrÚrs$ðóÛ ÛÛ Û Û Û åÝ&Ý÷ ÷ õ ÷õ  ð ˆ�‰Ð(Ó )€ôˆV�Z‰Zôô@ ˆfô ô0Ð%×2Ñ2ô÷WAñWAòt1ô2�T—[‘[×,Ñ,ô÷.]8ñ]8÷@ 4ñ4÷&  ñ  ÷ @ñ @ð"Ø Ø Ø Ø ñ  € òò ó((ôV �U×'Ñ'ô ôC˜Ÿ™õCr