§
   ºÔ –�bã                   óÀ   — d Z ddlZddlZddlZddlZddlZddlZddlm	c m
Z ddlZddlZddlZddlmZ dZdZdZdZej        fd„Zd	„ Zdd
„Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )a¿  Bytecode that Kodi does not make itself (docs/plan/skin-optimization, part E).

Kodi's Python never writes bytecode (`sys.dont_write_bytecode`), so a script start compiles every module it imports
again: this addon's and those of the Python libraries it needs (`requests` and what that pulls in is the largest
part). The release ZIP ships bytecode for the Python of Kodi 21. This service thread adds what is missing on this
device, once per version of the addon and of each library:

  * the addon itself, when the device's Python is another version than the shipped bytecode is for,
  * the libraries of the `script.module.*` addons this addon depends on, in their own folders.

Every file is hash-checked: Python compares it with its source on every import and ignores one that does not
belong to it. A stale file can therefore never run; the worst case is that a module is compiled as before.
A folder that cannot be written (a system addon) is left alone.
é    N)Ú	userfirstzplugin.video.milionarz@special://profile/addon_data/plugin.video.milionar/bytecode.jsonéZ   s      c                 ó6   — t          j        d| z   |¦  «         d S )Nu   [MilionÃ¡Å™ Skin] bytecode: )ÚxbmcÚlog)ÚmessageÚlevels     ú_/Users/chudy/Library/Application Support/Kodi/addons/plugin.video.milionar/wcs/skin/bytecode.pyÚ_logr   #   s    € Ý„HÐ+¨gÑ5°uÑ=Ô=Ð=Ð=Ð=ó    c                 óÐ  — 	 t          |d¦  «        5 }|                     d¦  «        }ddd¦  «         n# 1 swxY w Y   t          | d¦  «        5 }|                     ¦   «         }ddd¦  «         n# 1 swxY w Y   n# t          $ r Y dS w xY w|dd…         t          j        j        k    o=|dd…         t          k    o*|dd…         t          j                             |¦  «        k    S )zG`cached` is hash-checked bytecode of this Python for the source `path`.Úrbé   NFé   é   )ÚopenÚreadÚOSErrorÚ	importlibÚutilÚMAGIC_NUMBERÚCHECKEDÚsource_hash)ÚpathÚcachedÚhandleÚheaderÚsources        r
   Úvalidr   '   s`  € ðÝ�&˜$ÑÔð 	% 6Ø—[’[ ‘_”_ˆFð	%ð 	%ð 	%ñ 	%ô 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%øøøð 	%ð 	%ð 	%ð 	%å�$˜ÑÔð 	# Ø—[’[‘]”]ˆFð	#ð 	#ð 	#ñ 	#ô 	#ð 	#ð 	#ð 	#ð 	#ð 	#ð 	#øøøð 	#ð 	#ð 	#ð 	#øøåð ð ð Øˆuˆuðøøøà�2�A�2ŒJ�)œ.Ô5Ò5ð C¸&ÀÀ1À¼+ÍÒ:Pð CØ�q˜�t”¥	¤× :Ò :¸6Ñ BÔ BÒBðDsP   ‚A< ’4¨A< ´8¸A< »8¼A< ÁA0Á$A< Á0A4Á4A< Á7A4Á8A< Á<
B
Â	B
c                 óÊ  — dx}x}}t           j                             | ¦  «        r| g}nd„ t          j        | ¦  «        D ¦   «         }t	          |¦  «        D ]ˆ}t
          j                             |¦  «        }t          ||¦  «        r|dz  }Œ7	 t          j
        ||dt          j        j        ¬¦  «         |dz  }n# t          $ r |dz  }Y nw xY w|r |¦   «         r nŒ‰|||fS )zXMake the missing bytecode under `root` (a folder or one .py file): (made, kept, failed).r   c                 ó’   — g | ]D\  }}}|D ];}|                      d ¦  «        r$d|v¯t          j                             ||¦  «        ‘Œ<ŒES )z.pyÚ__pycache__)ÚendswithÚosr   Újoin)Ú.0ÚfolderÚdirectoriesÚnamesÚnames        r
   ú
<listcomp>z compile_tree.<locals>.<listcomp>:   sp   € ð \ð \ð \Ñ0J°¸ÀUØ"ð\ð \Ø d§m¢m°EÑ&:Ô&:ð\Ø?LÐTZÐ?ZÐ?Zõ ”—’˜f dÑ+Ô+Ø?ZÐ?ZÐ?ZÐ?Zr   é   T)ÚcfileÚdoraiseÚinvalidation_mode)r$   r   ÚisfileÚwalkÚsortedr   r   Úcache_from_sourcer   Ú
py_compileÚcompileÚPycInvalidationModeÚCHECKED_HASHÚ	Exception)ÚrootÚpauseÚmadeÚkeptÚfailedÚfilesr   r   s           r
   Úcompile_treer?   4   s1  € àÐ€DÐˆ4�&Ý	„w‡~‚~�dÑÔð \Ø�ˆˆð\ð \ÍbÌgÐVZÉmÌmð \ñ \ô \ˆå�u‘”ð ð ˆÝ”×1Ò1°$Ñ7Ô7ˆÝ��vÑÔð 	Ø�A‰IˆDØð	ÝÔ˜t¨6¸4Ý1;Ô1OÔ1\ð^ñ ^ô ^ð ^à�A‰IˆDˆDøÝð 	ð 	ð 	Ø�a‰KˆFˆFˆFð	øøøàð 	�U�U‘W”Wð 	ØˆEøØ��vÐÐs   Â,B<Â<CÃCc                 óô  — i | g}}|�ro	 t          j        t          j                             |                     ¦   «         d¦  «        ¦  «                             ¦   «                              d¦  «        }n# t          t           j	        f$ r Y Œ†w xY w|�| 
                    d¦  «        ng D ]Ë}|                     dd¦  «        }|                     d¦  «        r||v rŒ2	 t          j        |¦  «        }t          j        |                     d¦  «        ¦  «        }|                     d	¦  «        t          j                             |d
¦  «        f||<   |                     |¦  «         Œ¼# t&          $ r Y ŒÈw xY w|�°o|S )zoPaths of the `script.module.*` addons the addon needs, with those they need: {addon id: (version, lib folder)}.z	addon.xmlÚrequiresNÚimportÚaddonÚ zscript.module.r   ÚversionÚlib)ÚETÚparser$   r   r%   ÚpopÚgetrootÚfindr   Ú
ParseErrorÚfindallÚgetÚ
startswithÚ	xbmcaddonÚAddonÚxbmcvfsÚtranslatePathÚgetAddonInfoÚappendr8   )Ú
addon_pathÚfoundÚqueuerA   Únoder*   rC   r   s           r
   Ú	librariesrZ   L   s„  € à˜
�|ˆ5€EØ
ñ ð	Ý”x¥¤§¢¨U¯YªY©[¬[¸+Ñ FÔ FÑGÔG×OÒOÑQÔQ×VÒVÐWaÑbÔbˆHˆHøÝ�œÐ'ð 	ð 	ð 	ØˆHð	øøøà3;Ð3G�X×%Ò% hÑ/Ô/Ð/ÈRð 
	ð 
	ˆDØ—8’8˜G RÑ(Ô(ˆDØ—?’?Ð#3Ñ4Ô4ð ¸À¸¸ØðÝ!œ¨Ñ-Ô-�ÝÔ,¨U×-?Ò-?ÀÑ-GÔ-GÑHÔH�Ø$×1Ò1°)Ñ<Ô<½b¼g¿lºlÈ4ÐQVÑ>WÔ>WÐX��d‘Ø—’˜TÑ"Ô"Ð"Ð"øÝð ð ð Ø�ðøøøð ñ ð  €Ls%   ŠA)A4 Á4BÂBÃBE%Å%
E2Å1E2c           
      ó<  — t          j        t          ¦  «        }t          j        j        t          j        j         	                    ¦   «         t          t          |                     d¦  «        ifi d„ t          | ¦  «                             ¦   «         D ¦   «         ¤ŽdœS )z.What the bytecode on this device was made for.rE   c                 ó    — i | ]\  }\  }}||“ŒS © r]   )r&   r*   rE   Ú_libs       r
   ú
<dictcomp>zstate.<locals>.<dictcomp>g   s#   € ÐgÐgÐgÑ0E°±o°wÀ˜d GÐgÐgÐgr   )ÚpythonÚmagicÚaddons)rP   rQ   ÚADDON_IDÚsysÚimplementationÚ	cache_tagr   r   r   ÚhexÚdictrT   rZ   Úitems)rV   rC   s     r
   Ústaterj   b   s•   € åŒO�HÑ%Ô%€EÝÔ(Ô2½Y¼^Ô=X×=\Ò=\Ñ=^Ô=^Ý�H e×&8Ò&8¸Ñ&CÔ&CÐDð ið iØgÐgÍÐS]ÑI^ÔI^×IdÒIdÑIfÔIfÐgÑgÔgðið iðjð jð jr   c           	      ó  ‡ — ‰                       t          ¦  «        rdS t          j        t	          j        t          ¦  «                             d¦  «        ¦  «        }t          j        t          ¦  «        }t          |¦  «        }	 t          |d¬¦  «        5 }t          j        |¦  «        |k    r	 ddd¦  «         dS 	 ddd¦  «         n# 1 swxY w Y   n# t          t          f$ r Y nw xY wˆ fd„}g d¢}t          j                             |d¦  «        t          j                             |d¦  «        g}|d	„ t%          |¦  «                             ¦   «         D ¦   «         z  }|D ]k}‰                      ¦   «         r dS t          j                             |¦  «        r3t-          t/          ||¦  «        ¦  «        D ]\  }	}
||	xx         |
z  cc<   ŒŒlt          j        t          j                             |¦  «        d
¬¦  «         t          |dd¬¦  «        5 }t          j        ||¦  «         ddd¦  «         n# 1 swxY w Y   t7          d                     |d         |d         |d         |d         ¦  «        ¦  «         dS )zService thread.Nr   zutf-8)Úencodingc                  óØ   •— t          j        d¦  «        r+‰                      d¦  «        rdS t          j        d¦  «        °+t          j        ‰ ¦  «        rdS ‰                      d¦  «        S )NzPlayer.HasMediaé   Tg{®Gáz”?)r   ÚgetCondVisibilityÚwaitForAbortr   Úgive_way©Úmonitors   €r
   r:   zrun.<locals>.pausex   sv   ø€ ÝÔ$Ð%6Ñ7Ô7ð 	Ø×#Ò# AÑ&Ô&ð Ø�tõ Ô$Ð%6Ñ7Ô7ð 	õ Ô˜gÑ&Ô&ð 	Ø�4Ø×#Ò# DÑ)Ô)Ð)r   )r   r   r   Úwcszmd5crypt.pyc                 ó   — g | ]\  }}|‘ŒS r]   r]   )r&   Ú_versionrF   s      r
   r+   zrun.<locals>.<listcomp>‚   s   € ÐFÐFÐF‘m�h ˆcÐFÐFÐFr   T)Úexist_okÚwz3{} made, {} already there, {} left as they are ({})r   r,   é   r`   )rp   ÚFIRST_DELAYrR   rS   rP   rQ   rc   rT   ÚMARKERrj   r   ÚjsonÚloadr   Ú
ValueErrorr$   r   r%   rZ   ÚvaluesÚabortRequestedÚexistsÚ	enumerater?   ÚmakedirsÚdirnameÚdumpr   Úformat)rs   rV   ÚmarkerÚcurrentr   r:   ÚtotalsÚrootsr9   ÚindexÚvalues   `          r
   Úrunr�   j   s  ø€ à×Ò�KÑ(Ô(ð ØˆÝÔ&¥y¤µxÑ'@Ô'@×'MÒ'MÈfÑ'UÔ'UÑVÔV€JÝÔ"¥6Ñ*Ô*€FÝ�JÑÔ€GðÝ�& 7Ð+Ñ+Ô+ð 	¨vÝŒy˜Ñ Ô  GÒ+Ð+Øð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	Ø+ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	øøõ •ZÐ ð ð ð Øˆðøøøð*ð *ð *ð *ð *ð ˆYˆY€FÝŒW�\Š\˜* eÑ,Ô,­b¬g¯lªl¸:À}Ñ.UÔ.UÐV€EØ	ÐFÐF¥y°Ñ'<Ô'<×'CÒ'CÑ'EÔ'EÐFÑFÔFÑF€EØð 'ð 'ˆØ×!Ò!Ñ#Ô#ð 	ØˆFˆFÝŒ7�>Š>˜$ÑÔð 	'Ý )­,°t¸UÑ*CÔ*CÑ DÔ Dð 'ð '‘��uØ�u��” Ñ&��‘�øÝ„K•”—’ Ñ'Ô'°$Ð7Ñ7Ô7Ð7Ý	ˆf�c GÐ	,Ñ	,Ô	,ð #°ÝŒ	�'˜6Ñ"Ô"Ð"ð#ð #ð #ñ #ô #ð #ð #ð #ð #ð #ð #øøøð #ð #ð #ð #åÐ	>×	EÒ	EÀfÈQÄiÐQWÐXYÔQZÐ\bÐcdÔ\eÐgnÐowÔgxÑ	yÔ	yÑzÔzÐzÐzÐzsN   ÂC ÂC
Â0C Â>C Ã
CÃC ÃCÃC ÃC*Ã)C*ÈH9È9H=É H=c                 óÖ   — 	 t          | ¦  «         d S # t          $ rK}t          d                     t	          |¦  «        j        |¦  «        t          j        ¦  «         Y d }~d S d }~ww xY w)Nz{}: {})r�   r8   r   r†   ÚtypeÚ__name__r   Ú
LOGWARNING)rs   Úexcs     r
   Ú_guardedr“   �   su   € ðHÝˆG‰ŒˆˆˆøÝð Hð Hð HÝˆX�_Š_�T #™YœYÔ/°Ñ5Ô5µt´ÑGÔGÐGÐGÐGÐGÐGÐGÐGøøøøðHøøøs   ‚ “
A(�A A#Á#A(c                 óf   — t          j        t          | fdd¬¦  «                             ¦   «          d S )Nzmilionar-bytecodeT)ÚtargetÚargsr*   Údaemon)Ú	threadingÚThreadr“   Ústartrr   s    r
   rš   rš   –   s2   € ÝÔ�H¨G¨:Ð<OÐX\Ð]Ñ]Ô]×cÒcÑeÔeÐeÐeÐer   )N)Ú__doc__Úimportlib.utilr   r|   r$   r4   rd   r˜   Úxml.etree.ElementTreeÚetreeÚElementTreerG   r   rP   rR   Úwcs.skinr   rc   r{   rz   r   ÚLOGINFOr   r   r?   rZ   rj   r�   r“   rš   r]   r   r
   ú<module>r¢      sT  ððð ð Ð Ð Ð Ø €€€Ø 	€	€	€	Ø Ð Ð Ð Ø 
€
€
€
Ø Ð Ð Ð Ø "Ð "Ð "Ð "Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ø €€€Ø Ð Ð Ð Ð Ð à"€Ø	K€Ø€Ø
€ð œð >ð >ð >ð >ð
Dð 
Dð 
Dðð ð ð ð0ð ð ð,jð jð jð"{ð "{ð "{ðJHð Hð Hðfð fð fð fð fr   