Ë v‚u'�à¹ãó\—dZddlZddlZddlZddlZddlZddlmZddlZddl m Z m Z ddl m Z dZiZdZdadZdaej(ddk\Zd„Zd3d „ZGd „d e«ZGd „d e«ZGd„de«ZGd„d«ZGd„de«ZGd„d«Z Gd„de«Z!edd«Z"edd«Z#edd«Z$edd«Z%edd«Z&edd «Z'edd!«Z(edd"«Z)edd#«Z*edd$«Z+d%a,d&„Z-d'„Z.d(„Z/d4d)„Z0d4d*„Z1d+„Z2d5d,„Z3d6d-„Z4d.„Z5erd/„Z6nd0„Z6da7d%a8d1„Z9d2„Z:y)7a¡ This module is based on a rox module (LGPL): http://cvs.sourceforge.net/viewcvs.py/rox/ROX-Lib2/python/rox/mime.py?rev=1.21&view=log This module provides access to the shared MIME database. types is a dictionary of all known MIME types, indexed by the type name, e.g. types['application/x-python'] Applications can install information about MIME types by storing an XML file as /packages/.xml and running the update-mime-database command, which is provided by the freedesktop.org shared mime database package. See http://www.freedesktop.org/standards/shared-mime-info-spec/ for information about the format of these files. (based on version 0.13) éN)Ú BaseDirectory)ÚminidomÚ XML_NAMESPACE)Ú defaultdictz5http://www.freedesktop.org/standards/shared-mime-infoécóŽ—dj|jD�cgc]}|j‘Œc}«j«Scc}w)zGet text of XML nodeÚ)ÚjoinÚ childNodesÚ nodeValueÚstrip)ÚnodeÚns ú-/usr/lib/python3.12/site-packages/xdg/Mime.pyÚ_get_node_datar-s4€à �7‰7¨¯ªÓ9© A�A—K“K¨Ñ9Ó :× @Ñ @Ó BÐBùÒ9sšAcó—t||«S)zõGet the MIMEtype object for the given type. This remains for backwards compatibility; calling MIMEtype now does the same thing. The name can either be passed as one part ('text/plain'), or as two ('text', 'plain'). )ÚMIMEtype©ÚmediaÚsubtypes rÚlookupr1s€ô �E˜7Ó #Ð#ócóT‡—eZdZdZd ˆfd„ Zd„Zd„Zd„Zd„Zd„Z d„Z d „Z d „Z ˆxZ S) rzöClass holding data about a MIME type. Calling the class will return a cached instance, so there is only one instance for each MIME type. The name can either be passed as one part ('text/plain'), or as two ('text', 'plain'). có •—|€d|vr|jdd«\}}d|vsJ‚|j«}|j«} t||fS#t$r5tt |�|«}|j||«|t||f<|cYSwxYw)NÚ/é)ÚsplitÚlowerÚtypesÚKeyErrorÚsuperrÚ__new__Ú_init)ÚclsrrÚmtypeÚ __class__s €rr"zMIMEtype.__new__Cs�ø€Ø ˆ?˜s e™|Ø"Ÿ[™[¨¨aÓ0‰NˆE�7ؘ'Ñ!Ð!Ð!Ø— ‘ “ ˆØ—-‘-“/ˆð ܘ% Ð)Ñ*Ð *øÜò Üœ( CÑ0°Ó5ˆEØ �K‰K˜˜wÔ 'Ø&+ŒE�5˜'Ð"Ñ #ØŠLð  úsÁ AÁ;B  B có.—||_||_d|_y©N)rrÚ_comment)Úselfrrs rr#zMIMEtype._initUs€ØˆŒ ؈Œ ؈� rcóì—tjjd|j|jdz«}t j |«D]¤}tj|«}|€Œ|jjtd«D]g}|jtd«xsd}d|tjj vz}||j"dkDr|t%|«f|_|d k(sŒfyŒ¦y) z>Loads comment for current language. Use get_comment() instead.Úmimeú.xmlNÚcommentÚlangÚenrré)ÚosÚpathr rrrÚload_data_pathsrÚparseÚdocumentElementÚgetElementsByTagNameNSÚFREE_NSÚgetAttributeNSrÚxdgÚLocaleÚlangsr)r)r*Úresourcer3Údocr.r/Úgoodnesss rÚ_loadzMIMEtype._loadZsÉ€ä—7‘7—<‘< ¨¯ © °D·L±LÀ6Ñ4IÓJˆÜ!×1Ñ1°(Ö;ˆDÜ—-‘- Ó%ˆC؈{ØØ×.Ñ.×EÑEÄgÈyÖY�Ø×-Ñ-¬m¸VÓDÒLÈ�Ø ¬¯ © ×(8Ñ(8Ð 8Ñ9�ؘdŸm™m¨AÑ.Ò.Ø%-¬~¸gÓ/FÐ$G�D”Mؘq“=¢&ñ Zñ z)MIMEtype.inherits_from..|sèø€Ð=Ñ&< ”6˜!—9Ñ&<ùs‚)rFÚsetÚ inheritancerBrCs rÚ inherits_fromzMIMEtype.inherits_fromys!€äŒÜÑ=¤k´#°d³)Ò&<Ó=Ó=Ð=rcó:—|jdz|jzS)NrrrCs rÚ__str__zMIMEtype.__str__~s€Ø�z‰z˜CÑ $§,¡,Ñ.Ð.rcó<—d|j›d|j›d�S)Nz MIMEtype(z, Ú)rrCs rÚ__repr__zMIMEtype.__repr__�s�Ø%)§Z£Z°·³Ð>Ð>rcóX—t|j«t|j«z Sr()ÚhashrrrCs rÚ__hash__zMIMEtype.__hash__„s€Ü�D—J‘JÓ¤$ t§|¡|Ó"4Ñ4Ð4rr()Ú__name__Ú __module__Ú __qualname__Ú__doc__r"r#r@rDrIrQrSrVrYÚ __classcell__)r&s@rrr<s5ø„ñõ ò$ò )ò òò>ò /ò?ö5rrcó —eZdZy)ÚUnknownMagicRuleFormatN)rZr[r\©rrr`r`‡s„Ørr`có—eZdZdZy)ÚDiscardMagicRuleszGRaised when __NOMAGIC__ is found, and caught to discard previous rules.N)rZr[r\r]rarrrcrcŠs„ÙMØrrccób—eZdZdZd„Zej d«Zed„«Z d„Z d„Z d„Z d„Z y) Ú MagicRuleNcóJ—||_||_||_||_||_yr(©ÚstartÚvalueÚmaskÚwordÚrange)r*rhrirjrkrls rÚ__init__zMagicRule.__init__‘s%€ØˆŒ ؈Œ ؈Œ ؈Œ ؈� rs(?:~(\d+))?(?:\+(\d+))?\n$cóh—|j«}|jdd«\}}|r t|«nd}|jdd«\}}t|«}|dk(rt‚tj ddk\rtj |ddd ¬ «}n t|d«d zt|d«z}|dd}t|«|kr"||j«z }t|«|krŒ"|d|||d}}|jd «rAt|«|kr"||j«z }t|«|krŒ"|d|dz||dzd}}nd}|jj|«}|stt|««‚|j«\} } | � t| «nd} | � t| «nd} |||||| | «fS) zjRead a rule from the binary magics file. Returns a 2-tuple of the nesting depth and the MagicRule.ó>rró=s __NOMAGIC__ rNr1Úbig)Ú byteorderéó&)ÚreadlinerÚintrcÚsysÚ version_infoÚ from_bytesÚordÚlenÚ startswithÚrule_ending_reÚmatchr`ÚreprÚgroups) r$ÚfÚlineÚ nest_depthrhÚlenvaluerirjÚendingrkrls rÚ from_filezMagicRule.from_filešsÇ€ð�z‰z‹|ˆð Ÿ:™: d¨AÓ.ш �DÙ(2”S˜”_¸ˆ ð—j‘j  qÓ)‰ ˆˆtÜ�E“ ˆà Ð#Ò #Ü#Ð #ô × Ñ ˜AÑ  !Ò #Ü—~‘~ d¨2¨A h¸%�~Ó@‰Hä˜D ™G›  a™¬¨T°!©W«Ñ5ˆHØ�A�Bˆxˆô�$‹i˜8Ò#Ø �A—J‘J“LÑ ˆDô�$‹i˜8Ó#à˜9˜H�o t¨H¨I ˆtˆð �?‰?˜4Ô ä�d“)˜xÒ'ؘŸ ™ › Ñ$�ô�d“)˜xÓ'à˜a ¨¡ Ð+¨T°(¸1±*°+Ð->�$‰DàˆDð×#Ñ#×)Ñ)¨$Ó/ˆÙô)¬¨d«Ó4Ð 4à—m‘m“o‰ ˆˆeØ!Ð-Œs�4Œy°AˆØ$Ð0”�E” °qˆà™3˜u e¨T°4¸Ó?Ð?Ð?rcóÄ—|jt|j«z|jz}|jr$t ||jj ««S|Sr()rhr{rirlÚalsoÚmaxÚmaxlen)r*Úls rrŠzMagicRule.maxlenÏsG€Ø �J‰Jœ˜TŸZ™Z›Ñ (¨4¯:©:Ñ 5ˆØ �9Š9Ü�q˜$Ÿ)™)×*Ñ*Ó,Ó-Ð -؈rcóv—|j|«r(|jr|jj|«Syy)NT)Úmatch0rˆr~©r*Úbuffers rr~zMagicRule.matchÕs0€Ø �;‰;�vÔ Ø�yŠyØ—y‘y—‘ vÓ.Ð.Øð rcóÆ—t|«}t|j«}t|j«D]©}|j|z}||z}||kry|jrjd}t|«D]Y}t r|||z|j|z} n*t |||z«t |j|«z} |t| «z }Œ[n|||}||jk(sŒ©yy)NFr T)r{rirlrhrjÚPY3rzÚchr) r*r�r‹r„ÚorHÚeÚtestÚiÚcs rr�zMagicRule.match0ÛsÏ€Ü ˆf‹+ˆÜ�t—z‘z“?ˆÜ�t—z‘zÖ"ˆAØ�j‰j˜‰lˆAØ�‰jˆAØ�ŠsÙØ�yŠyØ�ܘxž�AÝØ" 1 Q¡3™K¨$¯)©)°A©,Ñ6™ä  q¨¡s¡ Ó,¬s°4·9±9¸Q±<Ó/@Ñ@˜ØœC ›F‘N‘Dñ )ð˜a �{�à�T—Z‘ZÓÙñ##rc óŠ—d|j›d|j›d|j›d|j›d|j›d� S)NzMagicRule(start=z, value=z, mask=z, word=z, range=rUrgrCs rrVzMagicRule.__repr__ñs/�à"&§*£*Ø"&§*£*Ø"&§)£)Ø"&§)£)Ø"&§*£*ð .ð .r)rZr[r\rˆrmÚreÚcompiler}Ú classmethodr†rŠr~r�rVrarrrereŽsH„Ø €Dòð �R—Z‘ZÐ >Ó?€Nàñ2@óð2@òhò ò ó,.rrecóB—eZdZdZd„Zd„Zd„Zed„«Zed„«Z y)Ú MagicMatchAnyz©Match any of a set of magic rules. This has a similar interface to MagicRule objects (i.e. its match() and maxlen() methods), to allow for duck typing. có—||_yr()Úrules)r*rŸs rrmzMagicMatchAny.__init__s €Øˆ� rcó@‡—tˆfd„|jD««S)Nc3ó@•K—|]}|j‰«–—Œy­wr()r~)rLÚrr�s €rrNz&MagicMatchAny.match..søèø€Ð7©J q�1—7‘7˜6—?©Jùsƒ)ÚanyrŸrŽs `rr~zMagicMatchAny.matchsø€ÜÓ7¨D¯JªJÓ7Ó7Ð7rcó:—td„|jD««S)Nc3ó<K—|]}|j«–—Œy­wr()rŠ)rLr¢s rrNz'MagicMatchAny.maxlen..sèø€Ð2¡z !�1—8‘8—:¡zùs‚)r‰rŸrCs rrŠzMagicMatchAny.maxlens€ÜÑ2 t§z¢zÓ2Ó2Ð2rcóž—|jd«}|jdd«g}|rW|dk7rR |jtj |««|jd«}|r|jdd«|r|dk7rŒRg}d|i}|D]%\}}g}||j||f«|||dz<Œ'|j |«S#t $rYŒywxYw)z/Read a set of rules from the binary magic file.réÿÿÿÿó[r)ÚreadÚseekÚappendrer†r`Úfrom_rule_tree) r$r�r—Ú depths_rulesÚtreeÚ insert_pointsÚdepthÚruleÚsubruless rr†zMagicMatchAny.from_file sä€ð �&‰&�‹)ˆØ �‰ˆr�1Œ ؈ Ù�A˜’Ið Ø×#Ñ#¤I×$7Ñ$7¸Ó$:Ô;ð�f‰f�Q‹iˆAÙØ—‘�r˜1” ñ�A˜“IðˆØ˜4˜ˆ Û'‰KˆE�4؈HØ ˜%Ñ × 'Ñ '¨¨xÐ(8Ô 9Ø%-ˆM˜% ™'Ò "ð(ð ×!Ñ! $Ó'Ð'øô*ò áð ús®$Cà C à C cóÀ—g}|D].\}}|r|j|«|_|j|«Œ0t|«dk(ryt|«dk(r|dS||«S)aFrom a nested list of (rule, subrules) pairs, build a MagicMatchAny instance, recursing down the tree. Where there's only one top-level rule, this is returned directly, to simplify the nested structure. Returns None if no rules were read. rNr)r¬rˆr«r{)r$r®rŸr±r²s rr¬zMagicMatchAny.from_rule_tree#sf€ðˆÛ"‰NˆD�(ÙØ×.Ñ.¨xÓ8�” Ø �L‰L˜Õ ð#ô ˆu‹:�qŠ=ØÜ ˆu‹:�qŠ=ؘ‘8ˆOÙ�5‹zÐrN) rZr[r\r]rmr~rŠr›r†r¬rarrr�r�ús>„ñò ò8ò3ðñ(óð(ð2ñóñrr�có4—eZdZd„Zd„Zd„Zdd„Zdd„Zd„Zy) ÚMagicDBcó,—tt«|_yr()rÚlistÚbytyperCs rrmzMagicDB.__init__8s€Ü#¤DÓ)ˆ� rcóT—t|d«5}|j«}|dk7r td«‚ |j«jd«}|snƒ|ddk7s|ddd k7r t d |«‚|d dj d «\}}t |«}t|«} tj|«}|€Œ…|j|j||f«Œ¥ ddd«y#t$r4|jj|d«tj|«}YŒjwxYw#1swYyxYw) zz"MagicDB.finalise..fs€¨¨1ªrT©ÚkeyÚreverseN)Úalltypesr¸Úitemsr«r‰rŠÚsort)r*rŠr%rŸrÆr±s rÚfinalisezMagicDB.finaliseXs„€ð ˆØˆŒ à ŸK™K×-Ñ-Ö/‰LˆE�5Û"‘ ��TØ— ‘ ×$Ñ$ c¨5°$Ð%7Ô8ܘV T§[¡[£]Ó3‘ñ#ð0𠈌 Ø � ‰ ×Ñ™~°tÐÕ.vs€ Q q¢Tr)rÐ)r¸r«rÔrÒr~) r*ÚdataÚmax_priÚmin_priÚpossiblerÚmtrÆr±ÚpriorityÚmimetypes rÚ match_datazMagicDB.match_datahs’€ð Р؈EÛ�Ø!%§¡¨R¤‘I�C˜Ø—L‘L # r¨4 Õ1ñ"1ðð �J‰J™>ˆJÕ *à—M‘MˆEã(-Ñ $ˆH�h à˜'Ò!ØØ˜'Ò!Ùà�z‰z˜$ÕØ’ñ).rcó¢—t|d«5}|j|j«}ddd«|j|||«S#1swYŒxYw)a¥Read data from the file and do magic sniffing on it. max_pri & min_pri can be used to specify the maximum & minimum priority rules to look for. possible can be a list of mimetypes to check, or None (the default) to check all mimetypes until one matches. Returns the MIMEtype found, or None if no entries match. Raises IOError if the file can't be opened. rºN)r¿r©rŠrß)r*r3rÙrÚrÛr�Úbufs rr~z MagicDB.match„sE€ô�$˜Ô  Ø—&‘&˜Ÿ™Ó%ˆC÷à�‰˜s G¨W°hÓ?Ð?÷Ð ús �AÁAcó2—dt|j«zS)Nz)r{rÒrCs rrVzMagicDB.__repr__’s€Ø%¬¨D¯M©MÓ(:Ñ:Ð:r)édrN) rZr[r\rmrÈrÕrßr~rVrarrrµrµ7s!„ò*ò7ò:=ó  ó8 @ó;rrµcó0—eZdZd„Zd„Zd„Zd„Zd„Zd„Zy)ÚGlobDBcó,—tt«|_y)z‘Prepare the GlobDB. It can't actually be used until .finalise() is called, but merge_file() can be used to add data before that. N)rrOÚallglobsrCs rrmzGlobDB.__init__–s€ô $¤CÓ(ˆ� rc ó°—|j}t|«5}|D]¤}|jd«rŒ|ddjd«}|dd\}}}t |«}t |«} t |«dkDr|djd«} nd} |dk(r|j| d«Œ…|| j||t| «f«Œ¦ ddd«y#1swYyxYw) z3Loads name matching information from a globs2 file.Ú#Nr§r¾rÚ,raÚ __NOGLOBS__) rçr¿r|rrvrr{rÃÚaddÚtuple) r*r3rçr�r‚ÚfieldsÚweightÚ type_nameÚpatternr%Úflagss rrÈzGlobDB.merge_file�sÇ€à—=‘=ˆÜ �$ŒZ˜1Û�Ø—?‘? 3Ô'¨à˜c˜r˜Ÿ™¨Ó-�Ø-3°B°Q¨ZÑ*�˜  7ܘV›�ܘyÓ)�Ü�v“; ’?Ø" 1™IŸO™O¨CÓ0‘Eà�Eà˜mÒ+à—L‘L ¨Ô-Øà˜‘×#Ñ# V¨W´e¸E³lÐ$CÕDñ#÷�Z‰Zús ˜B*C à Ccód—tt«|_tt«|_g|_i|_i|_|jj«D�]7\}}|j«}|D�]\}}}d|v}|jd«rc|dd}d|vsZd|vsVd|vsR|r!|j|j||f«n.|j|j«j||f«Œ€d|vsd|vsd|vr]|rdntj}tjt!j"|«|¬ «}|jj|||f«Œé|r||f|j |<Œý||f|j |j«<�Œ�Œ:|jj%d d „¬ «y) zzPrepare the GlobDB for matching. This should be called after all files have been merged into it. Úcsz*.r1NÚ*r¼Ú?r)ròTcó<—|dt|dj«fS)Nr1r)r{rñrÌs rrÎz!GlobDB.finalise..Üs€°Q°q±T¼3¸qÀ¹t¿|¹|Ó;LÑ4Mr)rÑrÐ)rr·ÚextsÚ cased_extsÚglobsÚliteralsÚcased_literalsrçrÓrIr|r«rr™ÚIršÚfnmatchÚ translaterÔ) r*r%rúrïrñròÚcasedÚrestÚre_flagss rrÕzGlobDB.finalise´s}€ô  ¤Ó%ˆŒ Ü%¤dÓ+ˆŒØˆŒ ؈Œ Ø ˆÔà ŸM™M×/Ñ/×1‰LˆE�5Ø—/‘/Ó#ˆ%Ü(-Ñ$ˆf�g˜uà˜E�MˆEà×!Ñ! $Ô'à˜q˜r�{�ؘt™  s¨d¡{°c¸T±kÙØŸ™¨Ñ-×4Ñ4°e¸V°_ÕEàŸ ™  $§*¡*£,Ñ/×6Ñ6¸¸v°ÔGØà�w‘ #¨¡.°C¸7±Ná %™1¬2¯4©4�ÜŸ*™*¤W×%6Ñ%6°wÓ%?ÀxÔP�Ø— ‘ ×!Ñ! 7¨E°6Ð":Õ;ñØ49¸6°?�D×'Ñ'¨Ò0à6;¸V°_�D—M‘M '§-¡-£/Ó2ò1).ð2ð: � ‰ �‰ Ñ*MˆÕOrcó\— t|j|««dS#t$rYywxYw)zTReturn the first match found for a given path, or None if no match is found.rN)ÚnextÚ _match_pathÚ StopIteration©r*r3s rÚ first_matchzGlobDB.first_matchÞs4€ð ܘ×(Ñ(¨Ó.Ó/°Ñ2Ð 2øÜò Ùð ús ‚Ÿ +ª+có6—t|j|««S)zèø€ä�w‰w×Ñ Ó%ˆð �4×&Ñ&Ñ &Ø×%Ñ% dÑ+Ò +à— ‘ “ ˆØ �D—M‘MÑ !Ø—-‘- Ñ&Ò &ðˆØØ—‘˜“ ˆAØ�1Šu�eØ�a˜!‘e�f�+ˆCØ�d—o‘oÑ%ØŸ?™?¨3Ô/�CØ“Ið0ð ðˆØØ—‘˜“ ˆAØ�1Šu�eØ�a˜‘c�d�)ˆCØ�d—i‘iÑØŸ9™9 Sœ>�CØ“Ið*ð ð+/¯*¬*Ñ &ˆU�I˜vØ�{‰{˜4Õ Ø  &Ð)Ó)ñ+5ùs ‚D$D0Ä' D0N) rZr[r\rmrÈrÕrr rrarrrårå•s#„ò)òEò.(PòTò,ó!*rråÚtextÚplainÚ applicationz octet-streamÚinodeÚ blockdeviceÚ chardeviceÚ directoryÚfifoÚsocketÚsymlinkÚdoorÚ executableFcó*—daiatt«at j tjjdd««D]K}t|d«5}|D].}|j«jdd«\}}|t|<Œ0 ddd«ŒMt«at j tjjdd««D]}tj|«Œtj!«t#«at j tjjdd««D]}t$j|«Œt$j!«t j tjjdd««D]Z}t|d«5}|D]=}|j«jdd«\}}t|j'|«Œ? ddd«Œ\y#1swY�Œ¿xYw#1swYŒtxYw) NTr,rGr¢rÚglobs2ÚmagicÚ subclasses)Ú_cache_uptodaterGrrOrPrr4r2r3r r¿r rrårúrÈrÕrµr$rì)r3r�r‚ÚaliasrIÚsubÚparents rÚ_cache_databaser*s�€ð€Oà€GÜœcÓ"€Kô×-Ñ-¬b¯g©g¯l©l¸6À9Ó.MÖNˆÜ �$˜Œ_ Û�Ø#'§:¡:£<×#5Ñ#5°d¸AÓ#>Ñ ��yØ!*”˜’ñ÷ˆ_ðOô ‹H€EÜ×-Ñ-¬b¯g©g¯l©l¸6À8Ó.LÖMˆÜ ×јÕðNä ‡N�NÔô ‹I€EÜ×-Ñ-¬b¯g©g¯l©l¸6À7Ó.KÖLˆÜ ×јÕðMä ‡N�NÔô×-Ñ-¬b¯g©g¯l©l¸6À<Ó.PÖQˆÜ �$˜Œ_ Û�Ø"Ÿj™j›l×0Ñ0°°qÓ9‘ ��VܘCÑ ×$Ñ$ VÕ,ñ÷ˆ_ñR÷%‰_ú÷&ˆ_úsÁ4G<Æ-AH Ç<H È H có&—ts t«yyr()r&r*rarrrFrF=s€Ý ÜÕð rcó@—t«tj|«S)z6Returns type of file by its name, or None if not known)rFrúr)r3s rÚget_type_by_namer-As€ä„NÜ × Ñ ˜TÓ "Ð"rcóD—t«tj|||«S)z:Returns type of file by its contents, or None if not known)rFr$r~)r3rÙrÚs rÚget_type_by_contentsr/Fs€ä„Nä �;‰;�t˜W gÓ .Ð.rcóD—t«tj|||«S)z0Returns type of the data, which should be bytes.)rFr$rß)rØrÙrÚs rÚget_type_by_datar1Ls€ä„Nä × Ñ ˜D '¨7Ó 3Ð3rcóR—tj|«rtStj|«rtStj |«rt Stj|«rtStj|«rtStj|«rtStS)z.Match special filesystem objects to Mimetypes.)ÚstatÚS_ISDIRÚ inode_dirÚS_ISCHRÚ inode_charÚS_ISBLKÚ inode_blockÚS_ISFIFOÚ inode_fifoÚS_ISLNKÚ inode_symlinkÚS_ISSOCKÚ inode_socketÚ inode_door)Úst_modes rÚ_get_type_by_statrBRsn€ä ‡|�|�GÔ¤YÐ.Ü �‰�gÔ ¤zÐ 1Ü �‰�gÔ ¤{Ð 2Ü �‰�wÔ ¬ Ð!2Ü �‰�gÔ ¤}Ð 4Ü �‰�wÔ ¬ Ð!4Ü ÐrcóÈ—t« |rtj|«}ntj|«}tj |j«r[t||¬«}|s t |«}|s t||¬«}|€.tj|j«dzrtSt S|St|j«S#t |«}|xst cYSxYw)aÔReturns type of file indicated by path. This function is *deprecated* - :func:`get_type2` is more accurate. :param path: pathname to check (need not exist) :param follow: when reading file, follow symbolic links :param name_pri: Priority to do name matches. 100=override magic This tries to use the contents of the file, and falls back to the name. It can also handle special filesystem objects like directories and sockets. )rÚ)rÙéI) rFr2r3Úlstatr-rÚS_ISREGrAr/ÚS_IMODEÚapp_exerB)r3ÚfollowÚname_priÚstrMs rÚget_typerL\s¸€ô„NðÙ Ü—‘˜“‰Bä—‘˜$“ˆBô  ‡|�|�B—J‘JÔä  ¨xÔ 8ˆÙÔ& tÓ,�!ÙÔ*¨4¸ÔB�!Ø ˆ9Ü�|‰|˜BŸJ™JÓ'¨%Ò/Ü�ä� Øˆä  §¡Ó,Ð,øð!Ü ˜TÓ "ˆØŠy”DÒús Œ-CÃC!có—t« |rtj|«ntj|«}tj|j«st|j«Sttj|«d„d¬«}|rS|dd}d}|ddD]\}}||krn|dz }Œ|d|}t|«dk(r|ddS|D��cgc]\}}|‘Œ }}}nd} tj||¬«} | r| S|r|ddStj"|j«dzrt$St'|«rt(St S#t$rt |«xst cYSwxYwcc}}w#t $rd} YŒ‚wxYw) a½Find the MIMEtype of a file using the XDG recommended checking order. This first checks the filename, then uses file contents if the name doesn't give an unambiguous MIMEtype. It can also handle special filesystem objects like directories and sockets. :param path: file path to examine (need not exist) :param follow: whether to follow symlinks :rtype: :class:`MIMEtype` .. versionadded:: 1.0 có —|dS)NrrarÌs rrÎzget_type2..šs€¸A¸aºDrTrÏrrN)rÛrD)rFr2r3rEÚOSErrorr-Ú octet_streamrFrArBÚsortedrúr r{r$r~rÀrGrHÚ is_text_filer) r3rIrKÚmtypesÚ max_weightr–rÜÚwrÛrMs rÚ get_type2rV�s{€ô„Nð6Ù$ŒR�W‰W�TŒ]¬"¯(©(°4«.ˆô �<‰<˜Ÿ ™ Ô #ä  §¡Ó,Ð,ä ”E×%Ñ% dÓ+±.È4Ô P€F٠ؘA‘Y˜q‘\ˆ Ø ˆØ˜A˜B“Z‰EˆB�Ø�:Š~ÙØ �‰F‰Að ð˜˜�ˆÜ ˆv‹;˜!Ò Ø˜!‘9˜Q‘<Ð á#)Ô*¡6™4˜2˜a’B 6ˆÒ*àˆðÜ �K‰K˜ xˆKÓ 0ˆñ ؈٠Ø�a‰y˜‰|ÐÜ �‰�b—j‘jÓ ! EÒ )܈ä# DÔ)ŒtÐ;¬|Ð;øôG ò6Ü Ó%Ò5¬Ò5ð6üó&+øô òØ Šðús)Œ,E à E,Ã&E2Å E)Å(E)Å2 FÅ?Fcóž— t|d«}|5t|jd««cddd«S#t$rYywxYw#1swYyxYw)zÖGuess whether a file contains text or binary data. Heuristic: binary if the first 32 bytes include ASCII control characters. This rule may change in future versions. .. versionadded:: 1.0 rºFé N)r¿rÀÚ_is_textr©)r3r�s rrRrR¸sK€ðÜ ��tÓ ˆò ܘŸ™˜r› Ó#÷ ‰øô òÙðú÷ ˆús‚ 4�A´ A¿AÁA có(—td„|D«« S)Nc3óXK—|]"}|dkxsd|cxkxrdkncxs|dk(–—Œ$y­w)rsérXéNra©rLÚbs rrNz_is_text..Ês.èø€ÐNÉÀA�q˜C‘xÒ? 3¨!¦?¨d¤?Ò?°a¸4±iÓ?Éùó‚(*©r£©rØs rrYrYÉs€ÜÑNÉÓNÓNÐNÐNrcó(—td„|D«« S)Nc3óXK—|]"}|dkxsd|cxkxrdkncxs|dk(–—Œ$y­w)ÚÚÚ ÚNrar^s rrNz_is_text..Ís7èø€ð+Ù%) ð˜F‘{ÒI f°Ö&:°FÔ&:ÒI¸aÀ6¹kÓIÙ%)ùr`rarbs rrYrYÌs!€Üñ+Ù%)ó+ó+ð+ð +rcóæ—t«tsYtt«at j j«D]'\}}|D]\}}t|j|«ŒŒ)dat|S)aBRetrieve the set of filename extensions matching a given MIMEtype. Extensions are returned without a leading dot, e.g. 'py'. If no extensions are registered for the MIMEtype, returns an empty set. The extensions are stored in a cache the first time this is called. .. versionadded:: 1.0 T) rFÚ_mime2ext_cache_uptodaterrOÚ_mime2ext_cacherúrørÓrì)rÞrrSr%Úprios rÚget_extensionsrmÓse€ô„NÝ #Ü%¤cÓ*ˆÜ Ÿ:™:×+Ñ+Ö-‰KˆC�Û%‘ ��tÜ Ñ&×*Ñ*¨3Õ/ñ &ð.ð$(Ð ä ˜8Ñ $Ð$rcó.—|dz }t|«5}|j«}ddd«tjj dd«}tjj ||«}t j |«D].} t|«5}|j«}ddd«k(sŒ.ydatjj t j|«|«}t|d«5}|j«ddd«d} tjtj| | t jd««r#tj|«td| z«‚y#1swY�ŒJxYw#1swYŒÙxYw#Y�Œ xYw#1swYŒ‰xYw) aCopy 'package_file' as ``~/.local/share/mime/packages/.xml.`` If package_file is None, install ``/.xml``. If already installed, does nothing. May overwrite an existing file with the same name (if the contents are different)r-Nr,ÚpackagesFrUzupdate-mime-databasez—The '%s' command returned an error code! Make sure you have the freedesktop.org shared MIME package: http://standards.freedesktop.org/shared-mime-info/)r¿r©r2r3r rr4r&Úsave_data_pathÚwriteÚspawnlpÚP_WAITÚunlinkÚ Exception) rÚ package_filer�Únew_dataÚ package_dirr=rÍÚold_dataÚnew_fileÚcommands rÚinstall_mime_infor|ésT€ð �6Ñ€Kä ˆlÔ ˜qØ—6‘6“8ˆ÷ ô—'‘'—,‘,˜v zÓ2€KÜ�w‰w�|‰|˜K¨Ó5€HÜ × *Ñ *¨8Ö 4ˆð Ü�a”˜AØŸ6™6›8�÷ð �xÓ Ù ð5ð€Oô�w‰w�|‰|œM×8Ñ8¸ÓEÀ{ÓS€Hô ˆh˜Ô  Ø �‰�Ô÷ ð%€GÜ ‡z�z”"—)‘)˜W g¬}×/KÑ/KÈFÓ/SÔTÜ � ‰ �(ÔÜðGàIPñQóRð RðU÷9 Ñ ú÷�ûð Ú ú÷ Ð ús;‘E* FÂE7ÂFÃ1F Å*E4Å7F Å<FÆFÆ Fr()rãr)Trã)T);r]r2r™r3rwrþr:rÚ xdg.LocaleÚxml.domrrÚ collectionsrr8rrørúrûr$rxr‘rrÚobjectrrÂr`rurcrer�rµrårrPr9r7r5r;r?r=r@rHr&r*rFr-r/r1rBrLrVrRrYrkrjrmr|rarrÚr�s™ðñó* Û Û Û ÛåÛç*Ý#à A€à €à €Ø €Ø €Ø €à ×јјaÑ€òCó $ôI5ˆvôI5ôV ˜Zô ô ˜ ô ÷i.ñi.ôX;�Fô;÷z\;ñ\;ô|v*ˆVôv*ñrˆf�gÓ€Ù�m ^Ó4€ Ù�W˜mÓ,€ Ù �G˜\Ó *€ Ù �7˜KÓ (€ Ù �G˜VÓ $€ Ù�g˜xÓ(€ Ù�w  Ó*€ Ù �G˜VÓ $€ Ù �  Ó -€à€ò -òDò#ó /ó 4ò ó#-óJ5<òn$ñ óOò+ð€Ø Ðò%ó,'Rr