§
    2?Äjö  ã                   ó²  — d Z ddlmZmZm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ZddlZddlZddlmZ  ej        e¦  «        ZdZd                     d„ eD ¦   «         ¦  «        Zej        d         dk    ZereZeZeZeZeZn" ej         ¦   «          e!Ze"Ze!Zee#fZeej$        fZe
j%        Z&e
j'        Z(d	„ Z)d
„ Z*d„ Z+d„ Z, G d„ de-¦  «        Z. G d„ de-¦  «        Z/ G d„ de/¦  «        Z0 G d„ de-¦  «        Z1d d„Z2d d„Z3d d„Z4d d„Z5e4Z6e2Z7 G d„ de-¦  «        Z8 G d„ de8¦  «        Z9 G d„ de8¦  «        Z:e9e:gZ;edk    rddl<Z< e<j=        ¦   «          dS dS )!a!  
Python implementation of the Binary Structured Data Format (BSDF).

BSDF is a binary format for serializing structured (scientific) data.
See http://bsdf.io for more information.

This is the reference implementation, which is relatively relatively
sophisticated, providing e.g. lazy loading of blobs and streamed
reading/writing. A simpler Python implementation is available as
``bsdf_lite.py``.

This module has no dependencies and works on Python 2.7 and 3.4+.

Note: on Legacy Python (Python 2.7), non-Unicode strings are encoded as bytes.
é    )Úabsolute_importÚdivisionÚprint_functionN)ÚBytesIO)é   é   r   ú.c              #   ó4   K  — | ]}t          |¦  «        V — Œd S ©N)Ústr)Ú.0Úis     úFC:\Projects\Historical\venv\Lib\site-packages\imageio/plugins/_bsdf.pyú	<genexpr>r   0   s(   è è € Ð/Ð/ !•s˜1‘v”vÐ/Ð/Ð/Ð/Ð/Ð/ó    é   c                 óP   — | dk    rt          d| ¦  «        S t          dd| ¦  «        S )z?Encode an unsigned integer into a variable sized blob of bytes.éú   ú<Bú<BQéý   )Úspack)Úxs    r   Úlencoder   J   s/   € ð 	ˆC‚x€xÝ�T˜1‰~Œ~Ðõ �U˜C Ñ#Ô#Ð#r   c                 ó¶   — t          d|                      d¦  «        ¦  «        d         }|dk    r)t          d|                      d¦  «        ¦  «        d         }|S )z'Decode an unsigned integer from a file.r   r   r   r   ú<Qé   )Ú	strunpackÚread)ÚfÚns     r   Ú	lendecoder"   Y   sL   € å�$˜Ÿš˜q™	œ	Ñ"Ô" 1Ô%€AØˆC‚x€xÝ�d˜AŸFšF 1™IœIÑ&Ô& qÔ)ˆØ€Hr   c                 óœ   — |�I|                      d¦  «        }|                      ¦   «         t          t          |¦  «        ¦  «        z   |z   S | S )z9Encode the type identifier, with or without extension id.NúUTF-8)ÚencodeÚupperr   Úlen)ÚbÚext_idÚbbs      r   Úencode_type_idr+   a   sD   € àÐØ�]Š]˜7Ñ#Ô#ˆØ�wŠw‰yŒy�7¥3 r¡7¤7Ñ+Ô+Ñ+¨bÑ0Ð0àˆr   c                 óš   — t          | t          ¦  «        o6t          j        d| t          j        ¦  «        ot          j        d| ¦  «        du S )z8Use of str.isidentifier() for Legacy Python, but slower.z^\w+$z^[0-9]N)Ú
isinstanceÚstring_typesÚreÚmatchÚUNICODE)Úss    r   Ú_isidentifierr3   j   sG   € õ 	�1•lÑ#Ô#ð 	+ÝŒH�X˜q¥"¤*Ñ-Ô-ð	+åŒH�Y Ñ"Ô" dÐ*ðr   c                   ó\   — e Zd ZdZdd„Z	 	 	 	 	 dd„Zd„ Zd	„ Zd
„ Zd„ Z	d„ Z
d„ Zd„ Zd„ ZdS )ÚBsdfSerializeraz  Instances of this class represent a BSDF encoder/decoder.

    It acts as a placeholder for a set of extensions and encoding/decoding
    options. Use this to predefine extensions and options for high
    performance encoding/decoding. For general use, see the functions
    `save()`, `encode()`, `load()`, and `decode()`.

    This implementation of BSDF supports streaming lists (keep adding
    to a list after writing the main file), lazy loading of blobs, and
    in-place editing of blobs (for streams opened with a+).

    Options for encoding:

    * compression (int or str): ``0`` or "no" for no compression (default),
      ``1`` or "zlib" for Zlib compression (same as zip files and PNG), and
      ``2`` or "bz2" for Bz2 compression (more compact but slower writing).
      Note that some BSDF implementations (e.g. JavaScript) may not support
      compression.
    * use_checksum (bool): whether to include a checksum with binary blobs.
    * float64 (bool): Whether to write floats as 64 bit (default) or 32 bit.

    Options for decoding:

    * load_streaming (bool): if True, and the final object in the structure was
      a stream, will make it available as a stream in the decoded object.
    * lazy_blob (bool): if True, bytes are represented as Blob objects that can
      be used to lazily access the data, and also overwrite the data if the
      file is open in a+ mode.
    Nc                 ó‚   — i | _         i | _        |€t          }|D ]}|                      |¦  «         Œ | j        di |¤Ž d S )N© )Ú_extensionsÚ_extensions_by_clsÚstandard_extensionsÚadd_extensionÚ_parse_options)ÚselfÚ
extensionsÚoptionsÚ	extensions       r   Ú__init__zBsdfSerializer.__init__“   sb   € ØˆÔØ"$ˆÔØÐÝ,ˆJØ#ð 	*ð 	*ˆIØ×Ò˜yÑ)Ô)Ð)Ð)ØˆÔÐ&Ð&˜gÐ&Ð&Ð&Ð&Ð&r   r   FTc                 ó`  — t          |t          ¦  «        r.ddddœ}|                     |                     ¦   «         |¦  «        }|dvrt	          d¦  «        ‚|| _        t          |¦  «        | _        t          |¦  «        | _        t          |¦  «        | _	        t          |¦  «        | _
        d S )Nr   r   r   )ÚnoÚzlibÚbz2)r   r   r   z3Compression must be 0, 1, 2, "no", "zlib", or "bz2")r-   r.   ÚgetÚlowerÚ	TypeErrorÚ_compressionÚboolÚ_use_checksumÚ_float64Ú_load_streamingÚ
_lazy_blob)r=   ÚcompressionÚuse_checksumÚfloat64Úload_streamingÚ	lazy_blobÚms          r   r<   zBsdfSerializer._parse_optionsœ   s©   € õ �k¥<Ñ0Ô0ð 	BØ !¨AÐ.Ð.ˆAØŸ%š% × 1Ò 1Ñ 3Ô 3°[ÑAÔAˆKØ˜iÐ'Ð'ÝÐTÑUÔUÐUØ'ˆÔõ " ,Ñ/Ô/ˆÔÝ˜W™œˆŒõ  $ NÑ3Ô3ˆÔÝ˜y™/œ/ˆŒˆˆr   c                 ó†  — t          |t          ¦  «        rt          |t          ¦  «        st	          d¦  «        ‚ |¦   «         }|j        }t          |t          ¦  «        st	          d¦  «        ‚t          |¦  «        dk    st          |¦  «        dk    rt          d¦  «        ‚|| j	        v rt                               d|z  ¦  «         |j        }|sg }n"t          |t          t          f¦  «        r|}n|g}|D ]&}t          |t          ¦  «        st	          d¦  «        ‚Œ'|D ]}||j        f| j        |<   Œ|| j	        |<   |S )z�Add an extension to this serializer instance, which must be
        a subclass of Extension. Can be used as a decorator.
        z*add_extension() expects a Extension class.úExtension name must be str.r   r   z<Extension names must be nonempty and shorter than 251 chars.zABSDF warning: overwriting extension "%s", consider removing firstz Extension classes must be types.)r-   ÚtypeÚ
issubclassÚ	ExtensionrH   Únamer   r'   Ú	NameErrorr8   ÚloggerÚwarningÚclsÚtupleÚlistÚ
classtypesr%   r9   )r=   Úextension_classr@   rZ   r^   Úclsss         r   r;   zBsdfSerializer.add_extension´   sŠ  € õ �­Ñ-Ô-ð	JÝ2<¸_ÍiÑ2XÔ2Xð	Jõ ÐHÑIÔIÐIØ#�OÑ%Ô%ˆ	ð Œ~ˆÝ˜$¥Ñ$Ô$ð 	;ÝÐ9Ñ:Ô:Ð:Ýˆt‰9Œ9˜Š>ˆ>�S ™YœY¨š_˜_ÝØQñô ð ð �4Ô#Ð#Ð#Ý�NŠNð*Ø,0ñ1ñô ð ð ŒmˆØð 	ØˆDˆDÝ˜�e¥T˜]Ñ+Ô+ð 	ØˆDˆDà�5ˆDØð 	Dð 	DˆCÝ˜c¥:Ñ.Ô.ð DÝÐ BÑCÔCÐCðDð ð 	Bð 	BˆCØ+/°Ô1AÐ+AˆDÔ# CÑ(Ð(Ø!*ˆÔ˜ÑØÐr   c                 óH  — t          |t          ¦  «        st          d¦  «        ‚|| j        v r| j                             |¦  «         t          | j                             ¦   «         ¦  «        D ]3}| j        |         d         |k    r| j                             |¦  «         Œ4dS )z&Remove a converted by its unique name.rV   r   N)r-   r   rH   r8   Úpopr`   r9   Úkeys)r=   rZ   r^   s      r   Úremove_extensionzBsdfSerializer.remove_extensionß   s¨   € å˜$¥Ñ$Ô$ð 	;ÝÐ9Ñ:Ô:Ð:Ø�4Ô#Ð#Ð#ØÔ× Ò  Ñ&Ô&Ð&Ý˜Ô/×4Ò4Ñ6Ô6Ñ7Ô7ð 	1ð 	1ˆCØÔ& sÔ+¨AÔ.°$Ò6Ð6ØÔ'×+Ò+¨CÑ0Ô0Ð0øð	1ð 	1r   c                 ó¢  — t           }|€!|                      |d|¦  «        ¦  «         dS |du r!|                      |d|¦  «        ¦  «         dS |du r!|                      |d|¦  «        ¦  «         dS t          |t          ¦  «        rtd|cxk    rdk    r5n n2|                      |d	|¦  «        t	          d
|¦  «        z   ¦  «         dS |                      |d|¦  «        t	          d|¦  «        z   ¦  «         dS t          |t
          ¦  «        rk| j        r2|                      |d|¦  «        t	          d|¦  «        z   ¦  «         dS |                      |d|¦  «        t	          d|¦  «        z   ¦  «         dS t          |t          ¦  «        rh|                     d¦  «        }|                      |d|¦  «        t          t          |¦  «        ¦  «        z   ¦  «         |                     |¦  «         dS t          |t          t          f¦  «        r[|                      |d|¦  «        t          t          |¦  «        ¦  «        z   ¦  «         |D ]}|                      |||d¦  «         ŒdS t          |t          ¦  «        rø|                      |d|¦  «        t          t          |¦  «        ¦  «        z   ¦  «         |                     ¦   «         D ]¥\  }}t           r|                     ¦   «         sJ ‚nt%          |¦  «        sJ ‚|                     d¦  «        }	|                     t          t          |	¦  «        ¦  «        ¦  «         |                     |	¦  «         |                      |||d¦  «         Œ¦dS t          |t&          ¦  «        rR|                      |d|¦  «        ¦  «         t)          || j        | j        ¬¦  «        }
|
                     |¦  «         dS t          |t(          ¦  «        r6|                      |d|¦  «        ¦  «         |                     |¦  «         dS t          |t0          ¦  «        rÊ|j        dk    rt5          d¦  «        ‚t          |t6          ¦  «        r2|                      |d|¦  «        t	          ddd¦  «        z   ¦  «         nt9          d¦  «        ‚t          |¦  «        dk    rt5          d¦  «        ‚|                     |¦  «         |                     || j        | j        ¦  «         dS |�t5          d|z  ¦  «        ‚| j          !                    |j"        d¦  «        }|€B| j#                             ¦   «         D ]&\  }}| $                    | |¦  «        r||j        f} nŒ'd}|�)|\  }}|                      | || |¦  «        ||¦  «         dS d}t9          ||j"        j%        z  ¦  «        ‚) zMain encoder function.Nó   vTó   yFó   ni €ÿÿiÿ  ó   hÚhó   iú<qó   dú<dó   fú<fr$   ó   só   ló   mó   b)rO   rP   Úwz$Cannot serialize a read-mode stream.r   éÿ   r   zOnly ListStream is supportedz"Can only have one stream per file.zŽExtension %s wronfully encodes object to another extension object (though it may encode to a list/dict that contains other extension objects).zJClass %r is not a valid base BSDF type, nor is it handled by an extension.)&r+   Úwriter-   Úinteger_typesr   ÚfloatrL   Úunicode_typesr%   r   r'   r`   r_   Ú_encodeÚdictÚitemsÚPY3Úisidentifierr3   ÚbytesÚBlobrI   rK   Ú_to_fileÚ
BaseStreamÚmodeÚ
ValueErrorÚ
ListStreamrH   ÚappendÚ	_activateÚ_decoder9   rF   Ú	__class__r8   r0   Ú__name__)r=   r    ÚvalueÚstreamsr)   r   r*   ÚvÚkeyÚname_bÚblobÚexrZ   ÚcÚext_id2Úextension_encodeÚts                    r   r~   zBsdfSerializer._encodeé   sò  € åˆàˆ=Ø�GŠG�A�A�d˜F‘O”OÑ$Ô$Ð$Ð$Ð$Ø�dˆ]ˆ]Ø�GŠG�A�A�d˜F‘O”OÑ$Ô$Ð$Ð$Ð$Ø�eˆ^ˆ^Ø�GŠG�A�A�d˜F‘O”OÑ$Ô$Ð$Ð$Ð$Ý˜�}Ñ-Ô-ð O	>Ø˜Ð'Ð'Ò'Ð' %Ò'Ð'Ð'Ð'Ð'Ø—’˜˜˜$ ™œ­%°°UÑ*;Ô*;Ñ;Ñ<Ô<Ð<Ð<Ð<à—’˜˜˜$ ™œ­%°°eÑ*<Ô*<Ñ<Ñ=Ô=Ð=Ð=Ð=Ý˜�uÑ%Ô%ð J	>ØŒ}ð >Ø—’˜˜˜$ ™œ­%°°eÑ*<Ô*<Ñ<Ñ=Ô=Ð=Ð=Ð=à—’˜˜˜$ ™œ­%°°eÑ*<Ô*<Ñ<Ñ=Ô=Ð=Ð=Ð=Ý˜�}Ñ-Ô-ð E	>Ø—’˜gÑ&Ô&ˆBØ�GŠG�A�A�d˜F‘O”O¥g­c°"©g¬gÑ&6Ô&6Ñ6Ñ7Ô7Ð7Ø�GŠG�B‰KŒKˆKˆKˆKÝ˜¥¥e˜}Ñ-Ô-ð A	>Ø�GŠG�A�A�d˜F‘O”O¥g­c°%©j¬jÑ&9Ô&9Ñ9Ñ:Ô:Ð:Øð 2ð 2�Ø—’˜Q  7¨DÑ1Ô1Ð1Ð1ð2ð 2å˜�tÑ$Ô$ð =	>Ø�GŠG�A�A�d˜F‘O”O¥g­c°%©j¬jÑ&9Ô&9Ñ9Ñ:Ô:Ð:ØŸ+š+™-œ-ð 	2ð 	2‘��QÝð .Ø×+Ò+Ñ-Ô-Ð-Ð-Ð-Ð-å(¨Ñ-Ô-Ð-Ð-Ð-àŸš GÑ,Ô,�Ø—’�¥ F¡¤Ñ,Ô,Ñ-Ô-Ð-Ø—’˜‘”�Ø—’˜Q  7¨DÑ1Ô1Ð1Ð1ð	2ð 	2õ ˜�uÑ%Ô%ð 1	>Ø�GŠG�A�A�d˜F‘O”OÑ$Ô$Ð$ÝØ 4Ô#4À4ÔCUðñ ô ˆDð �MŠM˜!ÑÔÐÐÐÝ˜�tÑ$Ô$ð +	>Ø�GŠG�A�A�d˜F‘O”OÑ$Ô$Ð$Ø�NŠN˜1ÑÔÐÐÐÝ˜�zÑ*Ô*ð (	>àŒz˜SÒ Ð Ý Ð!GÑHÔHÐHÝ˜E¥:Ñ.Ô.ð @Ø—’˜˜˜$ ™œ­%°°s¸AÑ*>Ô*>Ñ>Ñ?Ô?Ð?Ð?åÐ >Ñ?Ô?Ð?õ �7‰|Œ|˜aÒÐÝ Ð!EÑFÔFÐFØ�NŠN˜5Ñ!Ô!Ð!Ø�OŠO˜A˜tœ|¨T¬\Ñ:Ô:Ð:Ð:Ð:àÐ!Ý ð>à@FñGñô ð ð Ô(×,Ò,¨U¬_¸dÑCÔCˆBàˆzØ#Ô/×5Ò5Ñ7Ô7ð ð ‘G�D˜!Ø—w’w˜t UÑ+Ô+ð Ø! 1¤8˜^˜Ø˜ðð �Bàˆ~Ø,.Ñ)�Ð)Ø—’˜QÐ 0Ð 0°°uÑ =Ô =¸wÈÑPÔPÐPÐPÐPð/ð õ    E¤OÔ$<Ñ <Ñ=Ô=Ð=r   c                 ó2
  ‡ ‡— ‰                      d¦  «        }|                     ¦   «         }|st          ¦   «         ‚||k    rRt          d‰                      d¦  «        ¦  «        d         }‰                      |¦  «                             d¦  «        }nd}|dk    rd}�n$|dk    rd}�n|d	k    rd
}�n|dk    r+t          d‰                      d¦  «        ¦  «        d         }�nß|dk    r+t          d‰                      d¦  «        ¦  «        d         }�n®|dk    r+t          d‰                      d¦  «        ¦  «        d         }�n}|dk    r+t          d‰                      d¦  «        ¦  «        d         }�nL|dk    r‚t          d‰                      d¦  «        ¦  «        d         }|dk    r)t          d‰                      d¦  «        ¦  «        d         }‰                      |¦  «                             d¦  «        }�nÄ|dk    �rFt          d‰                      d¦  «        ¦  «        d         }|dk    rÊ|dk    }t          d‰                      d¦  «        ¦  «        d         }‰ j        r6t          |r|nd¦  «        }|                     ‰‰ j        ‰ j	        ¦  «         �n"|rˆˆ fd„t          |¦  «        D ¦   «         }�ng }	 	 |                     ‰  	                    ‰¦  «        ¦  «         Œ)# t          $ r Y �nÈw xY w|dk    r)t          d‰                      d¦  «        ¦  «        d         }ˆˆ fd„t          |¦  «        D ¦   «         }�nw|dk    �rt          ¦   «         }t          d‰                      d¦  «        ¦  «        d         }|dk    r)t          d‰                      d¦  «        ¦  «        d         }t          |¦  «        D ]¢}	t          d‰                      d¦  «        ¦  «        d         }
|
dk    r)t          d‰                      d¦  «        ¦  «        d         }
|
dk    sJ ‚‰                      |
¦  «                             d¦  «        }‰  	                    ‰¦  «        ||<   Œ£nW|dk    r?‰ j        rt          ‰df¦  «        }n8t          ‰d
f¦  «        }|                     ¦   «         }nt!          d |z  ¦  «        ‚|�Q‰ j                             |d¦  «        }|�|                     ‰ |¦  «        }nt&                               d!|z  ¦  «         |S )"zMain decoder function.r   r   r   r$   Nri   rj   Trk   Frl   z<hr   rn   ro   r   rr   rs   é   rp   rq   rt   r   r   ru   éþ   Úrc                 ó:   •— g | ]}‰                      ‰¦  «        ‘ŒS r7   ©rŒ   ©r   r   r    r=   s     €€r   ú
<listcomp>z*BsdfSerializer._decode.<locals>.<listcomp>r  s#   ø€ Ð?Ð?Ð?°˜TŸ\š\¨!™_œ_Ð?Ð?Ð?r   c                 ó:   •— g | ]}‰                      ‰¦  «        ‘ŒS r7   rŸ   r    s     €€r   r¡   z*BsdfSerializer._decode.<locals>.<listcomp>~  s#   ø€ Ð;Ð;Ð;¨Q˜Ÿš a™œÐ;Ð;Ð;r   rv   rw   zParse error %rz'BSDF warning: no extension found for %r)r   rG   ÚEOFErrorr   ÚdecoderM   r‰   r‹   r~   rŒ   ÚrangerŠ   r   rN   r„   Ú	get_bytesÚRuntimeErrorr8   rF   r\   r]   )r=   r    Úcharr–   r!   r)   r�   Ún_sÚclosedr   Ún_namerZ   r”   r@   s   ``            r   rŒ   zBsdfSerializer._decodeD  sË  øø€ ð �vŠv�a‰yŒyˆØ�JŠJ‰LŒLˆð ð 	Ý‘*”*ÐØ�QŠYˆYÝ˜$ §¢ q¡	¤	Ñ*Ô*¨1Ô-ˆAà—V’V˜A‘Y”Y×%Ò% gÑ.Ô.ˆFˆFàˆFà�Š9ˆ9ØˆE‰EØ�$ŠYˆYØˆE‰EØ�$ŠYˆYØˆE‰EØ�$ŠYˆYÝ˜d A§F¢F¨1¡I¤IÑ.Ô.¨qÔ1ˆE‰EØ�$ŠYˆYÝ˜d A§F¢F¨1¡I¤IÑ.Ô.¨qÔ1ˆE‰EØ�$ŠYˆYÝ˜d A§F¢F¨1¡I¤IÑ.Ô.¨qÔ1ˆE‰EØ�$ŠYˆYÝ˜d A§F¢F¨1¡I¤IÑ.Ô.¨qÔ1ˆE‰EØ�$ŠYˆYÝ˜D !§&¢&¨¡)¤)Ñ,Ô,¨QÔ/ˆCØ�cŠzˆzÝ  a§f¢f¨Q¡i¤iÑ0Ô0°Ô3�Ø—F’F˜3‘K”K×&Ò& wÑ/Ô/ˆE‰EØ�$ŠY‰YÝ˜$ §¢ q¡	¤	Ñ*Ô*¨1Ô-ˆAØ�CŠxˆxà˜cš�Ý˜d A§F¢F¨1¡I¤IÑ.Ô.¨qÔ1�ØÔ'ð Ý&¨FÐ'; q q¸Ñ<Ô<�EØ—O’O A t¤|°T´\ÑBÔBÐBÑBØð Ø?Ð?Ð?Ð?Ð?µe¸A±h´hÐ?Ñ?Ô?�E‘Eà�Eðð:Ø!ŸLšL¨¯ª°a©¬Ñ9Ô9Ð9ð:øå#ð ð ð Ø™ðøøøð ˜’8�8Ý! $¨¯ª¨q©	¬	Ñ2Ô2°1Ô5�AØ;Ð;Ð;Ð;Ð;µ%¸±(´(Ð;Ñ;Ô;�‘Ø�$ŠY‰YÝ‘F”FˆEÝ˜$ §¢ q¡	¤	Ñ*Ô*¨1Ô-ˆAØ�CŠxˆxÝ˜d A§F¢F¨1¡I¤IÑ.Ô.¨qÔ1�Ý˜1‘X”Xð .ð .�Ý" 4¨¯ª°©¬Ñ3Ô3°AÔ6�Ø˜S’=�=Ý& t¨Q¯VªV°A©Y¬YÑ7Ô7¸Ô:�FØ ’z�z�z�zØ—v’v˜f‘~”~×,Ò,¨WÑ5Ô5�Ø"Ÿlšl¨1™oœo��d‘�ð.ð �$ŠYˆYØŒð )Ý˜a ˜Y™œ��å˜Q ˜JÑ'Ô'�ØŸšÑ(Ô(��åÐ/°$Ñ6Ñ7Ô7Ð7ð ÐØÔ(×,Ò,¨V°TÑ:Ô:ˆIØÐ$Ø!×(Ò(¨¨uÑ5Ô5��å—’ÐHÈ6ÑQÑRÔRÐRàˆs   Ë*K/ Ë/
K=Ë<K=c                 ór   — t          ¦   «         }|                      ||¦  «         |                     ¦   «         S )zSave the given object to bytes.)r   ÚsaveÚgetvalue)r=   Úobr    s      r   r%   zBsdfSerializer.encodež  s-   € å‰IŒIˆØ�	Š	�!�RÑÔÐØ�zŠz‰|Œ|Ðr   c                 óÂ  — |                      d¦  «         |                      t          j        dt          d         ¦  «        ¦  «         |                      t          j        dt          d         ¦  «        ¦  «         g }|                      |||d¦  «         t          |¦  «        dk    r4|d         }|j        |                     ¦   «         k    rt          d¦  «        ‚dS dS )z0Write the given object to the given file object.ó   BSDFr   r   r   Nz8The stream object must be the last object to be encoded.)	rz   ÚstructÚpackÚVERSIONr~   r'   Ú
_start_posÚtellrˆ   )r=   r    r¯   r�   Ústreams        r   r­   zBsdfSerializer.save¤  sÌ   € à	�Š�ÑÔÐØ	�Š•”˜D¥'¨!¤*Ñ-Ô-Ñ.Ô.Ð.Ø	�Š•”˜D¥'¨!¤*Ñ-Ô-Ñ.Ô.Ð.ð ˆà�Š�Q˜˜G TÑ*Ô*Ð*õ ˆw‰<Œ<˜!ÒÐØ˜Q”ZˆFØÔ  A§F¢F¡H¤HÒ,Ð,Ý ØQñô ð ð Ðà,Ð,r   c                 óJ   — t          |¦  «        }|                      |¦  «        S )z@Load the data structure that is BSDF-encoded in the given bytes.)r   Úload)r=   r*   r    s      r   r¤   zBsdfSerializer.decode·  s   € å�B‰KŒKˆØ�yŠy˜‰|Œ|Ðr   c                 óþ  — |                      d¦  «        }|dk    rt          d|z  ¦  «        ‚t          d|                      d¦  «        ¦  «        d         }t          d|                      d¦  «        ¦  «        d         }d||fz  }|t          d         k    rd}t          |t          |fz  ¦  «        ‚|t          d         k    r&d	}t
                               |t          |fz  ¦  «         |                      |¦  «        S )
z6Load a BSDF-encoded object from the given file object.r›   r±   z'This does not look like a BSDF file: %rr   r   r   z%i.%izLReading file with different major version (%s) from the implementation (%s).zWBSDF warning: reading file with higher minor version (%s) than the implementation (%s).)r   r§   r   r´   Ú__version__r\   r]   rŒ   )r=   r    Úf4Úmajor_versionÚminor_versionÚfile_versionr™   s          r   r¹   zBsdfSerializer.load¼  sõ   € ð �VŠV�A‰YŒYˆØ�Š=ˆ=ÝÐHÈ2ÑMÑNÔNÐNå! $¨¯ª¨q©	¬	Ñ2Ô2°1Ô5ˆÝ! $¨¯ª¨q©	¬	Ñ2Ô2°1Ô5ˆØ -°Ð!?Ñ?ˆØ�G AœJÒ&Ð&ð0ð õ ˜q¥K°Ð#>Ñ>Ñ?Ô?Ð?Ø�7 1œ:Ò%Ð%ð0ð õ �NŠN˜1¥¨\Ð:Ñ:Ñ;Ô;Ð;à�|Š|˜A‰ŒÐr   r   )r   FTFF)rŽ   Ú
__module__Ú__qualname__Ú__doc__rA   r<   r;   rg   r~   rŒ   r%   r­   r¤   r¹   r7   r   r   r5   r5   t   sØ   € € € € € ðð ð<'ð 'ð 'ð 'ð ØØØØð*ð *ð *ð *ð0)ð )ð )ðV1ð 1ð 1ðY>ð Y>ð Y>ðvXð Xð Xðtð ð ðð ð ð&ð ð ð
ð ð ð ð r   r5   c                   ó6   — e Zd ZdZdd„Zd„ Zed„ ¦   «         ZdS )r†   zBase class for streams.rx   c                 ó°   — d| _         d| _        t          |t          ¦  «        r
|| _        d}n|dk    rd| _        |dv sJ ‚|| _        d | _        d| _        d S )Nr   éÿÿÿÿr�   rx   )r�   rx   )Ú_iÚ_countr-   ÚintÚ_modeÚ_frµ   )r=   r‡   s     r   rA   zBaseStream.__init__Ü  sj   € ØˆŒØˆŒÝ�d�CÑ Ô ð 	ØˆDŒKØˆDˆDØ�SŠ[ˆ[ØˆDŒKØ�zÐ!Ð!Ð!Ð!ØˆŒ
ØˆŒØˆŒˆˆr   c                 ó˜   — | j         �t          d¦  «        ‚|| _         | j                              ¦   «         | _        || _        || _        d S )Nz(Stream object cannot be activated twice?)rÊ   ÚIOErrorr¶   rµ   r~   rŒ   )r=   ÚfileÚencode_funcÚdecode_funcs       r   r‹   zBaseStream._activateé  sC   € ØŒ7ÐÝÐDÑEÔEÐEØˆŒØœ'Ÿ,š,™.œ.ˆŒØ"ˆŒØ"ˆŒˆˆr   c                 ó   — | j         S )z$The mode of this stream: 'r' or 'w'.)rÉ   ©r=   s    r   r‡   zBaseStream.modeñ  s   € ð ŒzÐr   N)rx   )rŽ   rÀ   rÁ   rÂ   rA   r‹   Úpropertyr‡   r7   r   r   r†   r†   Ù  sX   € € € € € Ø!Ð!ðð ð ð ð#ð #ð #ð ðð ñ „Xðð ð r   r†   c                   ó^   — e Zd ZdZed„ ¦   «         Zed„ ¦   «         Zd„ Zdd„Zd„ Z	d„ Z
d	„ Zd
S )r‰   zjA streamable list object used for writing or reading.
    In read mode, it can also be iterated over.
    c                 ó   — | j         S )zdThe number of elements in the stream (can be -1 for unclosed
        streams in read-mode).
        )rÇ   rÑ   s    r   ÚcountzListStream.countü  s   € ð
 Œ{Ðr   c                 ó   — | j         S )z/The current index of the element to read/write.)rÆ   rÑ   s    r   ÚindexzListStream.index  s   € ð Œwˆr   c                 ó"  — | j         | j        k    rt          d¦  «        ‚| j        €t          d¦  «        ‚| j        j        rt          d¦  «        ‚|                      | j        || gd¦  «         | xj        dz  c_        | xj         dz  c_         dS )zAppend an item to the streaming list. The object is immediately
        serialized and written to the underlying file.
        z/Can only append items to the end of the stream.Nz.List stream is not associated with a file yet.zCannot stream to a close file.r   )rÇ   rÆ   rÌ   rÊ   rª   r~   )r=   Úitems     r   rŠ   zListStream.append  s’   € ð Œ;˜$œ'Ò!Ð!ÝÐKÑLÔLÐLØŒ7ˆ?ÝÐJÑKÔKÐKØŒ7Œ>ð 	<ÝÐ:Ñ;Ô;Ð;Ø�Š�T”W˜d T F¨DÑ1Ô1Ð1ØˆŒ�1‰ˆŒØˆŒ�qÑˆŒˆˆr   Fc                 ó  — | j         | j        k    rt          d¦  «        ‚| j        €t          d¦  «        ‚| j        j        rt          d¦  «        ‚| j                             ¦   «         }| j                             | j        dz
  dz
  ¦  «         | j                             t          d|rdnd	¦  «        ¦  «         | j                             t          d
| j         ¦  «        ¦  «         | j                             |¦  «         dS )zúClose the stream, marking the number of written elements. New
        elements may still be appended, but they won't be read during decoding.
        If ``unstream`` is False, the stream is turned into a regular list
        (not streaming).
        z-Can only close when at the end of the stream.Nú-ListStream is not associated with a file yet.z&Cannot close a stream on a close file.r   r   r   r   rœ   r   )
rÇ   rÆ   rÌ   rÊ   rª   r¶   Úseekrµ   rz   r   )r=   Úunstreamr   s      r   ÚclosezListStream.close  sß   € ð Œ;˜$œ'Ò!Ð!ÝÐIÑJÔJÐJØŒ7ˆ?ÝÐIÑJÔJÐJØŒ7Œ>ð 	DÝÐBÑCÔCÐCØŒG�LŠL‰NŒNˆØŒ�Š�T”_ qÑ(¨1Ñ,Ñ-Ô-Ð-ØŒ�Š•e˜D¨Ð": # #°sÑ;Ô;Ñ<Ô<Ð<ØŒ�Š•e˜D $¤+Ñ.Ô.Ñ/Ô/Ð/ØŒ�Š�Q‰Œˆˆˆr   c                 óü  — | j         dk    rt          d¦  «        ‚| j        €t          d¦  «        ‚t          | j        dd¦  «        rt          d¦  «        ‚| j        dk    rH| j        | j        k    rt          ¦   «         ‚| xj        dz  c_        |                      | j        ¦  «        S 	 |                      | j        ¦  «        }| xj        dz  c_        |S # t          $ r | j        | _        t          ¦   «         ‚w xY w)	zyRead and return the next element in the streaming list.
        Raises StopIteration if the stream is exhausted.
        r�   z$This ListStream in not in read mode.NrÛ   rª   z'Cannot read a stream from a close file.r   r   )	rÉ   rÌ   rÊ   ÚgetattrrÇ   rÆ   ÚStopIterationrŒ   r£   )r=   Úress     r   ÚnextzListStream.next,  sÿ   € ð Œ:˜ÒÐÝÐ@ÑAÔAÐAØŒ7ˆ?ÝÐIÑJÔJÐJÝ�4”7˜H dÑ+Ô+ð 	EÝÐCÑDÔDÐDØŒ;˜!ÒÐØŒw˜$œ+Ò%Ð%Ý#‘o”oÐ%ØˆGŒG�q‰LˆGŒGØ—<’< ¤Ñ(Ô(Ð(ð&Ø—l’l 4¤7Ñ+Ô+�Ø�”˜1‘�”Ø�
øÝð &ð &ð &Ø"œg�”Ý#‘o”oÐ%ð&øøøs   Â*+C Ã%C;c                 ó:   — | j         dk    rt          d¦  «        ‚| S )Nr�   z/Cannot iterate: ListStream in not in read mode.)rÉ   rÌ   rÑ   s    r   Ú__iter__zListStream.__iter__E  s#   € ØŒ:˜ÒÐÝÐKÑLÔLÐLØˆr   c                 ó*   — |                       ¦   «         S r   )rã   rÑ   s    r   Ú__next__zListStream.__next__J  s   € Ø�yŠy‰{Œ{Ðr   N)F)rŽ   rÀ   rÁ   rÂ   rÒ   rÕ   r×   rŠ   rÞ   rã   rå   rç   r7   r   r   r‰   r‰   ÷  s¤   € € € € € ðð ð ðð ñ „Xðð ðð ñ „Xððð ð ð ð ð ð ð(&ð &ð &ð2ð ð ð
ð ð ð ð r   r‰   c                   óP   — e Zd ZdZdd„Zd„ Zd„ Zd„ Zd„ Zd	„ Z	d
„ Z
d„ Zd„ Zd„ ZdS )r„   a8  Object to represent a blob of bytes. When used to write a BSDF file,
    it's a wrapper for bytes plus properties such as what compression to apply.
    When used to read a BSDF file, it can be used to read the data lazily, and
    also modify the data if reading in 'r+' mode and the blob isn't compressed.
    r   Fc                 ó²  — t          |t          ¦  «        rAd | _        |                      ||¦  «        | _        || _        | j        |z   | _        || _        d S t          |t          ¦  «        r^t          |¦  «        dk    rKt          |d         d¦  «        r5|\  | _        }d | _        |                      | j        |¦  «         d| _        d S t          d¦  «        ‚)Nr   r   r   FzWrong argument to create Blob.)r-   rƒ   rÊ   Ú_from_bytesÚ
compressedrO   Ú	used_sizeÚallocated_sizerP   r_   r'   ÚhasattrÚ
_from_fileÚ	_modifiedrH   )r=   r*   rO   Ú
extra_sizerP   Ú
allow_seeks         r   rA   zBlob.__init__X  sÌ   € Ý�b�%Ñ Ô ð 	>ØˆDŒGØ"×.Ò.¨r°;Ñ?Ô?ˆDŒOØ*ˆDÔØ"&¤.°:Ñ"=ˆDÔØ ,ˆDÔÐÐÝ˜�EÑ"Ô"ð 	>¥s¨2¡w¤w°!¢| |½ÀÀ1ÄÀvÑ8NÔ8N |Ø"$ÑˆDŒG�ZØ"ˆDŒOØ�OŠO˜DœG ZÑ0Ô0Ð0Ø"ˆDŒNˆNˆNåÐ<Ñ=Ô=Ð=r   c                 óì   — |dk    r|}nB|dk    rt          j        |d¦  «        }n&|dk    rt          j        |d¦  «        }n
J d¦   «         ‚t          |¦  «        | _        t          |¦  «        | _        |S )z"When used to wrap bytes in a blob.r   r   é	   r   FzUnknown compression identifier)rD   ÚcompressrE   r'   Ú	data_sizerì   )r=   r�   rO   rë   s       r   rê   zBlob._from_bytesg  s~   € à˜!ÒÐØˆJˆJØ˜AÒÐÝœ u¨aÑ0Ô0ˆJˆJØ˜AÒÐÝœ e¨QÑ/Ô/ˆJˆJà:Ð:Ñ:Ô:�5å˜U™œˆŒÝ˜Z™œˆŒØÐr   c                 ó°  — | j         dk    rƒ| j        dk    rx|                     t          d| j         ¦  «        ¦  «         |                     t          d| j        ¦  «        ¦  «         |                     t          | j        ¦  «        ¦  «         n{|                     t          dd| j         ¦  «        ¦  «         |                     t          dd| j        ¦  «        ¦  «         |                     t          dd| j        ¦  «        ¦  «         |                     t          d| j        ¦  «        ¦  «         | j        rB|                     dt          j	        | j
        ¦  «                             ¦   «         z   ¦  «         n|                     d¦  «         | j        dk    rYd	|                     ¦   «         d
z   d	z  z
  }|                     t          d|¦  «        ¦  «         |                     d|z  ¦  «         n#|                     t          dd¦  «        ¦  «         |                     | j
        ¦  «         |                     d| j         | j        z
  z  ¦  «         dS )zBPrivate friend method called by encoder to write a blob to a file.r   r   r   r   r   ÚBó   ÿó    r   r   N)rí   rO   rz   r   rì   r   rö   rP   ÚhashlibÚmd5rë   Údigestr¶   )r=   r    Ú	alignments      r   r…   zBlob._to_filev  sþ  € ð Ô #Ò%Ð%¨$Ô*:¸aÒ*?Ð*?Ø�GŠG•E˜$ Ô 3Ñ4Ô4Ñ5Ô5Ð5Ø�GŠG•E˜$ ¤Ñ/Ô/Ñ0Ô0Ð0Ø�GŠG•G˜DœNÑ+Ô+Ñ,Ô,Ð,Ð,à�GŠG•E˜%  dÔ&9Ñ:Ô:Ñ;Ô;Ð;Ø�GŠG•E˜%  d¤nÑ5Ô5Ñ6Ô6Ð6Ø�GŠG•E˜%  d¤nÑ5Ô5Ñ6Ô6Ð6à	�Š•�c˜4Ô+Ñ,Ô,Ñ-Ô-Ð-ØÔð 	Ø�GŠG�G�gœk¨$¬/Ñ:Ô:×AÒAÑCÔCÑCÑDÔDÐDÐDà�GŠG�GÑÔÐàÔ˜qÒ Ð Ø˜QŸVšV™XœX¨™\¨QÑ.Ñ.ˆIØ�GŠG•E˜$ 	Ñ*Ô*Ñ+Ô+Ð+Ø�GŠG�G˜iÑ'Ñ(Ô(Ð(Ð(à�GŠG•E˜$ ‘N”NÑ#Ô#Ð#à	�Š�”Ñ Ô Ð Ø	�Š�˜4Ô.°´Ñ?Ñ@ÑAÔAÐAÐAÐAr   c                 óÐ  — t          d|                     d¦  «        ¦  «        d         }|dk    r)t          d|                     d¦  «        ¦  «        d         }t          d|                     d¦  «        ¦  «        d         }|dk    r)t          d|                     d¦  «        ¦  «        d         }t          d|                     d¦  «        ¦  «        d         }|dk    r)t          d|                     d¦  «        ¦  «        d         }t          d|                     d¦  «        ¦  «        d         }t          d|                     d¦  «        ¦  «        d         }|r|                     d¦  «        }t          d|                     d¦  «        ¦  «        d         }	|                     |	¦  «         |rF|                     ¦   «         | _        | j        |z   | _        |                     | j        |z   ¦  «         n@d| _        d| _        |                     |¦  «        | _        |                     ||z
  ¦  «         |	| _        || _        |r|nd| _	        || _
        || _        || _        dS )	z(Used when a blob is read by the decoder.r   r   r   r   r   r   é   N)r   r   r¶   Ú	start_posÚend_posrÜ   rë   rþ   rO   rP   rì   rí   rö   )
r=   r    rò   rí   rì   rö   rO   Úhas_checksumÚchecksumrþ   s
             r   rï   zBlob._from_file’  s  € õ # 4¨¯ª°©¬Ñ3Ô3°AÔ6ˆØ˜SÒ Ð Ý& t¨Q¯VªV°A©Y¬YÑ7Ô7¸Ô:ˆNÝ˜d A§F¢F¨1¡I¤IÑ.Ô.¨qÔ1ˆ	Ø˜ÒÐÝ! $¨¯ª¨q©	¬	Ñ2Ô2°1Ô5ˆIÝ˜d A§F¢F¨1¡I¤IÑ.Ô.¨qÔ1ˆ	Ø˜ÒÐÝ! $¨¯ª¨q©	¬	Ñ2Ô2°1Ô5ˆIå  a§f¢f¨Q¡i¤iÑ0Ô0°Ô3ˆÝ   q§v¢v¨a¡y¤yÑ1Ô1°!Ô4ˆØð 	"Ø—v’v˜b‘z”zˆHå˜d A§F¢F¨1¡I¤IÑ.Ô.¨qÔ1ˆ	Ø	�ŠˆyÑÔÐàð 	/ØŸVšV™XœXˆDŒNØœ>¨IÑ5ˆDŒLØ�FŠF�4”> NÑ2Ñ3Ô3Ð3Ð3à!ˆDŒNØˆDŒLØŸfšf YÑ/Ô/ˆDŒOØ�FŠF�> IÑ-Ñ.Ô.Ð.à"ˆŒØ&ˆÔØ(4Ð>˜H˜H¸$ˆÔØ"ˆŒØ,ˆÔØ"ˆŒˆˆr   c                 óÖ   — | j         €t          d¦  «        ‚|dk     r
| j        |z   }|dk     s|| j        k    rt          d¦  «        ‚| j                              | j        |z   ¦  «         dS )z8Seek to the given position (relative to the blob start).Nz>Cannot seek in a blob that is not created by the BSDF decoder.r   zSeek beyond blob boundaries.)rÊ   r§   rí   rÌ   rÜ   r  )r=   Úps     r   rÜ   z	Blob.seek¹  s|   € àŒ7ˆ?ÝØSñô ð ð ˆqŠ5ˆ5ØÔ# aÑ'ˆAØˆqŠ5ˆ5�A˜Ô+Ò+Ð+ÝÐ8Ñ9Ô9Ð9ØŒ�Š�T”^ aÑ'Ñ(Ô(Ð(Ð(Ð(r   c                 óp   — | j         €t          d¦  «        ‚| j                              ¦   «         | j        z
  S )zCGet the current file pointer position (relative to the blob start).Nz>Cannot tell in a blob that is not created by the BSDF decoder.)rÊ   r§   r¶   r  rÑ   s    r   r¶   z	Blob.tellÅ  s7   € àŒ7ˆ?ÝØSñô ð ð Œw�|Š|‰~Œ~ ¤Ñ.Ð.r   c                 ó  — | j         €t          d¦  «        ‚| j        rt          d¦  «        ‚| j                              ¦   «         t          |¦  «        z   | j        k    rt          d¦  «        ‚d| _        | j                              |¦  «        S )zWrite bytes to the blob.Nz?Cannot write in a blob that is not created by the BSDF decoder.z,Cannot arbitrarily write in compressed blob.zWrite beyond blob boundaries.T)	rÊ   r§   rO   rÌ   r¶   r'   r  rð   rz   )r=   r*   s     r   rz   z
Blob.writeÍ  s‡   € àŒ7ˆ?ÝØTñô ð ð Ôð 	JÝÐHÑIÔIÐIØŒ7�<Š<‰>Œ>�C ™GœGÑ# d¤lÒ2Ð2ÝÐ9Ñ:Ô:Ð:ØˆŒØŒw�}Š}˜RÑ Ô Ð r   c                 óö   — | j         €t          d¦  «        ‚| j        rt          d¦  «        ‚| j                              ¦   «         |z   | j        k    rt          d¦  «        ‚| j                              |¦  «        S )zRead n bytes from the blob.Nz>Cannot read in a blob that is not created by the BSDF decoder.z+Cannot arbitrarily read in compressed blob.zRead beyond blob boundaries.)rÊ   r§   rO   rÌ   r¶   r  r   )r=   r!   s     r   r   z	Blob.readÚ  sx   € àŒ7ˆ?ÝØSñô ð ð Ôð 	IÝÐGÑHÔHÐHØŒ7�<Š<‰>Œ>˜AÑ ¤Ò,Ð,ÝÐ8Ñ9Ô9Ð9ØŒw�|Š|˜A‰ŒÐr   c                 ó¼  — | j         �| j         }ng| j                             ¦   «         }|                      d¦  «         | j                             | j        ¦  «        }| j                             |¦  «         | j        dk    r|}nW| j        dk    rt          j        |¦  «        }n7| j        dk    rt          j        |¦  «        }nt          d| j        z  ¦  «        ‚|S )z&Get the contents of the blob as bytes.Nr   r   r   zInvalid compression %i)rë   rÊ   r¶   rÜ   r   rì   rO   rD   Ú
decompressrE   r§   )r=   rë   r   r�   s       r   r¦   zBlob.get_bytesæ  sÆ   € àŒ?Ð&ØœˆJˆJà”—’‘”ˆAØ�IŠI�a‰LŒLˆLØœŸš d¤nÑ5Ô5ˆJØŒG�LŠL˜‰OŒOˆOØÔ˜qÒ Ð ØˆEˆEØÔ Ò"Ð"Ý”O JÑ/Ô/ˆEˆEØÔ Ò"Ð"Ý”N :Ñ.Ô.ˆEˆEåÐ7¸$Ô:JÑJÑKÔKÐKØˆr   c                 óh  — | j         r¨| j        r£|                      d¦  «         | j                             | j        ¦  «        }| j                             | j        | j        z
  dz
  dz
  ¦  «         | j                             t          j
        |¦  «                             ¦   «         ¦  «         dS dS dS )zZReset the blob's checksum if present. Call this after modifying
        the data.
        r   r   r   N)rP   rð   rÜ   rÊ   r   rì   r  rþ   rz   rû   rü   rý   )r=   rë   s     r   Úupdate_checksumzBlob.update_checksumù  s§   € ð
 Ôð 	< ¤ð 	<Ø�IŠI�a‰LŒLˆLØœŸš d¤nÑ5Ô5ˆJØŒG�LŠL˜œ¨$¬.Ñ8¸1Ñ<¸rÑAÑBÔBÐBØŒG�MŠM�'œ+ jÑ1Ô1×8Ò8Ñ:Ô:Ñ;Ô;Ð;Ð;Ð;ð		<ð 	<ð 	<ð 	<r   N)r   r   F)rŽ   rÀ   rÁ   rÂ   rA   rê   r…   rï   rÜ   r¶   rz   r   r¦   r  r7   r   r   r„   r„   N  s½   € € € € € ðð ð>ð >ð >ð >ðð ð ðBð Bð Bð8%#ð %#ð %#ðN
)ð 
)ð 
)ð/ð /ð /ð!ð !ð !ð
ð 
ð 
ðð ð ð&	<ð 	<ð 	<ð 	<ð 	<r   r„   c                 óF   — t          |fi |¤Ž}|                     | ¦  «        S )zrSave (BSDF-encode) the given object to bytes.
    See `BSDFSerializer` for details on extensions and options.
    )r5   r%   )r¯   r>   r?   r2   s       r   r%   r%     ó)   € õ 	�zÐ-Ð- WÐ-Ð-€AØ�8Š8�B‰<Œ<Ðr   c                 óò   — t          |fi |¤Ž}t          | t          ¦  «        r@t          | d¦  «        5 }|                     ||¦  «        cddd¦  «         S # 1 swxY w Y   dS |                     | |¦  «        S )zŽSave (BSDF-encode) the given object to the given filename or
    file object. See` BSDFSerializer` for details on extensions and options.
    ÚwbN)r5   r-   r.   Úopenr­   )r    r¯   r>   r?   r2   Úfps         r   r­   r­     s½   € õ 	�zÐ-Ð- WÐ-Ð-€AÝ�!•\Ñ"Ô"ð Ý�!�T‰]Œ]ð 	"˜bØ—6’6˜"˜b‘>”>ð	"ð 	"ð 	"ð 	"ñ 	"ô 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"øøøð 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð �vŠv�a˜‰}Œ}Ðs   ³AÁAÁAc                 óF   — t          |fi |¤Ž}|                     | ¦  «        S )zpLoad a (BSDF-encoded) structure from bytes.
    See `BSDFSerializer` for details on extensions and options.
    )r5   r¤   )r*   r>   r?   r2   s       r   r¤   r¤     r  r   c                 óV  — t          |fi |¤Ž}t          | t          ¦  «        rs|                      d¦  «        rt          j                             | ¦  «        } t          | d¦  «        5 }|                     |¦  «        cddd¦  «         S # 1 swxY w Y   dS |                     | ¦  «        S )zŒLoad a (BSDF-encoded) structure from the given filename or file object.
    See `BSDFSerializer` for details on extensions and options.
    )z~/z~\ÚrbN)	r5   r-   r.   Ú
startswithÚosÚpathÚ
expanduserr  r¹   )r    r>   r?   r2   r  s        r   r¹   r¹   $  sâ   € õ 	�zÐ-Ð- WÐ-Ð-€AÝ�!•\Ñ"Ô"ð Ø�<Š<˜Ñ&Ô&ð 	&Ý”×"Ò" 1Ñ%Ô%ˆAÝ�!�T‰]Œ]ð 	˜bØ—6’6˜"‘:”:ð	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	ð �vŠv�a‰yŒyÐs   Á'B	Â	BÂBc                   ó2   — e Zd ZdZdZdZd„ Zd„ Zd„ Zd„ Z	dS )	rY   aC  Base class to implement BSDF extensions for special data types.

    Extension classes are provided to the BSDF serializer, which
    instantiates the class. That way, the extension can be somewhat dynamic:
    e.g. the NDArrayExtension exposes the ndarray class only when numpy
    is imported.

    A extension instance must have two attributes. These can be attributes of
    the class, or of the instance set in ``__init__()``:

    * name (str): the name by which encoded values will be identified.
    * cls (type): the type (or list of types) to match values with.
      This is optional, but it makes the encoder select extensions faster.

    Further, it needs 3 methods:

    * `match(serializer, value) -> bool`: return whether the extension can
      convert the given value. The default is ``isinstance(value, self.cls)``.
    * `encode(serializer, value) -> encoded_value`: the function to encode a
      value to more basic data types.
    * `decode(serializer, encoded_value) -> value`: the function to decode an
      encoded value back to its intended representation.

    Ú r7   c                 óR   — d| j         ›dt          t          | ¦  «        ¦  «        ›d�S )Nz<BSDF extension z at 0xú>)rZ   ÚhexÚidrÑ   s    r   Ú__repr__zExtension.__repr__[  s%   € € Ø04´	°	°	½3½rÀ$¹x¼x¹=¼=¸=¸=ÐIÐIr   c                 ó,   — t          || j        ¦  «        S r   )r-   r^   ©r=   r2   r‘   s      r   r0   zExtension.match^  s   € Ý˜!˜TœXÑ&Ô&Ð&r   c                 ó   — t          ¦   «         ‚r   ©ÚNotImplementedErrorr#  s      r   r%   zExtension.encodea  ó   € Ý!Ñ#Ô#Ð#r   c                 ó   — t          ¦   «         ‚r   r%  r#  s      r   r¤   zExtension.decoded  r'  r   N)
rŽ   rÀ   rÁ   rÂ   rZ   r^   r!  r0   r%   r¤   r7   r   r   rY   rY   >  si   € € € € € ðð ð2 €DØ
€CðJð Jð Jð'ð 'ð 'ð$ð $ð $ð$ð $ð $ð $ð $r   rY   c                   ó"   — e Zd ZdZeZd„ Zd„ ZdS )ÚComplexExtensionr–   c                 ó   — |j         |j        fS r   )ÚrealÚimagr#  s      r   r%   zComplexExtension.encodel  s   € Ø”˜œÐÐr   c                 ó:   — t          |d         |d         ¦  «        S )Nr   r   )Úcomplexr#  s      r   r¤   zComplexExtension.decodeo  s   € Ý�q˜”t˜Q˜qœTÑ"Ô"Ð"r   N)rŽ   rÀ   rÁ   rZ   r/  r^   r%   r¤   r7   r   r   r*  r*  h  s<   € € € € € Ø€DØ
€Cð ð  ð  ð#ð #ð #ð #ð #r   r*  c                   ó*   — e Zd ZdZd„ Zd„ Zd„ Zd„ ZdS )ÚNDArrayExtensionÚndarrayc                 óF   — dt           j        v rdd l}|j        | _        d S d S )NÚnumpyr   )ÚsysÚmodulesr4  r2  r^   )r=   Únps     r   rA   zNDArrayExtension.__init__v  s0   € Ø•c”kÐ!Ð!ØÐÐÐà”zˆDŒHˆHˆHð "Ð!r   c                 ób   — t          |d¦  «        ot          |d¦  «        ot          |d¦  «        S )NÚshapeÚdtypeÚtobytes)rî   r#  s      r   r0   zNDArrayExtension.match|  s0   € Ý�q˜'Ñ"Ô"ÐT¥w¨q°'Ñ':Ô':ÐT½wÀqÈ)Ñ?TÔ?TÐTr   c                 óx   — t          |j        t          |j        ¦  «        |                     ¦   «         ¬¦  «        S )N)r9  r:  Údata)r   r9  Ú	text_typer:  r;  r#  s      r   r%   zNDArrayExtension.encode  s+   € Ý˜!œ'­°1´7Ñ);Ô);À!Ç)Â)Á+Ä+ÐNÑNÔNÐNr   c                 ó²   — 	 dd l }n# t          $ r |cY S w xY w|                     |d         |d         ¬¦  «        }|                     |d         ¦  «        }|S )Nr   r=  r:  )r:  r9  )r4  ÚImportErrorÚ
frombufferÚreshape)r=   r2   r‘   r7  Úas        r   r¤   zNDArrayExtension.decode‚  sq   € ð	ØÐÐÐÐøÝð 	ð 	ð 	ØˆHˆHˆHð	øøøà�MŠM˜!˜Fœ)¨1¨W¬:ˆMÑ6Ô6ˆØ�IŠI�a˜”jÑ!Ô!ˆØˆs   ‚ ‡•N)rŽ   rÀ   rÁ   rZ   rA   r0   r%   r¤   r7   r   r   r1  r1  s  s[   € € € € € Ø€Dð"ð "ð "ðUð Uð UðOð Oð Oðð ð ð ð r   r1  Ú__main__r   )>rÂ   Ú
__future__r   r   r   rE   rû   Úloggingr  r/   r²   r5  ÚtypesrD   Úior   Ú	getLoggerrŽ   r\   r´   Újoinr»   Úversion_infor�   r   r>  r.   r}   rÈ   r{   rW   ra   ÚbasicConfigÚunicodeÚ
basestringÚlongÚ	ClassTyper³   r   Úunpackr   r   r"   r+   r3   Úobjectr5   r†   r‰   r„   r%   r­   r¤   r¹   ÚloadsÚdumpsrY   r*  r1  r:   Úbsdf_cliÚmainr7   r   r   ú<module>rW     s_  ðð
ð ð& AÐ @Ð @Ð @Ð @Ð @Ð @Ð @Ð @Ð @à 
€
€
€
Ø €€€Ø €€€Ø 	€	€	€	Ø 	€	€	€	Ø €€€Ø 
€
€
€
Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð à	ˆÔ	˜8Ñ	$Ô	$€ð €Ø�hŠhÐ/Ð/ wÐ/Ñ/Ô/Ñ/Ô/€ð 
Ô�qÔ˜QÒ€Øð 'Ø€IØ€LØ€MØ€MØ€J€Jà€GÔÑÔÐØ€IØ€LØ€MØ˜$�K€MØ�u”Ð&€Jð 	Œ€ØŒM€	ð$ð $ð $ðð ð ðð ð ðð ð ð_ð _ð _ð _ð _�Vñ _ô _ð _ðJð ð ð ð �ñ ô ð ð<Tð Tð Tð Tð T�ñ Tô Tð Tðnt<ð t<ð t<ð t<ð t<ˆ6ñ t<ô t<ð t<ðtð ð ð ð	ð 	ð 	ð 	ðð ð ð ðð ð ð ð 	€Ø€ð'$ð '$ð '$ð '$ð '$�ñ '$ô '$ð '$ðT#ð #ð #ð #ð #�yñ #ô #ð #ðð ð ð ð �yñ ô ð ð2 (Ð)9Ð:Ð ð ˆzÒÐà€O€O€Oà€H„M�O„O€O€O€Oð	 Ðr   