§
    [ö6iR?  ã                   ó–  — d Z ddlZej                             dddd¦  «        Zej                             dd¦  «        Zej                             dd	¦  «        Zd
ZdZdZ	dZ
dZdZdZdZdZdZd
ZdZdZd
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„ Zd„ Zd„ Z d%d„Z!d„ Z"eeeefd„Z#d„ Z$d„ Z%d„ Z&eefd „Z'eefd!„Z(d"„ Z)d#„ Z*d$„ Z+dS )&z´
This script can be used to help validate that all of the:
(1) animations used in animation groups are in fact available
(2) audio events used in animations are in fact available.
é    Nzvictor-audio-assetsÚmetadataÚDev_MaczSoundbanksInfo.xmlzanimation-assetsÚ
animationsÚanimationGroupsÚNameÚRobotAudioKeyFrameÚ	audioNameÚaudioEventIdÚtriggerTime_msÚdurationTime_msÚeventGroupsÚeventIdsÚ
SoundBanksÚIncludedEventsÚIdÚ
Animationsc                 óœ   ‡— g }t          j        | ¦  «        D ]3\  Š}}d„ |D ¦   «         }|                     ˆfd„|D ¦   «         ¦  «         Œ4|S )Nc                 ó<   — g | ]}|                      d ¦  «        ¯|‘ŒS )z.tar)Úendswith©Ú.0Úxs     úJ/home/metal/girl-os/anki/victor/project/buildScripts/validate_anim_data.pyú
<listcomp>z!get_tar_files.<locals>.<listcomp>5   s)   € Ð@Ð@Ð@˜1¨Q¯ZªZ¸Ñ-?Ô-?Ð@�QÐ@Ð@Ð@ó    c                 óP   •— g | ]"}t           j                             ‰|¦  «        ‘Œ#S © )ÚosÚpathÚjoin)r   r   Údir_names     €r   r   z!get_tar_files.<locals>.<listcomp>6   s)   ø€ ÐKÐKÐK¸A�bœgŸlšl¨8°QÑ7Ô7ÐKÐKÐKr   )r   ÚwalkÚextend)Úroot_dirÚall_tar_filesÚsubdir_listÚ	file_listÚ	tar_filesr!   s        @r   Úget_tar_filesr)   2   so   ø€ Ø€MÝ,.¬G°HÑ,=Ô,=ð Mð MÑ(ˆ�+˜yØ@Ð@ 	Ð@Ñ@Ô@ˆ	Ø×ÒÐKÐKÐKÐKÀÐKÑKÔKÑLÔLÐLÐLØÐr   c                 óÔ   — i }| D ]b}t           j                             |¦  «        }||v r7||                              |¦  «         t	          d|›d||         ›�¦  «         Œ\|g||<   Œc|S )NzALERT: Multiple 'z' files found: )r   r   ÚbasenameÚappendÚprint)r'   Ú	file_dictÚone_fileÚ	file_names       r   Úfill_file_dictr1   :   s‰   € Ø€IØð .ð .ˆÝ”G×$Ò$ XÑ.Ô.ˆ	Ø˜	Ð!Ð!Ø�iÔ ×'Ò'¨Ñ1Ô1Ð1ÝˆE¸Y¸Y¸YÈ	ÐR[ÔH\ÐH\Ð]Ñ_Ô_Ð_Ð_à$, :ˆI�iÑ Ð ØÐr   c                 ó˜  — g }| rt           j                             | ¦  «        st          d| z  ¦  «        ‚t	          j        ¦   «         }t          j        | ¦  «        5 }|                     |¦  «         |D ]<}t           j         	                    ||j
        ¦  «        }|                     |¦  «         Œ=	 d d d ¦  «         n# 1 swxY w Y   |S )NzInvalid TAR file provided: %s)r   r   ÚisfileÚ
ValueErrorÚtempfileÚmkdtempÚtarfileÚopenÚ
extractallr    Únamer,   )Útar_fileÚunpacked_filesÚdest_dirÚtarÚmembers        r   Úunpack_tarballr@   F   s  € Ø€NØð E�2œ7Ÿ>š>¨(Ñ3Ô3ð EÝÐ8¸8ÑCÑDÔDÐDÝÔÑ!Ô!€HÝ	Œ�hÑ	Ô	ð * 3Ø�Š�xÑ Ô Ð Øð 	*ð 	*ˆFÝ”W—\’\ (¨F¬KÑ8Ô8ˆFØ×!Ò! &Ñ)Ô)Ð)Ð)ð	*ð*ð *ð *ñ *ô *ð *ð *ð *ð *ð *ð *øøøð *ð *ð *ð *ð
 Ðs   ÁAB?Â?CÃCTc                 óœ  — t          j        | ¦  «        }g }|D ]²}|                     t           j        ¦  «        rŒ"t           j                             | |¦  «        }t           j                             |¦  «        r$|                     t          ||¦  «        ¦  «         Œ…|r| 	                    |¦  «         Œ�| 	                    |¦  «         Œ³|S )z×
    Given a directory path, eg. "EXTERNALS/animation-assets/animationGroups",
    this function will recursively search that directory and return a list
    of all animation groups (.json files) that it finds.
    )
r   ÚlistdirÚ
startswithÚextsepr   r    Úisdirr#   Úget_anim_groupsr,   )Úanim_group_dirÚreturn_full_pathsÚdir_contentsÚanim_groupsÚ
anim_groupÚ	full_paths         r   rF   rF   S   sË   € õ ”:˜nÑ-Ô-€LØ€KØ"ð 
/ð 
/ˆ
Ø× Ò ¥¤Ñ+Ô+ð 	ØÝ”G—L’L °Ñ<Ô<ˆ	ÝŒ7�=Š=˜Ñ#Ô#ð 	/Ø×Ò�¨yÐ:KÑLÔLÑMÔMÐMÐMà ð /Ø×"Ò" 9Ñ-Ô-Ð-Ð-à×"Ò" :Ñ.Ô.Ð.Ð.ØÐr   c                 óä  — t          | d¦  «        5 }|                     ¦   «         }t          j        dt          j        |¦  «        }t          j        dt          j        |¦  «        }t          j        |¦  «        }d d d ¦  «         n# 1 swxY w Y   |t                   }d„ |D ¦   «         }t          j	         
                    | ¦  «        }t          j	                             |¦  «        d         }||fS )NÚrz//.*\nz#.*\nc                 ó(   — g | ]}|t                    ‘ŒS r   )ÚANIM_NAME_ATTRr   s     r   r   z+get_clips_in_anim_group.<locals>.<listcomp>q   s   € Ð8Ð8Ð8¨�!•NÔ#Ð8Ð8Ð8r   r   )r8   ÚreadÚreÚsubr   ÚlinesepÚjsonÚloadsÚANIM_GROUP_JSON_TOP_KEYr   r+   Úsplitext)Ú	json_fileÚfhÚ	json_datarK   Ú
anim_clipsÚanim_group_names         r   Úget_clips_in_anim_groupr^   j   s  € Ý	ˆi˜Ñ	Ô	ð + Ø—G’G‘I”Iˆ	Ý”F˜9¥b¤j°)Ñ<Ô<ˆ	Ý”F˜8¥R¤Z°Ñ;Ô;ˆ	Ý”Z 	Ñ*Ô*ˆ
ð	+ð +ð +ñ +ô +ð +ð +ð +ð +ð +ð +øøøð +ð +ð +ð +ð
 Õ3Ô4€JØ8Ð8¨ZÐ8Ñ8Ô8€JÝ”g×&Ò& yÑ1Ô1€OÝ”g×&Ò& Ñ7Ô7¸Ô:€OØ˜ZÐ(Ð(s   ‘A)BÂB
ÂB
c                 ój  — g }| rt           j                             | ¦  «        st          d| z  ¦  «        ‚t	          | d¦  «        5 }|                     ¦   «         }ddd¦  «         n# 1 swxY w Y   |                     ¦   «         }t          j        |¦  «        }| 	                    |¦  «        D ]ƒ}	|	 	                    |¦  «        D ]k}
|
D ]f}| 
                    |¦  «        }|                     ¦   «         }| 
                    |¦  «        }t          |¦  «        }|                     ||f¦  «         ŒgŒlŒ„|S )z`
    Use this function to parse the SoundbanksInfo.xml file that contains audio event info.
    zInvalid XML file provided: %srN   N)r   r   r3   r4   r8   rQ   ÚstripÚETÚ
fromstringÚiterÚgetÚlowerÚintr,   )Úxml_fileÚsound_banks_attrÚincluded_events_attrÚaudio_event_name_attrÚaudio_event_id_attrÚall_audio_eventsrZ   Úxml_dataÚrootÚsound_banksÚ
all_eventsÚeventÚ
event_nameÚevent_ids                 r   Ú,get_audio_events_in_soundbanks_info_xml_filert   w   s‹  € ð Ðàð E�2œ7Ÿ>š>¨(Ñ3Ô3ð EÝÐ8¸8ÑCÑDÔDÐDÝ	ˆh˜Ñ	Ô	ð  Ø—7’7‘9”9ˆðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð à�~Š~ÑÔ€HåŒ=˜Ñ"Ô"€DØ—y’yÐ!1Ñ2Ô2ð 
@ð 
@ˆØ%×*Ò*Ð+?Ñ@Ô@ð 		@ð 		@ˆJØ#ð @ð @�ð #ŸYšYÐ'<Ñ=Ô=�
Ø'×-Ò-Ñ/Ô/�
Ø Ÿ9š9Ð%8Ñ9Ô9�Ý˜x™=œ=�Ø ×'Ò'¨°XÐ(>Ñ?Ô?Ð?Ð?ð@ð		@ð Ðó   ÁA'Á'A+Á.A+c           
      ó  — d„ |D ¦   «         }g }g }| rt           j                             | ¦  «        st          d| z  ¦  «        ‚t	          | d¦  «        5 }t          j        |¦  «        }ddd¦  «         n# 1 swxY w Y   t          |                     ¦   «         ¦  «        D ]Ü\  }}t          |¦  «        }|D ]Å}		 t          |	t                   ¦  «        }
n# t          $ r Y Œ*w xY w|
t          k    rŒ	 |	t                   }|	t                   }t          |||||¦  «         Œh# t          $ rP g }t           |	v rB|	t                    D ]4}|                     |t$                   ¦  «         t'          ||||¦  «         Œ5Y ŒÁw xY wŒÆŒÝ||fS )a’  
    Given an animation JSON file and a list of all available audio
    events, this function will parse the animation file to
    determine what audio events it uses.  It will then return a
    tuple of two lists:

    (available_events, unavailable_events)

    The first list is valid audio events in the animation. The second
    list is the audio events in the animation that are unavailable.
    c                 ó   — g | ]
}|d          ‘ŒS )é   r   r   s     r   r   z1get_audio_event_usage_in_anim.<locals>.<listcomp>¢   s   € ÐBÐBÐB¨˜q œtÐBÐBÐBr   úInvalid JSON file provided: %srN   N)r   r   r3   r4   r8   rU   ÚloadÚlistÚitemsÚstrÚKEYFRAME_TYPE_ATTRÚKeyErrorÚAUDIO_KEYFRAME_TYPEÚAUDIO_EVENT_NAMES_ATTRÚAUDIO_EVENT_ID_ATTRÚ_check_using_event_nameÚEVENT_GROUPS_ATTRr#   ÚEVENT_IDS_ATTRÚ_check_using_event_id)rY   Úall_available_eventsÚall_available_event_idsÚavailable_eventsÚunavailable_eventsrZ   ÚcontentsÚ	anim_clipÚ	keyframesÚkeyframeÚkeyframe_typeÚaudio_eventsÚ	audio_idsÚeventss                 r   Úget_audio_event_usage_in_animr“   –   s>  € ð CÐBÐ-AÐBÑBÔBÐØÐØÐØð G�BœGŸNšN¨9Ñ5Ô5ð GÝÐ9¸IÑEÑFÔFÐFÝ	ˆi˜Ñ	Ô	ð ! Ý”9˜R‘=”=ˆð!ð !ð !ñ !ô !ð !ð !ð !ð !ð !ð !øøøð !ð !ð !ð !å $ X§^¢^Ñ%5Ô%5Ñ 6Ô 6ð Rð RÑˆ	�9å˜	‘N”Nˆ	Ø!ð 	Rð 	RˆHðÝ # HÕ-?Ô$@Ñ AÔ A��øÝð ð ð ð
 �ðøøøð Õ 3Ò3Ð3ðRØ#+Õ,BÔ#C�Lð !)Õ)<Ô =�IÝ+¨L¸)ÐEYØ,<Ð>PñRô Rð Rð Røõ  ð Xð Xð Xà "�IÝ(¨HÐ4Ð4Ø&.Õ/@Ô&Að Xð X˜FØ%×,Ò,¨VµNÔ-CÑDÔDÐDÝ1°)Ð=TØ2BÐDVñXô Xð Xð XøøðXøøøð 4ð	Rð4 Ð0Ð1Ð1s7   ÁA5Á5A9Á<A9Â:CÃ
C"Ã!C"Ã1DÄAE9Å8E9c                 ó”   — | D ]D}t          |¦  «        }||v r|                     d |f¦  «         Œ-|                     d |f¦  «         ŒEd S )N)rf   r,   )r‘   rˆ   r‰   rŠ   Úaudio_ids        r   r†   r†   É   sj   € Øð 8ð 8ˆÝ�x‘=”=ˆàÐ.Ð.Ð.Ø×#Ò# T¨8Ð$4Ñ5Ô5Ð5Ð5à×%Ò% t¨XÐ&6Ñ7Ô7Ð7Ð7ð8ð 8r   c                 ó¤  — t          | ¦  «        t          |¦  «        k    rt          dt          ›dt          ›�¦  «        ‚t	          t          | ¦  «        ¦  «        D ]s}t          | |         ¦  «                             ¦   «         }t          ||         ¦  «        }||f|v r|                     ||f¦  «         Œ\|                     ||f¦  «         Œtd S )NzBad audio keyframe in z5 has mismatched number of audio event IDs and names: )	Úlenr4   rY   rŽ   Úranger}   re   rf   r,   )r�   r‘   r‡   r‰   rŠ   ÚidxÚaudio_eventr•   s           r   rƒ   rƒ   Ó   sæ   € å
ˆ<ÑÔ�C 	™NœNÒ*Ð*ÝˆjÝ6?°i°iÅÀðKñ Lô Lð 	Lå•S˜Ñ&Ô&Ñ'Ô'ð 
?ð 
?ˆõ ˜, sÔ+Ñ,Ô,×2Ò2Ñ4Ô4ˆÝ�y ”~Ñ&Ô&ˆà˜Ð"Ð&:Ð:Ð:Ø×#Ò# [°(Ð$;Ñ<Ô<Ð<Ð<à×%Ò% {°HÐ&=Ñ>Ô>Ð>Ð>ð
?ð 
?r   c           	      óÄ  — d}g }t           j                             | |¦  «        }t          |¦  «        }|sd|z  }t	          ||z  ¦  «        ‚t          |¦  «        }t          |                     ¦   «         ¦  «        D ]þ\  }	}
|
d         }t          |¦  «        }|D ]W}| 	                    t           j         
                    t           j                             |¦  «        ¦  «        d         ¦  «         ŒX	 t          t          t           j        |¦  «        ¦  «         t          j        t           j                             |d         ¦  «        ¦  «         ŒÖ# t           $ r}t#          d|z  ¦  «         Y d}~Œ÷d}~ww xY wi }t           j                             | |¦  «        }t%          |¦  «        }|sd|z  }t	          ||z  ¦  «        ‚|D ]�}	 t'          |¦  «        \  }}n%# t          $ r d|z  }t	          ||z  ¦  «        ‚w xY wg }|D ]}||vr| 	                    |¦  «         Œ|r$t           j                             |¦  «        }|||<   Œ‚|rd}t)          ||¦  «         dS dS )	z…
    This function will raise ValueError with relevant info if any
    animation groups use any animations that are unavailable.
    zBUnable to validate animations used in animation groups because: %súNo tar files available in %sr   ú6WARNING: Failed to cleanup temp files or directory: %sNz#No animation groups available in %szUnable to parse %szDFound unavailable animations used in the following animation groups:)r   r   r    r)   r4   r1   r{   r|   r@   r,   rX   r+   ÚmapÚremoveÚrmdirÚdirnameÚOSErrorr-   rF   r^   Úreport_problems)Úexternals_dirÚanim_assets_dirÚanim_group_assets_dirÚproblem_msgÚ	all_animsÚtar_files_dirr(   Ú	this_probÚtar_file_dictr0   Ú
file_pathsÚ	file_pathr<   rY   ÚeÚproblemsÚanim_groups_dirrJ   rK   r]   r\   Úunavailable_animsrŒ   Ú	msg_titles                           r   Úcheck_anims_all_anim_groupsr³   å   s¹  € ð W€Kð €IÝ”G—L’L °Ñ@Ô@€MÝ˜mÑ,Ô,€IØð 2Ø2°]ÑBˆ	Ý˜ yÑ0Ñ1Ô1Ð1Ý" 9Ñ-Ô-€MÝ!% m×&9Ò&9Ñ&;Ô&;Ñ!<Ô!<ð 	Rð 	RÑˆ	�:Ø˜q”Mˆ	Ý'¨	Ñ2Ô2ˆØ'ð 	Oð 	OˆIØ×Ò�RœW×-Ò-­b¬g×.>Ò.>¸yÑ.IÔ.IÑJÔJÈ1ÔMÑNÔNÐNÐNð	RÝ••R”Y Ñ/Ô/Ñ0Ô0Ð0ÝŒH•R”W—_’_ ^°AÔ%6Ñ7Ô7Ñ8Ô8Ð8Ð8øÝð 	Rð 	Rð 	RÝÐKÈaÑOÑQÔQÐQÐQÐQÐQÐQÐQøøøøð	Røøøð
 €HÝ”g—l’l =Ð2GÑHÔH€OÝ! /Ñ2Ô2€KØð 2Ø9¸OÑKˆ	Ý˜ yÑ0Ñ1Ô1Ð1Ø!ð :ð :ˆ
ð	6Ý*AÀ*Ñ*MÔ*MÑ'ˆO˜Z˜ZøÝð 	6ð 	6ð 	6Ø,¨zÑ9ˆIÝ˜[¨9Ñ4Ñ5Ô5Ð5ð	6øøøð ÐØ#ð 	4ð 	4ˆIØ 	Ð)Ð)Ø!×(Ò(¨Ñ3Ô3Ð3øØð 	:Ý œg×.Ò.¨zÑ:Ô:ˆOØ(9ˆH�_Ñ%øàð -ØZˆ	Ý˜ )Ñ,Ô,Ð,Ð,Ð,ð-ð -s%   Ã4AEÅ
E9ÅE4Å4E9ÇGÇ"H c                 óÊ  — d}t           j                             | |¦  «        }	 t          |¦  «        }n<# t          t
          t          t          j        f$ r}t          ||z  ¦  «        ‚d}~ww xY wi }t           j                             | |¦  «        }t          |¦  «        }|sd|z  }	t          ||	z  ¦  «        ‚t          |¦  «        }
t          |
                     ¦   «         ¦  «        D ]â\  }}|d         }t          |¦  «        }|D ];}t          ||¦  «        \  }}|r$t           j                             |¦  «        }|||<   Œ<	 t          t!          t           j        |¦  «        ¦  «         t          j        t           j                             |d         ¦  «        ¦  «         Œº# t
          $ r}t)          d|z  ¦  «         Y d}~ŒÛd}~ww xY w|rd}t+          ||¦  «         dS dS )z�
    This function will raise ValueError with relevant info if any
    animations use any audio events that are unavailable.
    z>Unable to validate audio events used in animations because: %sNrœ   r   r�   z@Found unavailable audio events used in the following animations:)r   r   r    rt   ÚIOErrorr¢   r4   ra   Ú
ParseErrorr)   r1   r{   r|   r@   r“   r+   rž   rŸ   r    r¡   r-   r£   )r¤   r¥   Úsoundbanks_xml_filer§   rl   r®   r¯   r©   r(   rª   r«   r0   r¬   r­   r<   rY   r‰   rŠ   Ú	anim_namer²   s                       r   Úcheck_audio_events_all_animsr¹     s  € ð S€Kõ œ'Ÿ,š, }Ð6IÑJÔJÐð*ÝGÐH[Ñ\Ô\ÐÐøÝ•W�j­"¬-Ð8ð *ð *ð *Ý˜ q™Ñ)Ô)Ð)øøøøð*øøøð
 €HÝ”G—L’L °Ñ@Ô@€MÝ˜mÑ,Ô,€IØð 2Ø2°]ÑBˆ	Ý˜ yÑ0Ñ1Ô1Ð1Ý" 9Ñ-Ô-€MÝ!% m×&9Ò&9Ñ&;Ô&;Ñ!<Ô!<ð Rð RÑˆ	�:Ø˜q”Mˆ	Ý'¨	Ñ2Ô2ˆØ'ð 	9ð 	9ˆIå3PÐQZÐ\lÑ3mÔ3mÑ0ÐÐ0Ø!ð 9ÝœG×,Ò,¨YÑ7Ô7�	Ø&8�˜Ñ#øð	RÝ••R”Y Ñ/Ô/Ñ0Ô0Ð0ÝŒH•R”W—_’_ ^°AÔ%6Ñ7Ô7Ñ8Ô8Ð8Ð8øÝð 	Rð 	Rð 	RÝÐKÈaÑOÑQÔQÐQÐQÐQÐQÐQÐQøøøøð	Røøøð ð -ØVˆ	Ý˜ )Ñ,Ô,Ð,Ð,Ð,ð-ð -s.   ¤4 ´"A-ÁA(Á(A-ÅAF$Æ$
G
Æ.GÇG
c                 óh  — g }t          |                      ¦   «         ¦  «        D ]–\  }}g }|D ]X}t          |t          ¦  «        r|                     |¦  «         Œ-|d         }|d         }|                     |›d|›d�¦  «         ŒY|r2d|z  }	|	d                     |¦  «        z  }	|                     |	¦  «         Œ—|                     ¦   «          t          j        dz  }	|	|z  }	|	t          j        z  }	|	t          j                             |¦  «        z  }	|	t          j        z  }	t          |	¦  «         d S )Nr   rx   z (ú)z	%s uses: z, é   )
r{   r|   Ú
isinstancer}   r,   r    Úsortr   rT   r-   )
r¯   r²   ÚmsgsÚ	containerÚunavailable_contentsÚformatted_contentsÚcontentÚcontent_nameÚ
content_idÚmsgs
             r   r£   r£   H  sB  € Ø€DÝ+/°·²Ñ0@Ô0@Ñ+AÔ+Að ð Ñ'ˆ	Ð'ØÐØ+ð 	Rð 	RˆGÝ˜'¥3Ñ'Ô'ð RØ"×)Ò)¨'Ñ2Ô2Ð2Ð2à& qœz�Ø$ QœZ�
Ø"×)Ò)°|°|°|ÀZÀZÀZÐ*PÑQÔQÐQÐQØð 	Ø 	Ñ)ˆCØ�4—9’9Ð/Ñ0Ô0Ñ0ˆCØ�KŠK˜ÑÔÐøØ‡I‚I�K„K€KÝ
Œ*�q‰.€CØˆ9Ñ€CØ�2Œ:Ñ€CØ�2Œ:�?Š?˜4Ñ Ô Ñ €CØ�2Œ:Ñ€Cå	ˆ#�J„J€J€J€Jr   c                 ó¾   — d}| D ]W}	 |t                    }n# t          $ r Y Œw xY w	 |t                   }n# t          $ r d}Y nw xY w||z   }t          ||¦  «        }ŒX|S )Nr   )ÚTRIGGER_TIME_ATTRr   ÚDURATION_TIME_ATTRÚmax)Úkeyframe_listÚanim_lengthrŽ   Útrigger_time_msÚduration_time_msÚkeyframe_length_mss         r   Úget_anim_lengthrÐ   b  s§   € Ø€KØ!ð 
;ð 
;ˆð	Ø&Õ'8Ô9ˆOˆOøÝð 	ð 	ð 	ØˆHð	øøøð	!Ø'Õ(:Ô;ÐÐøÝð 	!ð 	!ð 	!Ø ÐÐÐð	!øøøà,Ð/?Ñ?ÐÝ˜+Ð'9Ñ:Ô:ˆˆØÐs   ˆ–
#¢#§5µAÁAc                 ó  — i }| rt           j                             | ¦  «        st          d| z  ¦  «        ‚t	          | d¦  «        5 }t          j        |¦  «        }d d d ¦  «         n# 1 swxY w Y   t          |                     ¦   «         ¦  «        D ]v\  }}t          |¦  «        }t          |¦  «        }t          |t          ¦  «        s9|t          |¦  «        k    rt          |¦  «        }nt          d|›d|›d�¦  «         |||<   Œw|S )Nry   rN   zWARNING: The length of 'z' is not an integer (length = r»   )r   r   r3   r4   r8   rU   rz   r{   r|   r}   rÐ   r½   rf   r-   )rY   Úanim_name_length_mappingrZ   r‹   r¸   r�   rÌ   s          r   Úget_anim_name_and_lengthrÓ   r  sV  € Ø!ÐØð G�BœGŸNšN¨9Ñ5Ô5ð GÝÐ9¸IÑEÑFÔFÐFÝ	ˆi˜Ñ	Ô	ð ! Ý”9˜R‘=”=ˆð!ð !ð !ñ !ô !ð !ð !ð !ð !ð !ð !øøøð !ð !ð !ð !å $ X§^¢^Ñ%5Ô%5Ñ 6Ô 6ð 	:ð 	:Ñˆ	�9Ý˜	‘N”Nˆ	Ý% iÑ0Ô0ˆÝ˜+¥sÑ+Ô+ð 	3Ø�c +Ñ.Ô.Ò.Ð.Ý! +Ñ.Ô.��å�Ø"˜˜ K K Kð1ñ 3ô 3ð 3à.9Ð  Ñ+Ð+Ø#Ð#ru   )T),Ú__doc__r   r   r    ÚSOUNDBANKS_XML_FILEÚANIM_ASSETS_DIRÚANIM_GROUP_ASSETS_DIRr~   r€   r�   r‚   rÈ   rÉ   r„   r…   ÚSOUND_BANKS_XML_ATTRÚINCLUDED_EVENTS_XML_ATTRÚAUDIO_EVENT_NAME_XML_ATTRÚAUDIO_EVENT_ID_XML_ATTRrW   rP   rR   r7   rU   Úxml.etree.ElementTreeÚetreeÚElementTreera   r5   Úzipfiler)   r1   r@   rF   r^   rt   r“   r†   rƒ   r³   r¹   r£   rÐ   rÓ   r   r   r   ú<module>rà      s#  ððð ð 
€	€	€	ð ”g—l’lÐ#8¸*ÀiÐQeÑfÔfÐ ð ”'—,’,Ð1°<Ñ@Ô@€ð œŸšÐ%7Ð9JÑKÔKÐ ð Ð Ø*Ð Ø$Ð Ø$Ð Ø$Ð Ø&Ð Ø!Ð Ø€ð $Ð Ø+Ð Ø"Ð ØÐ ð 'Ð Ø€ð 
€	€	€	Ø €€€Ø €€€Ø "Ð "Ð "Ð "Ð "Ð "Ð "Ð "Ð "Ø €€€Ø €€€ðð ð ð	ð 	ð 	ð
ð 
ð 
ðð ð ð ð.
)ð 
)ð 
)ð MaØF^ØG`ØE\ðð ð ð ð>02ð 02ð 02ðf8ð 8ð 8ð?ð ?ð ?ð$ @OØ6Kð3-ð 3-ð 3-ð 3-ðl APØ5Hð*-ð *-ð *-ð *-ðZð ð ð4ð ð ð $ð $ð $ð $ð $r   