� L�g!�����ddlmZddlZddlZddlZddlmZmZddlZddl Z ddl Z ddl m Z m Z ddlmZmZddlZddlmZ ddlmZn #ddlmZYnxYwdd lmZ dd lmZn #eZYnxYwdd lmZmZmZmZmZmZdd l m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'e j(d kre)Z*e+Z,eZGd�de-��Z.d�Z/ddd�Z0edgd���Z1edgd���Z2d�Z3dd�Z4d�Z5Gd�de-��Z6ddl7m8Z8dS)�)�divisionN)� TemporaryFile�NamedTemporaryFile�)�log_conversion�log_subprocess_output)�mediainfo_json�fsdecode)� namedtuple)�StringIO)�BytesIO)�izip)�_fd_or_path_or_tempfile� db_to_float� ratio_to_db�get_encoder_name�get_array_type�audioop)�TooManyMissingFrames�InvalidDuration�InvalidID3TagVersion� InvalidTag�CouldntDecodeError�CouldntEncodeError�MissingAudioParameter)�rc�*�eZdZdd�Zdd�Zd�Zd�ZdS)�ClassPropertyDescriptorNc�"�||_||_dS�N)�fget�fset)�selfr!r"s �c/home/asafur/pinokio/api/open-webui.git/app/env/lib/python3.11/site-packages/pydub/audio_segment.py�__init__z ClassPropertyDescriptor.__init__5s���� ��� � � �c�j�|�t|��}|j�||����Sr )�typer!�__get__)r#�obj�klasss r$r)zClassPropertyDescriptor.__get__9s2�� �=���I�I�E�,�t�y� � ��e�,�,�.�.�.r&c��|jstd���t|��}|j�||��|��S)Nzcan't set attribute)r"�AttributeErrorr(r))r#r*�value�type_s r$�__set__zClassPropertyDescriptor.__set__>sH���y� 8� �!6�7�7� 7��S� � ��,�t�y� � ��e�,�,�U�3�3�3r&c�j�t|ttf��st|��}||_|Sr )� isinstance� classmethod� staticmethodr")r#�funcs r$�setterzClassPropertyDescriptor.setterDs2���$��l� ;�<�<� %��t�$�$�D��� �� r&r )�__name__� __module__� __qualname__r%r)r0r6�r&r$rr3sZ����������/�/�/�/� 4�4�4� ����r&rc�v�t|ttf��st|��}t|��Sr )r2r3r4r)r5s r$� classpropertyr<Ks4�� �d�[�,�7� 8� 8�!��4� � �� "�4� (� (�(r&�mp4�wav)�m4a�wave� WavSubChunk)�id�position�size�WavData)� audio_format�channels� sample_rate�bits_per_sample�raw_datac��d}g}|dzt|��kr�t|��dkr�|||dz�}tjd||dz|dz���d}|�t |||����|dkrn1||dzz }|dzt|��krt|��dk��|S)N� �� ��<Ir�data)�len�struct� unpack_from�appendrA)�data�pos� subchunks� subchunk_id� subchunk_sizes r$�extract_wav_headersr[\s��� �C��I� ��'�S��Y�Y� � �3�y�>�>�B�#6�#6��3�s�Q�w�;�'� ��*�4��c�A�g�c�A�g�o�1F�G�G��J� �����[�#�}�E�E�F�F�F� �'� !� !� � �}�q� � �� ��'�S��Y�Y� � �3�y�>�>�B�#6�#6� �r&c ���|st|��}d�|D��}|r|djdkrtd���|d}|jdz}t jd|||dz���d}|dkr|d krtd |z���t jd||dz|d z���d}t jd ||d z|dz���d}t jd||d z|dz���d}|d}|jdkrtd���|jdz}t||||||||jz���S)Nc�(�g|]}|jdk� |��S)sfmt )rB��.0�xs r$� <listcomp>z"read_wav_audio.<locals>.<listcomp>ps�� 1� 1� 1�������1���r&r�z$Couldn't find fmt header in wav datarMz<H�ri��z%Unknown audio format 0x%X in wav datarOrP������rQz%Couldn't find data header in wav data)r[rDrrCrSrTrBrE) rV�headers�fmtrWrFrGrHrI�data_hdrs r$�read_wav_audiorils��� �,�%�d�+�+�� 1� 1�g� 1� 1� 1�C� �I�#�a�&�+��"�"� �!G�H�H�H� �a�&�C� �,�� �C��%�d�D��S�1�W��,=�>�>�q�A�L��q���\�V�3�3� �!H�!-�".�/�/� /��!�$��S�1�W�S�1�W�_�(=�>�>�q�A�H��$�T�4��a���a���+@�A�A�!�D�K��(��t�C�"�H�S�2�X�4E�/F�G�G��J�O��r�{�H��{�g��� �!H�I�I�I� � �a� �C� �<��;����C�(�-�/�/�0� 2� 2�2r&c�f�t|��}|r|djdkrdSt|��dkrtd���t jdt|��dz ��|dd�<|dj}t jdt|��|z dz ��||dz|dz�<dS)NrerQlzUnable to process >4GB filesrPrMrO)r[rBrRrrS�packrC)rVrfrWs r$�fix_wav_headersrl�s���!�$�'�'�G� ��g�b�k�n��/�/��� �4�y�y�5��� �!?�@�@�@�� �D�#�d�)�)�a�-�0�0�D��1��I� �"�+� �C�"�K��c�$�i�i�#�o��.A�B�B�D��q���q�����r&c���eZdZdZe��Zed���Zejd���ZddiZ dC�fd� Z e d���Z dCd �Z e d ���Zd �Zd �Zd �Zd�Zd�Zd�ZdDd�Zd�Zd�Zd�Zd�Zifd�Zed���Zd�Zed���ZedEd���Zed���Z edFd���Z!edFd���Z"edCd ���Z#edCd!���Z$edCd"���Z%edCd#���Z&ed$���Z'ed%���Z( dGd(�Z)d)�Z*dCd*�Z+d+�Z,d,�Z-d-�Z.d.�Z/e d/���Z0e d0���Z1e d1���Z2e d2���Z3e d3���Z4e d4���Z5dHd6�Z6dDd7�Z7d8�Z8dId;�Z9dJd=�Z: dKd>�Z;d?�Z<d@�Z=dA�Z>dB�Z?�xZ@S)L� AudioSegmentay AudioSegments are *immutable* objects representing segments of audio that can be manipulated using python code. AudioSegments are slicable using milliseconds. for example: a = AudioSegment.from_mp3(mp3file) first_second = a[:1000] # get the first second of an mp3 slice = a[5000:10000] # get a slice from 5 to 10 seconds of an mp3 c��|jSr �� converter��clss r$�ffmpegzAudioSegment.ffmpeg�s ���}�r&c��||_dSr rp)rs�vals r$rtzAudioSegment.ffmpeg�s ���� � � r&�ogg� libvorbisNc�F��|�dd��|_|�dd��|_|�dd��|_|j|j|jf}t |t j��r1 |���}n#|���}YnxYwt|��rd|vrtd���|j�Ot|��|j|jzzdkrtd���|j|jz|_ ||_ �nj|�dd��rG||_ |�d�����D]\}}t!|||����n t |t"t$f��r|n|���}nG#t($r:d }|�d ��}|r||z }|�d ��}|�|}YnwxYwt+|��} | st-d ���| j|_| jd z|_| j|_|j|jz|_ | j|_ |jd kr t5j|j d d��|_ |jdkr�t9��} t |j dt:��rdnd} t=|j ��} ddd�} t?| | | ��D]Q\}}}| � | |dk��tCj"| |||��}| � |���R| �#��|_ d|_|j|jz|_ tItJ|��j&|i|��dS)N� sample_width� frame_raterGz=Either all audio parameters or no parameter must be specifiedrz=data length must be a multiple of '(sample_width * channels)'�metadataFr&����z!Couldn't read wav audio from datarMri����r�BBB�ccc���)FT�rO)'�poprzr{rGr2�array�tobytes�tostring�anyrrR� ValueError� frame_width�_data�get�items�setattr� basestring�bytes�read�OSErrorrirrIrHrJr�biasr �int�iterr�writerSrk�getvalue�superrnr%)r#rV�args�kwargs� audio_params�attrrv�d�reader�wav_data� byte_buffer�pack_fmt�i�padding�b0�b1�b2� old_bytes� __class__s �r$r%zAudioSegment.__init__�s����"�J�J�~�t�<�<��� �*�*�\�4�8�8���� � �:�t�4�4�� ��)�4�?�D�M�J� � �d�E�K� (� (� '� '��|�|�~�~���� '��}�}��������� �|� � �( ?���!5�!5�'�(g�h�h� h�� � *��4�y�y�D�-�� �=�>�!�C�C� �!`�a�a�a�#�}�t�/@�@�D� ��D�J�J��Z�Z� �E� *� *� ?��D�J�#�Z�Z� �3�3�9�9�;�;� )� )� ��c���d�C�(�(�(�(� )� �)�$��U�0C�D�D�U�t�t�$�)�)�+�+����� � � ������;�/�/���4���K�A�!�Y�Y�{�3�3�F��4�����  ����&�d�+�+�H�� N�(�)L�M�M�M�$�-�D�M� (� 8�A� =�D� �&�2�D�O�#�}�t�/@�@�D� �!�*�D�J�� �A�%�%�$�\�$�*�a��>�>�� � � �� !� !�!�)�)�K�!+�4�:�a�=�#� >� >�I�u�u�E�H� �T�Z� � �A�%�W�5�5�G�"�1�a��m�m� -� -� ��B���!�!�'�"�z�/�":�;�;�;�"�K��"�b�"�=�=� ��!�!�)�,�,�,�,�$�-�-�/�/�D�J� !�D� �#�}�t�/@�@�D� �*��l�D�!�!�*�D�;�F�;�;�;�;�;s�B�B/�2F;�;AG?�>G?c��|jS)zE public access to the raw audio data as a bytestring �r��r#s r$rJzAudioSegment.raw_datas �� �z�r&c�H�|�|j}tj||j��S)z= returns the raw_data as an array of samples )� array_typer�r�)r#�array_type_overrides r$�get_array_of_samplesz!AudioSegment.get_array_of_samples s'�� � &�"&�/� ��{�.�� �;�;�;r&c�0�t|jdz��S)NrM)rrzr�s r$r�zAudioSegment.array_types���d�/�!�3�4�4�4r&c�Z�td|���|jz z��S)zJ returns the length of this audio segment in milliseconds ��)�round� frame_countr{r�s r$�__len__zAudioSegment.__len__s*���T�T�-�-�/�/�$�/�A�B�C�C�Cr&c�4� |j|jkS#YdSxYw)NFr��r#�others r$�__eq__zAudioSegment.__eq__s&�� ��:���,� ,�� ��5�5���s��c�z�tt��t|j|j|j|jf��z Sr )�hashrnrGr{rzr�r�s r$�__hash__zAudioSegment.__hash__#s1���L�!�!�D�$�-���$�J[�]a�]g�)h�$i�$i�i�ir&c��||k Sr r:r�s r$�__ne__zAudioSegment.__ne__&s���E�M�"�"r&c�T���fd�tt�����D��S)Nc3�(�K�|] }�|V�� dSr r:)r_r�r#s �r$� <genexpr>z(AudioSegment.__iter__.<locals>.<genexpr>*s'�����3�3�A��Q��3�3�3�3�3�3r&)�xrangerRr�s`r$�__iter__zAudioSegment.__iter__)s+���3�3�3�3���D� � �!2�!2�3�3�3�3r&c�>���t�t��r��jr6��fd�t��t ������D��S�j��jnd}�j��jnt ���}t|t �����}t|t �����}n�}�dz}�� |���j z}�� |���j z}�j ||�}||z }|t |��z �j z}|r\|�� d���krtd|z���tj|d�j ��jd��}|||zz }��|��S)Nc3�<�K�|]}�||�jz�V��dSr )�step)r_r�� millisecondr#s ��r$r�z+AudioSegment.__getitem__.<locals>.<genexpr>/sI����������1�{�/�/�/�0������r&rrrc��mszVYou should never be filling in more than 2 ms with silence here, missing frames: %s)r2�slicer�r��indicesrR�start�stop�min�_parse_positionr�r�r�rr�mulrz�_spawn)r#r�r��endrV�expected_length�missing_frames�silences`` r$� __getitem__zAudioSegment.__getitem__,s����� �k�5� )� )� "��� ������#�[�%8�%8��T���%C�%C�D����� *5�):�)F�K�%�%�A�E�&1�&6�&B�+�"�"���Y�Y� ���s�4�y�y�)�)�E��c�3�t�9�9�%�%�C�C��E���/�C��$�$�U�+�+�d�.>�>���"�"�3�'�'�$�*:�:���z�%��)�$����+��)�C��I�I�5�$�:J�J�� � /��� 0� 0�A� 0� 6� 6�6�6�*�)�+9�:�;�;�;��k�$�'8��(8�'8�"9�"&�"3�Q�8�8�G� �W�~�-� .�D��{�{�4� � � r&c����t|�������fd�}||d��|jz}||���|jz}|j||�}|�|��S)z� Get a section of the audio segment by sample index. NOTE: Negative indices do *not* address samples backword from the end of the audio segment like a python list. This is intentional. c�0��|�|S|dkrdS|�kr�S|S)Nrr:)rv�default�max_vals �r$�boundedz.AudioSegment.get_sample_slice.<locals>.bounded[s.����{����Q�w�w��q��W�}�}����Jr&r)r�r�r�r�r�)r#� start_sample� end_sampler��start_i�end_irVr�s @r$�get_sample_slicezAudioSegment.get_sample_sliceQs�����d�&�&�(�(�)�)�� � � � � ��'�,��*�*�T�-=�=���� �G�,�,�t�/?�?���z�'�%�-�(���{�{�4� � � r&c��t|t��r|�|d���S|�|��S)Nr)� crossfade)r2rnrU� apply_gain�r#�args r$�__add__zAudioSegment.__add__js<�� �c�<� (� (� (��;�;�s�a�;�0�0� 0��?�?�3�'�'� 'r&c�0�|dkr|Std���)zO Permit use of sum() builtin with an iterable of AudioSegments rz6Gains must be the second addend after the AudioSegment)� TypeError)r#�rargs r$�__radd__zAudioSegment.__radd__ps)�� �1�9�9��K��'�(�(� (r&c�v�t|t��rtd���|�| ��S)Nz8AudioSegment objects can't be subtracted from each other)r2rnr�r�r�s r$�__sub__zAudioSegment.__sub__ysA�� �c�<� (� (� )��)�*�*� *��?�?�C�4�(�(� (r&c��t|t��r|�|dd���S|�|j|z���S)aH If the argument is an AudioSegment, overlay the multiplied audio segment. If it's a number, just use the string multiply operation to repeat the audio. The following would return an AudioSegment that contains the audio of audio_seg eight times `audio_seg * 8` rT)rC�loop�rV)r2rn�overlayr�r�r�s r$�__mul__zAudioSegment.__mul__�sI�� �c�<� (� (� 6��<�<��a�d�<�;�;� ;��;�;�D�J��$4�;�5�5� 5r&c� �t|t��rd�|��}t|tj��r1 |���}n#|���}YnxYwt |d��r9t |d��r|�d��|���}|j |j |j |j d�}|� |��|�||���S)a Creates a new audio segment using the metadata from the current one and the data passed in. Should be used whenever an AudioSegment is being returned by an operation that would alters the current one, since AudioSegment objects are immutable. r&r��seekr)rzr{r�rG�rVr|)r2�list�joinr�r�r��hasattrr�r�rzr{r�rG�updater�)r#rV� overridesr|s r$r�zAudioSegment._spawn�s��� �d�D� !� !� "��8�8�D�>�>�D� �d�E�K� (� (� '� '��|�|�~�~���� '��}�}��������� �4�� � � ��t�V�$�$� �� � �!� � � ��9�9�;�;�D�!�-��/��+�� �  � �� ��� �"�"�"��~�~�4�(�~�;�;�;s �A�A3c������td�|D�����td�|D�����td�|D�����t���fd�|D����S)Nc3�$K�|] }|jV�� dSr )rG�r_�segs r$r�z%AudioSegment._sync.<locals>.<genexpr>�s$����4�4��s�|�4�4�4�4�4�4r&c3�$K�|] }|jV�� dSr )r{r�s r$r�z%AudioSegment._sync.<locals>.<genexpr>�s$����8�8�C���8�8�8�8�8�8r&c3�$K�|] }|jV�� dSr �rzr�s r$r�z%AudioSegment._sync.<locals>.<genexpr>�s%����<�<��3�+�<�<�<�<�<�<r&c3��K�|]?}|������������V��@dSr )� set_channels�set_frame_rate�set_sample_width)r_r�rGr{rzs ���r$r�z%AudioSegment._sync.<locals>.<genexpr>�sb����� � �� � � �X� &� &� 5� 5�j� A� A� R� R�S_� `� `� � � � � � r&)�max�tuple)rs�segsrGr{rzs @@@r$�_synczAudioSegment._sync�s�������4�4�t�4�4�4�4�4���8�8�4�8�8�8�8�8� ��<�<�t�<�<�<�<�<� �� � � � � � �� � � � � � r&c��|dkrt|��t|��z }|td��kr#|�t|�����n|�|���}t |��S)Nr�infr�)rR�abs�floatr�r�)r#rvs r$r�zAudioSegment._parse_position�sr�� ��7�7��d�)�)�c�#�h�h�&�C�03�u�U�|�|�0C�0C�d���#�d�)�)��,�,�,� � � �� � $� $� ��3�x�x�r&c�&�|dddddd����S)Nr&r�rGrzr{r��r|r:rrs r$�emptyzAudioSegment.empty�s3���s�3����� " �" � � � � r&r��+c�Z�t||dz z��}d|z}||dd|dd����S)z� Generate a silent audio segment. duration specified in milliseconds (default duration: 1000ms, default frame_rate: 11025). �@�@srrcr r)r�)rs�durationr{�framesrVs r$�silentzAudioSegment.silent�sU�� �Z�8�f�#4�5�6�6�������s�4�q�34�1;�23�#5�#5�6�6�6� 6r&c���t|��std���|j|�}|djdkrtd���t|��}|dj}|dj}t d�|D����}tj|djd||z|zz��}t|��D]\}} | � ��||d|�<� |||||���S)Nz.At least one AudioSegment instance is requiredrrz[AudioSegment.from_mono_audiosegments requires all arguments are mono AudioSegment instancesc3�XK�|]%}t|�����V��&dSr )r�r�r�s r$r�z7AudioSegment.from_mono_audiosegments.<locals>.<genexpr>�s4����A�A�S�#�c�o�o�/�/�0�0�A�A�A�A�A�Ar&r�)rGrzr{) rRr�rrGrzr{rr�r�� enumerater�) rs� mono_segmentsrrGrzr{r�rVr�r�s r$�from_mono_audiosegmentsz$AudioSegment.from_mono_audiosegments�s'���=�!�!� O��M�N�N� N��s�y�-�(�� ��7� �q� � ��m�o�o� o��t�9�9���A�w�+� ��!�W�'� ��A�A�D�A�A�A�A�A� ��{� ��G� � �[�<�/�(�:� ;� � ��  ��o�o� ;� ;�F�A�s� #� 8� 8� :� :�D���H�� � ��s� ��%�!�  � � � r&c �, ���|�t|dd���\}}�r/�����t��������fd�} | d��r� |�|��} |r|���|�|�| S|�|� | |dzd�S|�|� | d|dz�S| |dz||zdz�S#|�d��Yn�xYw| d��s | d ��r�|d } |d } |d } | | | | | zd �}||���|���} |r|���|�|�| S|�|� | |dzd�S|�|� | d|dz�S| |dz||zdz�Stdd���} |� |�����n�#t$r�|� ��|���tddd���}|r|���d}t�dd���}|�d��}|r,|� |��|�d��}|�,YnwxYw|� ��|r|���tdd���}|j dg}�r|d�gz }|r|d|gz }|d|jdddgz }|�|dt|��gz }|�|dt|��gz }||jgz }|�|�|��t#|��tt$jd��5}t)j||t(jt(j���}ddd��n #1swxYwY|���\}}t1|��t1|�� |jdkr<t5d�|j|�d� �������|�|��} |���|���t%j|j��t%j|j��n_#|���|���t%j|j��t%j|j��wxYw|�|�| S|� |� | dd�S|�|� | d|dz�S| d|dz�S)!N�rbF��tempfilec���|���}�|krdSt�t��r:�����d�|����St�t ��rM�����d�|���d����SdS)NT�.{0}�utf8F)�lowerr2r��endswith�formatr��encode)�fr$� orig_files ��r$� is_formatz?AudioSegment.from_file_using_temporary_files.<locals>.is_formats������� � �A���{�{��t��)�Z�0�0� D� ���(�(�1�1�&�-�-��2B�2B�C�C�C��)�U�+�+� U� ���(�(�1�1�6�=�=��3C�3C�2K�2K�F�2S�2S�T�T�T��5r&r>r�r�raw�pcmrzr{rG�rzr{rGr�r��wb��mode�deleter})r.r/� bufferingTi�)r0r.�-y�-f�-acodec�-i�-vn�-ss�-t��stdin�stdout�stderr�PDecoding failed. ffmpeg returned error code: {0} Output from ffmpeg/avlib: {1}�ignore��errors)rr"�AUDIO_FILE_EXT_ALIASESr��_from_safe_wav�closer�r�rr�r��flush�openrq�name�str�extendr�os�devnull� subprocess�Popen�PIPE� communicater� returncoderr$�decode�unlink)rs�filer$�codec� parameters� start_secondrr�� close_filer(r*rzr{rGr|� input_filer��output�conversion_commandrI�p�p_out�p_errr's ` @r$�from_file_using_temporary_filesz,AudioSegment.from_file_using_temporary_files�s_����� �2�4���N�N�N���j� � @��\�\�^�^�F�+�/�/���?�?�F� � � � � � � �9�U� � �# Q� ��(�(��.�.���!��J�J�L�L�L��'�H�,<��J�!�-�(�2B��|�D�0�1�1�2�2�!�)�h�.B��~��� �~�.�.��|�D�0�,�x�2G��1M�M�N�N�� �� � �!� � � � � ���� �Y�u� � � Q���5�!1�!1� Q�!�.�1�L�� �-�J��j�)�H� ,�(�$�'�,�6� ��H� �#�4�9�9�;�;��:�:�:�C�� �� � � � � ��#��(8�� ��)�h�.>��<�$�.�/�/�0�0��%�(�*>��+�H�t�O�+�,�,��<�$�.� �x�0G�4�/O�O�P�P�'�T�%�@�@�@� � 0� � � �T�Y�Y�[�[� )� )� )� )��� 0� 0� 0� � � � � � � � � � � � �+��e�{�[�[�[�J�� �� � � � � ��J�� �[�t�D�D�D�D��Y�Y�{�+�+�F�� 0�� � ��(�(�(����;�/�/��� 0��� 0���� ������ � � �J�J�L�L�L�#��e�<�<�<��!�m�"� �� � 1� �4��.� 0� � � 5� �9�e�"4� 4� �� �*�/� � �%� � �� � #� �5�#�l�*;�*;�"<� <� � � � �4��X���"7� 7� ��v�{�m�+�� � !� � %� %�j� 1� 1� 1��)�*�*�*� �"�*�d� #� #� t�w�� �!3�7�:�?�cm�cr�s�s�s�A� t� t� t� t� t� t� t� t� t� t� t���� t� t� t� t��}�}��� ��u��e�$�$�$��e�$�$�$� #��|�q� � �(�j�q�q�� �e�l�l�(�l�&C�&C�F�F�G�G�G��$�$�V�,�,�C� � � � � � � �L�L�N�N�N� �I�j�o� &� &� &� �I�f�k� "� "� "� "�� � � � � � � �L�L�N�N�N� �I�j�o� &� &� &� �I�f�k� "� "� "� "���� � �H�$4��J� � %�(�*:��q�r�r�7�N� � !�h�&:��'��4��'�(� (��q��D��(�)� )sQ�0C�C�C�0C�C�'G�B1I5�4I5�-N � N�N�AR�AS!c �h ���|} t|���n#t$rd�YnwxYwt|dd���\}} �r/�����t��������fd�} | d��r� |�|�|�|��S|�"|� |�|��|dzd�S|�"|� |�|��d|dz�S|�|��|dz||zdz�S#|�d��Yn�xYw| d��s | d ��r�|d } |d } |d } | | | | | zd �}|�!|�||���|���S|�,|�*||���|���|dzd�S|�,|�*||���|���d|dz�S||���|���|dz||zdz�S|j dg}�r|d�gz }|r|d|gz }|�dd��}�r |d�gz }d}d}nI|j dkr|dt|��ddgz }n|ddgz }tj }|���}|rd}nt||���}|rvd�|dD��}|d�d��}|d�d��dkr|dvrd }n|dd!}|d"krd#}nd$|z}|d|gz }|gd%�z }|�|d&t|��gz }|�|d't|��gz }|dgz }|�|�|��t|��tj||tj tj �(��}|�|�)��\}}|jdkst'|��dkrR| r|���t+d*�|j|�d+�,�������t1|��}t3|��t5|��}||��}| r|���|�|�|S|� |� |dd�S|�|� |d|dz�S|d|dz�S)-NrFrc���|���}�|krdS�r:�����d�|����SdS)NTr F)r"r#r$)r&�filenamer$s ��r$r(z)AudioSegment.from_file.<locals>.is_format�sV������ � �A���{�{��t�� C��~�~�'�'�0�0����q�1A�1A�B�B�B��5r&r>r�rr)r*rzr{rGr+r�r1r2r3�read_ahead_limitrer4rtz-read_ahead_limitz cache:pipe:0�-)r`c�*�g|]}|ddk�|��S)� codec_type�audior:r^s r$raz*AudioSegment.from_file.<locals>.<listcomp>�s0��<�<�<�1� !�,��7� :� :�� :� :� :r&�streams� codec_name� sample_fmt�fltp)�mp3r=�aac�webmrwrbrIrM�pcm_u8z pcm_s%dle)r5r2r>r6r7r8)�inputr<r=r>)r r�rr"r@r�rAr�r�rqrFrJrLr rGrrKrMrNrRrBrr$rO� bytearrayrlr�)rsrQr$rRrSrTrr�r'rUr(rzr{rGr|rXr`�stdin_parameter� stdin_data�info� audio_streams� audio_codecrI�acodecrYrZr[r*r_s ` @r$� from_filezAudioSegment.from_file�s5����� � ���~�~�H�H��� � � ��H�H�H� ����2�4���N�N�N���j� � @��\�\�^�^�F�+�/�/���?�?�F� � � � � � � �9�U� � � p� ��'�H�,<��-�-�d�3�3�3�!�-�(�2B��-�-�d�3�3�L��4E�4F�4F�G�G�!�)�h�.B��-�-�d�3�3�N�X�d�]�N�C�C��-�-�d�3�3�L��4E�|�T\�G\�^b�Fb�4b�c�c�� �� � �!� � � � � ���� �Y�u� � � p���5�!1�!1� p�!�.�1�L�� �-�J��j�)�H� ,�(�$�'�,�6� ��H� �#��(8��s�� � � � �h�?�?�?�?��)�h�.>��s�� � � � �h�?�?�?� �T�@Q�@R�@R�S�S��%�(�*>��s�� � � � �h�?�?�?���$���O�O��s�� � � � �h�?�?�?� �T�@Q�S_�`h�Sh�jn�Rn�@n�o�o�!�m�"� �� � 1� �4��.� 0� � � 5� �9�e�"4� 4� �!�:�:�&8�"�=�=�� � %� �4��"2� 2� �"�O��J�J��}��(�(�"�':�C�@P�<Q�<Q�'+�^�'=�=�"�"�#�t�S�k�1�"�(�o�O������J� � P��D�D�!�)�>N�O�O�O�D� � 6�<�<��Y��<�<�<�M�(��*�.�.�|�<�<�K��a� �$�$�\�2�2�f�<�<��#G�G�G�"$���"/��"2�3D�"E���!�#�#�!���$��6�� �9�f�"5� 5� �� � � � �� � #� �5�#�l�*;�*;�"<� <� � � � �4��X���"7� 7� ��s�e�#�� � !� � %� %�j� 1� 1� 1��)�*�*�*� � �/��$.�O�J�O� M� M� M���}�}�:�}�6�6� ��u� �<�1� � ��E� � �a���� �� � � � � �$�f�m�m��L�%�,�,�h�,�"?�"?�B�B�C�C� C��%� � ��������e� � ���c�%�j�j�� � � �J�J�L�L�L� � �H�$4��J� � %�(�*:��q�r�r�7�N� � !�h�&:��'��4��'�(� (��q��D��(�)� )s*�� %�%�D�#D�=#D�!%D�D c�2�|�|d|���S)Nri�rS�ru�rsrQrSs r$�from_mp3zAudioSegment.from_mp3����}�}�T�5�Z�}�@�@�@r&c�2�|�|d|���S)N�flvrwrxrys r$�from_flvzAudioSegment.from_flvr{r&c�2�|�|d|���S)Nrwrwrxrys r$�from_oggzAudioSegment.from_ogg"r{r&c�2�|�|d|���S)Nr>rwrxrys r$�from_wavzAudioSegment.from_wav&r{r&c �Z�|�|d|d|d|d���S)Nr)rzr{rG)rzr{rGrx)rsrQr�s r$�from_rawzAudioSegment.from_raw*s9���}�}�T�5�v�n�7M�Z`�am�Zn�&,�Z�&8��:�:� :r&c��t|dd���\}}|�d��||���}|r|���|S)NrFrrr�)rr�rB)rsrQrUr*s r$rAzAudioSegment._from_safe_wav/sS��2�4���N�N�N���j� � � �!� � � ��c�t�n�n�n�� � � �J�J�L�L�L�� r&ri�4c � �ddg} |dkr|�|�td���t|d��\}} |�d��|dkr1|�|j��|�d��|S|dko|duo|du} | r|} nt d d � ��} |j} |jd krtj|jd d ��} tj | d ��}|� |j ��|� |j��|�|j��|�t#|�������|�| ��|���| r|�d��|St dd � ��}|jdddd| jg}|�|j�|d��}|�Z|����d��r$|dkr|�d|ddddddg��ntd���|�|�d|g��|�|�d|g��|�|�|��|��t9|t:��st=d���|���D]0\}}|�dd� ||��g���1|dkr-|| vrtCd| z���|�d |g��tDj#d!kr|dkr|�d"dg��|�d||jg��tI|��ttJj&d#��5}tOj(||tNj)tNj)�$��}ddd��n #1swxYwY|�*��\}}tW|��tW|��|j,dkr=t[d%� |j,||�.d&�'�������|�d��|�|�/����| ���|���tKj0| j��tKj0|j��|�d��|S)(aw Export an AudioSegment to a file with given options out_f (string): Path to destination audio file. Also accepts os.PathLike objects on python >= 3.6 format (string) Format for destination audio file. ('mp3', 'wav', 'raw', 'ogg' or other ffmpeg/avconv supported files) codec (string) Codec used to encode the destination file. bitrate (string) Bitrate used when encoding destination file. (64, 92, 128, 256, 312k...) Each codec accepts different bitrate arguments so take a look at the ffmpeg documentation for details (bitrate usually shown as -b, -ba or -a:b). parameters (list of strings) Aditional ffmpeg/avconv parameters tags (dict) Set metadata information to destination files usually used as tags. ({title='Song Title', artist='Song Artist'}) id3v2_version (string) Set ID3v2 version for tags. (default: '4') cover (file) Set cover for audio file from image file. (png or jpg) �3r�r)Nz�Can not invoke ffmpeg when export format is "raw"; specify an ffmpeg raw format like format="s16le" instead or call export(format="raw") with no codec or parameterszwb+rr>r,Fr-r�zw+br1r2r4)z.pngz.jpgz.jpegz.bmpz.tifz.tiffriz-map�0�1z-c:v�mjpegzxCurrently cover images are only supported by MP3 files. The allowed image formats are: .tif, .jpg, .bmp, .jpeg and .png.r3z-b:azTags must be a dictionary.z -metadataz{0}={1}z/id3v2_version not allowed, allowed versions: %sz-id3v2_version�darwinz -write_xingrr8zcEncoding failed. ffmpeg/avlib returned error code: {0} Command:{1} Output from ffmpeg/avlib: {2}r=r>)1r-rr�r�r�rrzrr�r@rD� setnchannelsrG� setsampwidth� setframerater{� setnframesr�r��writeframesrawrBrqrE�DEFAULT_CODECSr�r"r#rGr2�dictrr�r$r�sys�platformrrHrIrJrKrLrMrrNrrOr�rP)r#�out_fr$rR�bitraterS�tags� id3v2_version�cover�id3v2_allowed_versions�_�easy_wavrV� pcm_for_wav� wave_datarWrX�keyr.rIrYrZr[s r$�exportzAudioSegment.export8s���F#&�s��� �U�?�?�� 1�Z�5K� �O�P�P� P� +�5�%�8�8���q� � � �1� � � � �U�?�?� �K�K�� � #� #� #� �J�J�q�M�M�M��L��U�?�K�u��}�K��t�9K�� � ?��D�D�%�4��>�>�>�D��j� � � �� !� !�!�,�t�z�1�c�:�:�K��I�d�D�)�)� ����t�}�-�-�-����t�0�1�1�1����t��/�/�/� ���S��!1�!1�!3�!3�4�4�5�5�5�� � ��-�-�-������� � � �J�J�q�M�M�M��L�#��u�=�=�=�� �N� � �%��t�y� �� �=��'�+�+�F�D�9�9�E� � ��{�{�}�}�%�%�&X�Y�Y� P�^d�hm�^m�^m�"�)�)�4����V�S�RX�Za�*b�c�c�c�c�$�O�P�P�P� � � � %� %�y�%�&8� 9� 9� 9� � � � %� %�v�w�&7� 8� 8� 8� � !� � %� %�j� 1� 1� 1� � ��d�D�)�)� � �!=�>�>�>�#'�*�*�,�,�E�E�J�C��&�-�-�$�i�&6�&6�s�E�&B�&B�C�E�E�E�E��U�?�?�$�,B�B�B�2�M�Pf�f�h�h�h�&�-�-�(�-�/���� �<�8� #� #����� � %� %�}�c�&:� ;� ;� ;��!�!� �&�&�+�# � � � � �)�*�*�*��"�*�d� #� #� t�w�� �!3�7�:�?�cm�cr�s�s�s�A� t� t� t� t� t� t� t� t� t� t� t���� t� t� t� t��}�}��� ��u��e�$�$�$��e�$�$�$� �<�1� � �$�{�C�C��L�"4�e�l�l�(�l�6S�6S�V�V�W�W� W� � � �A���� � � �F�K�K�M�M�"�"�"� � � � � � �� � ���� � �$�)���� � �&�+���� � � �1� � � �� s�-O�O�Oc�H�||jz}||jz}|j||�Sr )r�r�)r#�index� frame_start� frame_ends r$� get_framezAudioSegment.get_frame�s.���d�.�.� ��$�"2�2� ��z�+�i�/�0�0r&c�r�|� ||jdz zStt|j��|jz��S)z� returns the number of frames for the given number of milliseconds, or if not specified, the number of frames in the whole AudioSegment Nr)r{r rRr�r�)r#r�s r$r�zAudioSegment.frame_count�s9�� �>����6�1�2� 2���T�Z���D�,<�<�=�=� =r&c��||jkr|S|j|z}|�tj|j|j|��||d����S)N)rzr��r�)rzrGr�r�lin2linr�)r#rzr�s r$rzAudioSegment.set_sample_width�s]�� �4�,� ,� ,��K��m�l�2� ��{�{� �O�D�J��(9�<� H� H�'3�K�P�P�� � � r&c���||jkr|S|jr1tj|j|j|j|j|d��\}}n|j}|�|d|i���S)Nr{�rVr�)r{r�r�ratecvrzrGr�)r#r{� convertedr�s r$rzAudioSegment.set_frame_rate�s}�� ��� (� (��K� �:� #�"�>�$�*�d�6G�*.�-���*4�d�<�<�L�I�q�q�� �I��{�{� �&2�J�%?��A�A� Ar&c�L��|�jkr�S|dkr=�jdkr2tj}�jdz}d}|�j�j||��}�n:|dkr<�jdkr1tj}�jdz}d}|�j�j||��}n�|dkr�d�����D��}t�� ����}tj |dj d|�jzz��}|D]2}t|��D] } || xx|| �jzz cc<�!�3�j�jz}nC�jdkr)�fd�t|��D��} tj| �Std�����|||d �� ��S) Nrcrg�?c�6�g|]}|�����Sr:)r�r�s r$raz-AudioSegment.set_channels.<locals>.<listcomp>s$��X�X�X�C�S�5�5�7�7�X�X�Xr&rr�c���g|]}���Sr:r:)r_�iChannelr#s �r$raz-AudioSegment.set_channels.<locals>.<listcomp>s���A�A�A�X�D�A�A�Ar&zbAudioSegment.set_channels only supports mono-to-multi channel and multi-to-mono channel conversion�rGr�r�)rGr�tostereor�r�rz�tomono� split_to_monor�r�r��typecode�rangernrr�r�) r#rG�fnr��facr�� channels_datar��raw_channel_datar�� dup_channelss ` r$rzAudioSegment.set_channelss��� �t�}� $� $��K� �q�=�=�T�]�a�/�/��!�B��*�Q�.�K��C���4�:�t�'8�#�s�C�C�I�I� ��]�]�t�}��1�1���B��*�a�/�K��C���4�:�t�'8�#�s�C�C�I�I� ��]�]�X�X�4�CU�CU�CW�CW�X�X�X�M��d�.�.�0�0�1�1�K�� ��a� �)���t�'8�8�9���I�%2� I� I� ��{�+�+�I�I�A��a�L�L�L�$4�Q�$7�4�=�$H�H�L�L�L�L�I��*�d�m�;�K�K� �]�a� � �A�A�A�A��x���A�A�A�L��7��F� F��t�v�v� v��{�{� �+3�.9�&;�&;��<�<� <r&c �t�|jdkr|gS|���}g}t|j��D]~}||d|j�} |���}n$#t$r|���}YnwxYw|�|�|d|jd�������|S)Nrr�r�) rGr�r�r�r-r�rUr�rz)r#�samples� mono_channelsr��samples_for_current_channel� mono_datas r$r�zAudioSegment.split_to_mono's��� �=�A� � ��6�M��+�+�-�-��� ��t�}�%�%� � �A�*1�!�2B�T�]�2B�*C� '� C�7�?�?�A�A� � ��!� C� C� C�7�@�@�B�B� � � � C���� � � �� � �I�a�PT�Pa�1b�1b� �c�c� � � � ��s� A!�!B�Bc�@�tj|j|j��Sr )r�rmsr�rzr�s r$r�zAudioSegment.rms<����{�4�:�t�'8�9�9�9r&c�l�|j}|std�� St|j|jz ��S)N�infinity)r�r r�max_possible_amplitude)r#r�s r$�dBFSzAudioSegment.dBFS@s:���h��� &��*�%�%�%� %��4�8�d�&A�A�B�B�Br&c�@�tj|j|j��Sr )rrr�rzr�s r$rzAudioSegment.maxGr�r&c�*�|jdz}d|z}|dz S)NrMrcr�)r#�bits�max_possible_vals r$r�z#AudioSegment.max_possible_amplitudeKs&��� �1�$����I�� �!�#�#r&c�6�t|j|j��Sr )rrr�r�s r$�max_dBFSzAudioSegment.max_dBFSSs���4�8�T�%@�A�A�Ar&c�L�|jr|���|jz pdS)Ng)r{r�r�s r$�duration_secondszAudioSegment.duration_secondsWs'����G�4�#3�#3�#5�#5���#G�N�3�Nr&rc�T�d|cxkrdksntd���|jdkr|j}nI|dkr"tj|j|jdd��}n!tj|j|jdd��}t tj||j����|jz S)z� Returns a value between -1.0 and 1.0 representing the DC offset of a channel (1 for left, 2 for right). rrcz+channel value must be 1 (left) or 2 (right)r) r�rGr�rr�rzr �avgr�)r#�channelrVs r$� get_dc_offsetzAudioSegment.get_dc_offset[s��� �G� � � � �q� � � � ��J�K�K� K� �=�A� � ��:�D�D� ��\�\��>�$�*�d�.?��A�F�F�D�D��>�$�*�d�.?��A�F�F�D��W�[��t�'8�9�9�:�:�T�=X�X�Xr&c����|rd|cxkrdksntd���|rd|cxkrdksntd���|r$tt|�jz����}�fd�}�jdkr%��|�j|�����Stj�j�j dd ��}tj�j�j d d��}|r|dkr |||��}|r|dkr |||��}tj |�j dd ��}tj |�j d d��}��tj ||�j �����S) z� Removes DC offset of given channel. Calculates offset if it's not given. Offset values must be in range -1.0 to 1.0. If channel is None, removes DC offset from all available channels. rrcz1channel value must be None, 1 (left) or 2 (right)g�g�?z)offset value must be in range -1.0 to 1.0c�t��|stj|�j��}tj|�j| ��Sr )rr�rzr�)rV�offr#s �r$�remove_data_dcz5AudioSegment.remove_dc_offset.<locals>.remove_data_dc{s8���� ;��k�$��(9�:�:���<��d�&7�#��>�>� >r&r�r) r�r�r�r�rGr�r�rr�rzr��add)r#r��offsetr�� left_channel� right_channels` r$�remove_dc_offsetzAudioSegment.remove_dc_offsetls���� � R�1��,�,�,�,�1�,�,�,�,��P�Q�Q� Q� � J�$�&�/�/�/�/�C�/�/�/�/��H�I�I� I� � F���v��(C�C�D�D�E�E�F� ?� ?� ?� ?� ?� �=�A� � ��;�;�N�N�4�:�v�$F�$F�;�G�G� G��~�d�j�$�2C�Q��J�J� ���t�z�4�3D�a��K�K� �� @�'�Q�,�,�)�>�,��?�?�L�� B�'�Q�,�,�*�N�=�&�A�A�M��'� �d�6G��A�N�N� ��(���8I�1�a�P�P� ��{�{�� �L�-�,0�,=�!?�!?�{�@�@� @r&c ��|�tj|j|jt t |���������S�Nr�)r�rr�r�rzrr )r#� volume_changes r$r�zAudioSegment.apply_gain�sI���{�{�� �D�J��8I�,7��m�8L�8L�,M�,M�!O�!O�{�P�P� Pr&rFc �z�|rd}n%|�d}n |dkr|�|j��St��}t�||��\}}|j} |j} |�|d|�j��||d�j}|j}d} t|��} t|��} |r�td| | z ��}| |kr|d|�}|} d}|rl|| | | z�}tj ||jtt|������}|�tj ||| ����n4|�tj || | | z�|| ����| | z } |dz}|��|�|| d���| |���S)a� Overlay the provided segment on to this segment starting at the specificed position and using the specfied looping beahvior. seg (AudioSegment): The audio segment to overlay on to this one. position (optional int): The position to start overlaying the provided segment in to this one. loop (optional bool): Loop seg as many times as necessary to match this segment's length. Overrides loops param. times (optional int): Loop seg the specified number of times or until it matches this segment's length. 1 means once, 2 means twice, ... 0 would make the call a no-op gain_during_overlay (optional int): Changes this segment's volume by the specified amount during the duration of time that seg is overlaid on top of it. When negative, this has the effect of 'ducking' the audio under the overlay. reNrrr�)r�r�r rnrrzr�rRrrr�rr r�)r#r�rCr��times�gain_during_overlayrW�seg1�seg2rz�spawnrW�seg1_len�seg2_len� remaining� seg1_overlaid�seg1_adjusted_gains r$r�zAudioSegment.overlay�s���4 � +��E�E� �]��E�E� �a�Z�Z��;�;�t�z�*�*� *�����!�'�'��c�2�2� ��d��(� �� ��� � �T�)�8�)�_�*�+�+�+��H�I�I��$���z�����t�9�9���t�9�9��� ��A�x�#�~�.�.�I��9�$�$��J�Y�J�'��$����"� 8� $�S��x��%7� 8� �%,�[���@Q�1<�U�CV�=W�=W�1X�1X�&Z�&Z�"�� � �W�[�);�T�<�P�P�Q�Q�Q�Q�� � �W�[��c�#��.�.@�)A�4�)5�7�7�8�8�8� �8�O�C� �Q�J�E�)� �, � � �T�#�$�$�Z� � � ��u�&�!�!�!�!r&�dc��t�||��\}}|s"|�|j|jz��S|t |��kr0t d�|t |�������|t |��kr0t d�|t |�������|| d��ddtd�����}||d|��ddtd�����z}t��}|� |d| �j��|� |j��|� ||d�j��|� d��|�|���}|� ��|S) Nz@Crossfade is longer than the original AudioSegment ({}ms > {}ms)z@Crossfade is longer than the appended AudioSegment ({}ms > {}ms)����rr )�to_gainr�r�)� from_gainr�r�r�) rnrr�r�rRr�r$�fader rr�r�rB)r#r�r�r�r��xfrWr*s r$rUzAudioSegment.append�s���!�'�'��c�2�2� ��d�� ��;�;�t�z�D�J�6�7�7� 7� ��T��� "� "��_�f�f��3�t�9�9����� ���S��� !� !��_�f�f��3�s�8�8����� ��9�*�+�+� � #� #�D��u�U�|�|� #� L� L�� �d�:�I�:��#�#�d�!��u���#�N�N�N������� � �T�+�I�:�+�&�,�-�-�-�� � �R�X����� � �T�)�*�*�%�+�,�,�,�� � �A�����k�k�v�k�&�&��� � ����� r&c�b�d|||fvrtd���|dkr|dkr|S|�tt|��|��nd}|�tt|��|��nd}|�|dkr|t|��z }|�|dkr|t|��z }|�|dkrtd���|r|�||z}n |�||z }n||z }t |��}g}|d|�j}|dkrt j||j|��}|� |��t |��|z } |dkr`| |z } t|��D]J} || | zz} ||| z} t j| j|j| ��} |� | ���Kn�|� |���}|� |���}||z }| |z } tt|����D]_} || | zz} |� t|| z����}t j||j| ��}|� |���`||d�j}|dkr(t j||jt |����}|� |��|�|���S)a� Fade the volume of this audio segment. to_gain (float): resulting volume_change in db start (int): default = beginning of the segment when in this segment to start fading in milliseconds end (int): default = end of the segment when in this segment to start fading in milliseconds duration (int): default = until the end of the audio segment the duration of the fade NzPOnly two of the three arguments, "start", "end", and "duration" may be specifiedrz#duration must be a positive integerr�r�r�)r�r�rRrrr�rr�rzrUr�r�r�r�r�)r#r�r�r�r�r� from_powerrW� before_fade� gain_delta� scale_stepr�r��chunk� start_frame� end_frame� fade_frames�sample� after_fades r$r�zAudioSegment.fade�s��( ��#�u�-� -� -��E�F�F� F� �a�<�<�I��N�N��K�).�):��C��I�I�u�%�%�%���%(�_�c�#�d�)�)�S�!�!�!�$�� � ����� �S��Y�Y� �E� �?�s�Q�w�w� �3�t�9�9� �C� � �H�q�L�L�!�"G�H�H� H� � #�� ��h�&������h�����U�{�H� ��+�+� ����6�E�6�l�(� � ��>�>�!�+�k�&*�&7�&0�2�2�K� � � �k�"�"�"� ��)�)�J�6� � �c�>�>�#�h�.�J��8�_�_� %� %�� *�j�1�n� =� ��U�Q�Y���� �E�K�$(�$5�$1�3�3��� � �e�$�$�$�$� %��*�*�e�*�4�4�K��(�(�C�(�0�0�I�#�k�1�K�#�k�1�J��3�{�+�+�,�,� &� &�� *�j�1�n� =� �����K�!�O�(<�(<�=�=�� ��V�T�->� �N�N��� � �f�%�%�%�%��#�$�$�Z�%� � �a�<�<� ��Z�%)�%6�%0��%9�%9�;�;�J� � � �j�!�!�!��{�{��{�'�'�'r&c�L�|�d|td�����S)Nr�r )r�rr�)r�r �r#rs r$�fade_outzAudioSegment.fade_out`s ���y�y���e�E�l�l�y�K�K�Kr&c�2�|�d|d���S)Nr�r)r�rr�)r�rs r$�fade_inzAudioSegment.fade_incs���y�y�4�(�!�y�D�D�Dr&c�h�|�tj|j|j�����Sr�)r�r�reverser�rzr�s r$rzAudioSegment.reversefs1���{�{�����T�->�?�?�� � � r&c���d}|���}tj|������d��}|�|���S)Nz� <audio controls> <source src="data:audio/mpeg;base64,{base64}" type="audio/mpeg"/> Your browser does not support the audio element. </audio> �ascii)�base64)r�r � b64encoder�rOr$)r#�src�fhrVs r$� _repr_html_zAudioSegment._repr_html_ksR���� �[�[�]�]������� � �*�*�1�1�'�:�:���z�z��z�&�&�&r&r )NN)r�r)NNNNN)NriNNNNr�N)r)rFNN)r�)rrNNN)Ar7r8r9�__doc__rrqr<rtr6r�r%�propertyrJr�r�r�r�r�r�r�r�r�r�r�r�r�r�r3rr�rrrr\rurzr~r�r�r�rAr�r�r�rrrr�r�r�rr�r�r�r�r�r�r�rUr�rrrr � __classcell__)r�s@r$rnrn�sN������� � �!� �"�"�I�����]�� �]����]�� �{��N�O<�O<�O<�O<�O<�O<�b����X�� <�<�<�<��5�5��X�5�D�D�D� ��� j�j�j�#�#�#�4�4�4�#!�#!�#!�J!�!�!�!�2(�(�(� (�(�(�)�)�)�6�6�6�$&(�<�<�<�<�@� � ��[� ����� � ��[� �� 6� 6� 6��[� 6�� � ��[� �<�G*�G*�G*��[�G*�T�S*�S*�S*��[�S*�j�A�A�A��[�A��A�A�A��[�A��A�A�A��[�A��A�A�A��[�A��:�:��[�:�����[��tw��`�`�`�`�D1�1�1� >�>�>�>�  �  �  � A� A� A�#<�#<�#<�J���*�:�:��X�:��C�C��X�C� �:�:��X�:��$�$��X�$��B�B��X�B��O�O��X�O�Y�Y�Y�Y�"$@�$@�$@�$@�LP�P�P�J"�J"�J"�J"�X����8<@��`(�`(�`(�`(�DL�L�L�E�E�E� � � � '� '� '� '� '� '� 'r&rn)�effectsr )9� __future__rr�rHrJrrrr@r�rS� logging_utilsrr�utilsr r r � collectionsr r �ior � itertoolsr�ziprrrrrr� exceptionsrrrrrrr� version_inforFr�r�r��objectrr<r@rArEr[rirlrn�rr:r&r$�<module>rs�������� � � � � � � � �����6�6�6�6�6�6�6�6� � � � � � � � � � � � �@�@�@�@�@�@�@�@�+�+�+�+�+�+�+�+� � � � �"�"�"�"�"�"��!�!�!�!�!�!�!������������������������������ �D�D�D����������������������������������������v����J� �F��H������f����0)�)�)� � ���� �j��(B�(B�(B�C�C� � �*�Y�!@�!@�!@� A� A�� � � � 2�2�2�2�6C�C�C�"\'�\'�\'�\'�\'�6�\'�\'�\'�~&�������s�A � A�A$�$A*
Memory