§
    ‚Ûg0Y  ã            
       ó€  — d Z ddlmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
mZ ddlZddlmZ ddlZ ej        e¦  «        Z G d	„ d
e¦  «        ZdZdZddddddddddœ	Zefd„Z G d„ de¦  «        ZdZ ej        e¦  «        ZdZ ej        e¦  «        ZdZ ej        e¦  «        Z dZ! ej        e!¦  «        Z"dZ# ej        e#¦  «        Z$ G d„ d e¦  «        Z% G d!„ d"e%¦  «        Z& G d#„ d$e%¦  «        Z' G d%„ d&¦  «        Z(d'„ Z)d(„ Z*d)„ Z+ed*k    r,ddl,Z,ddl-Z- e,j.         e-j/        ¦   «         j0        ¦  «         dS dS )+a¯  ttLib/sfnt.py -- low-level module to deal with the sfnt file format.

Defines two public classes:

- SFNTReader
- SFNTWriter

(Normally you don't have to use these classes explicitly; they are
used automatically by ttLib.TTFont.)

The reading and writing of sfnt files is separated in two distinct
classes, since whenever the number of tables changes or whenever
a table's length changes you need to rewrite the whole file anyway.
é    )ÚBytesIO)ÚSimpleNamespace)ÚTag)Ússtruct)Ú
TTLibErrorÚTTLibFileIsCollectionErrorN)ÚOrderedDictc                   óJ   — e Zd Zd„ Zdd„Zd„ ZeZd„ Zd„ Zd„ Z	d	„ Z
d
„ Zd„ ZdS )Ú
SFNTReaderc                 ó@  — |rƒ| t           u rz|d         }|                     d¦  «         t          |                     d¦  «        ¦  «        }|                     d¦  «         |dk    r ddlm} t                               |¦  «        S t                               | ¦  «        S )zmReturn an instance of the SFNTReader sub-class which is compatible
        with the input file type.
        r   é   ÚwOF2)ÚWOFF2Reader)r   Úseekr   ÚreadÚfontTools.ttLib.woff2r   ÚobjectÚ__new__)ÚclsÚargsÚkwargsÚinfileÚsfntVersionr   s         úJ/granary/edev/quantum/lib/python3.11/site-packages/fontTools/ttLib/sfnt.pyr   zSFNTReader.__new__   s•   € ð ð 		3�C�:Ð%Ð%Ø˜!”WˆFØ�KŠK˜‰NŒNˆNÝ˜fŸkšk¨!™nœnÑ-Ô-ˆKØ�KŠK˜‰NŒNˆNØ˜fÒ$Ð$à=Ð=Ð=Ð=Ð=Ð=å—~’~ kÑ2Ô2Ð2å�~Š~˜cÑ"Ô"Ð"ó    r   éÿÿÿÿc                 ó>  — || _         || _        d | _        d | _        t          | _        | j                              d¦  «         | j                              d¦  «        | _        | j                              d¦  «         | j        dk    rÍt          | j         ¦  «        }|j
        }d|cxk    r|k     sn t          d|dz
  z  ¦  «        ‚|| _
        | j                              |j        |         ¦  «         | j                              t          ¦  «        }t          |¦  «        t          k    rt          d¦  «        ‚t!          j        t$          || ¦  «         ná| j        dk    rud| _        t&          | _        | j                              t(          ¦  «        }t          |¦  «        t(          k    rt          d	¦  «        ‚t!          j        t*          || ¦  «         na| j                              t          ¦  «        }t          |¦  «        t          k    rt          d
¦  «        ‚t!          j        t$          || ¦  «         t-          | j        ¦  «        | _        | j        dvrt          d¦  «        ‚i }t/          | j        ¦  «        D ]I}|                      ¦   «         }	|	                     | j         ¦  «         t-          |	j        ¦  «        }
|	||
<   ŒJt7          t9          |                     ¦   «         d„ ¬¦  «        ¦  «        | _        | j        dk    rt?          | ¦  «        | _        d S d S )Nr   r   s   ttcfz2specify a font number between 0 and %d (inclusive)é   ú'Not a Font Collection (not enough data)ó   wOFFÚwoffz!Not a WOFF font (not enough data)z1Not a TrueType or OpenType font (not enough data))ú   ÚOTTOÚtruez1Not a TrueType or OpenType font (bad sfntVersion)c                 ó   — | d         j         S )Nr   )Úoffset)Úis    r   ú<lambda>z%SFNTReader.__init__.<locals>.<lambda>]   s   € ÀqÈÄtÄ{€ r   )Úkey) ÚfileÚcheckChecksumsÚflavorÚ
flavorDataÚSFNTDirectoryEntryÚDirectoryEntryr   r   r   ÚreadTTCHeaderÚnumFontsr   ÚoffsetTableÚsfntDirectorySizeÚlenr   r   ÚunpackÚsfntDirectoryFormatÚWOFFDirectoryEntryÚwoffDirectorySizeÚwoffDirectoryFormatr   ÚrangeÚ	numTablesÚfromFileÚtagr	   ÚsortedÚitemsÚtablesÚWOFFFlavorData)Úselfr*   r+   Ú
fontNumberÚheaderr1   Údatar@   r'   Úentryr=   s              r   Ú__init__zSFNTReader.__init__/   sÍ  € ØˆŒ	Ø,ˆÔàˆŒØˆŒÝ0ˆÔØŒ	�Š�qÑÔÐØœ9Ÿ>š>¨!Ñ,Ô,ˆÔØŒ	�Š�qÑÔÐØÔ˜wÒ&Ð&Ý" 4¤9Ñ-Ô-ˆFØ”ˆHØ˜
Ð-Ð-Ò-Ð- XÒ-Ð-Ð-Ð-Ý0ØHØ !‘|ñ%ñô ð ð %ˆDŒMØŒI�NŠN˜6Ô-¨jÔ9Ñ:Ô:Ð:Ø”9—>’>Õ"3Ñ4Ô4ˆDÝ�4‰yŒyÕ-Ò-Ð-Ý Ð!JÑKÔKÐKÝŒNÕ.°°dÑ;Ô;Ð;Ð;ØÔ Ò(Ð(Ø ˆDŒKÝ"4ˆDÔØ”9—>’>Õ"3Ñ4Ô4ˆDÝ�4‰yŒyÕ-Ò-Ð-Ý Ð!DÑEÔEÐEÝŒNÕ.°°dÑ;Ô;Ð;Ð;à”9—>’>Õ"3Ñ4Ô4ˆDÝ�4‰yŒyÕ-Ò-Ð-Ý Ð!TÑUÔUÐUÝŒNÕ.°°dÑ;Ô;Ð;Ý˜tÔ/Ñ0Ô0ˆÔàÔÐ#GÐGÐGÝÐPÑQÔQÐQØˆÝ�t”~Ñ&Ô&ð 	 ð 	 ˆAØ×'Ò'Ñ)Ô)ˆEØ�NŠN˜4œ9Ñ%Ô%Ð%Ý�e”i‘.”.ˆCØˆF�3‰KˆKÝ!¥&¨¯ª©¬Ð=RÐ=RÐ"SÑ"SÔ"SÑTÔTˆŒð Œ;˜&Ò Ð Ý,¨TÑ2Ô2ˆDŒOˆOˆOð !Ð r   c                 ó   — || j         v S ©N©r@   ©rB   r=   s     r   Úhas_keyzSFNTReader.has_keyc   s   € Ø�d”kÐ!Ð!r   c                 ó4   — | j                              ¦   «         S rI   )r@   Úkeys©rB   s    r   rN   zSFNTReader.keysh   s   € ØŒ{×ÒÑ!Ô!Ð!r   c                 ó†  — | j         t          |¦  «                 }|                     | j        ¦  «        }| j        r…|dk    r&t          |dd…         dz   |dd…         z   ¦  «        }nt          |¦  «        }| j        dk    r||j        k    sJ d|z  ¦   «         ‚n&||j        k    rt                               d|¦  «         |S )zFetch the raw table data.ÚheadNé   ó       é   r   zbad checksum for '%s' table)	r@   r   ÚloadDatar*   r+   ÚcalcChecksumÚcheckSumÚlogÚwarning)rB   r=   rF   rE   Úchecksums        r   Ú__getitem__zSFNTReader.__getitem__k   sÌ   € à”�C ™HœHÔ%ˆØ�~Š~˜dœiÑ(Ô(ˆØÔð 	@Ø�fŠ}ˆ}å'¨¨R¨a¨R¬°;Ñ(>ÀÀbÀcÀcÄÑ(JÑKÔK��å'¨Ñ-Ô-�ØÔ" QÒ&Ð&à 5¤>Ò1Ð1Ð1Ð3PÐSVÑ3VÑ1Ô1Ð1Ð1Ø˜Uœ^Ò+Ð+å—’Ð9¸3Ñ?Ô?Ð?Øˆr   c                 ó0   — | j         t          |¦  «        = d S rI   )r@   r   rK   s     r   Ú__delitem__zSFNTReader.__delitem__}   s   € ØŒK�˜C™œÐ!Ð!Ð!r   c                 ó8   — | j                              ¦   «          d S rI   )r*   ÚcloserO   s    r   r_   zSFNTReader.close€   s   € ØŒ	�ŠÑÔÐÐÐr   c                 óÖ   — t          | j        t          ¦  «        r| j        S | j                             ¦   «         }|d= | j        j        |d<   | j                             ¦   «         |d<   |S )Nr*   Ú	_filenameÚ_filepos)Ú
isinstancer*   r   Ú__dict__ÚcopyÚnameÚtell©rB   Ústates     r   Ú__getstate__zSFNTReader.__getstate__‰   sc   € Ý�d”i¥Ñ)Ô)ð 	!à”=Ð ð ”×"Ò"Ñ$Ô$ˆØ�&ˆMØ!œYœ^ˆˆkÑØ œIŸNšNÑ,Ô,ˆˆjÑØˆr   c                 óì   — d|vrUt          |                     d¦  «        d¦  «        | _        | j                             |                     d¦  «        ¦  «         | j                             |¦  «         d S )Nr*   ra   Úrbrb   )ÚopenÚpopr*   r   rd   Úupdaterh   s     r   Ú__setstate__zSFNTReader.__setstate__•   sf   € Ø˜ÐÐÝ˜UŸYšY {Ñ3Ô3°TÑ:Ô:ˆDŒIØŒI�NŠN˜5Ÿ9š9 ZÑ0Ô0Ñ1Ô1Ð1ØŒ×Ò˜UÑ#Ô#Ð#Ð#Ð#r   N)r   r   )Ú__name__Ú
__module__Ú__qualname__r   rG   rL   Ú__contains__rN   r[   r]   r_   rj   rp   © r   r   r   r      s¨   € € € € € ð#ð #ð #ð"23ð 23ð 23ð 23ðh"ð "ð "ð €Lð"ð "ð "ðð ð ð$"ð "ð "ðð ð ð
ð 
ð 
ð$ð $ð $ð $ð $r   r   é   Fr   é   é   rR   é
   é   é   é2   éd   )	r   é   rw   r   rx   rv   é   rR   é	   c                 ó¾   — d|cxk    rdk    sn t          d|z  ¦  «        ‚t          r|dk    rddlm}  || |¦  «        S ddlm}  || t
          |         ¬¦  «        S )aE  Compress 'data' to Zlib format. If 'USE_ZOPFLI' variable is True,
    zopfli is used instead of the zlib module.
    The compression 'level' must be between 0 and 9. 1 gives best speed,
    9 gives best compression (0 gives no compression at all).
    The default value is a compromise between speed and compression (6).
    r   r€   zBad compression level: %s)Úcompress)Únumiterations)Ú
ValueErrorÚ
USE_ZOPFLIÚzlibr‚   Úzopfli.zlibÚZOPFLI_LEVELS)rE   Úlevelr‚   s      r   r‚   r‚   ³   s�   € ð �ˆOˆOŠOˆO˜!ŠOˆOˆOˆOÝÐ4°uÑ<Ñ=Ô=Ð=Ýð B˜ !š˜Ø!Ð!Ð!Ð!Ð!Ð!àˆx˜˜eÑ$Ô$Ð$à(Ð(Ð(Ð(Ð(Ð(àˆx˜­M¸%Ô,@ÐAÑAÔAÐAr   c                   óL   — e Zd Zd„ Z	 	 	 dd„Zd„ Zd„ Zd„ Zd„ Zd	„ Z	d
„ Z
d„ ZdS )Ú
SFNTWriterc                 óð   — d}|rd|v r	|d         }n|rt          |¦  «        dk    r|d         }| t          u r&|dk    r ddlm} t                               |¦  «        S t                               | ¦  «        S )zpReturn an instance of the SFNTWriter sub-class which is compatible
        with the specified 'flavor'.
        Nr,   rw   Úwoff2r   )ÚWOFF2Writer)r4   r‹   r   rŽ   r   r   )r   r   r   r,   rŽ   s        r   r   zSFNTWriter.__new__Ç   s’   € ð ˆØð 	�h &Ð(Ð(Ø˜HÔ%ˆFˆFØð 	•c˜$‘i”i !’m�mØ˜!”WˆFØ•*ÐÐØ˜Ò Ð à=Ð=Ð=Ð=Ð=Ð=å—~’~ kÑ2Ô2Ð2å�~Š~˜cÑ"Ô"Ð"r   r"   Nc                 ó&  — || _         || _        t          |¦  «        | _        || _        || _        | j        dk    rCt          | _        t          | _	        t          | _        d| _        t          |t          z  z   | _        nb| j        rJ d| j        z  ¦   «         ‚t           | _        t          | _	        t"          | _        ddlm}  ||d¦  «        \  | _        | _        | _        | j                              ¦   «         | _        | j        | j	        z   || j        j        z  z   | _        | j                              | j        ¦  «         | j                              d| j        | j                              ¦   «         z
  z  ¦  «         t;          ¦   «         | _        d S )Nr!   ÚwOFFúUnknown flavor '%s'r   ©ÚgetSearchRangeé   ó    )r*   r;   r   r   r,   r-   r9   ÚdirectoryFormatr8   ÚdirectorySizer7   r/   Ú	signaturer3   ÚsfntDirectoryEntrySizeÚorigNextTableOffsetr6   r.   ÚfontTools.ttLibr“   ÚsearchRangeÚentrySelectorÚ
rangeShiftrg   ÚdirectoryOffsetÚ
formatSizeÚnextTableOffsetr   Úwriter	   r@   )rB   r*   r;   r   r,   r-   r“   s          r   rG   zSFNTWriter.__init__Ù   s  € ð ˆŒ	Ø"ˆŒÝ˜{Ñ+Ô+ˆÔØˆŒØ$ˆŒàŒ;˜&Ò Ð Ý#6ˆDÔ Ý!2ˆDÔÝ"4ˆDÔà#ˆDŒNõ " IÕ0FÑ$FÑFð Ô$Ð$ð ”{ÐGÐGÐ$9¸D¼KÑ$GÑGÔGÐGÝ#6ˆDÔ Ý!2ˆDÔÝ"4ˆDÔà6Ð6Ð6Ð6Ð6Ð6àDRÀNØ˜2ñEô EÑAˆDÔ˜dÔ0°$´/ð  $œyŸ~š~Ñ/Ô/ˆÔàÔ ØÔ ñ!à˜$Ô-Ô8Ñ8ñ9ð 	Ôð 	Œ	�Š�tÔ+Ñ,Ô,Ð,àŒ	�Š˜ Ô!5¸¼	¿ºÑ8HÔ8HÑ!HÑIÑJÔJÐJÝ!‘m”mˆŒˆˆr   c                 óP   — || j         v rt          d|z  ¦  «        ‚|| j         |<   d S )Núcannot rewrite '%s' table)r@   r   )rB   r=   rF   s      r   ÚsetEntryzSFNTWriter.setEntry
  s5   € Ø�$”+ÐÐÝÐ8¸3Ñ>Ñ?Ô?Ð?à ˆŒ�CÑÐÐr   c                 óê  — || j         v rt          d|z  ¦  «        ‚|                      ¦   «         }||_        | j        |_        |dk    r9t          |dd…         dz   |dd…         z   ¦  «        |_        || _        d|_	        nt          |¦  «        |_        | 
                    | j        |¦  «         | j        dk    r'| j        |_        | xj        |j        d	z   d
z  z  c_        | j        |j        d	z   d
z  z   | _        | j                             d| j        | j                             ¦   «         z
  z  ¦  «         | j        | j                             ¦   «         k    sJ ‚|                      ||¦  «         dS )zWrite raw table data to disk.r¤   rQ   NrR   rS   rT   Tr!   rw   éüÿÿÿr•   )r@   r   r/   r=   r¡   r&   rV   rW   Ú	headTableÚuncompressedÚsaveDatar*   r,   rš   Ú
origOffsetÚ
origLengthÚlengthr¢   rg   r¥   )rB   r=   rE   rF   s       r   Ú__setitem__zSFNTWriter.__setitem__  sl  € à�$”+ÐÐÝÐ8¸3Ñ>Ñ?Ô?Ð?à×#Ò#Ñ%Ô%ˆØˆŒ	ØÔ+ˆŒØ�&Š=ˆ=Ý)¨$¨r°¨r¬(°[Ñ*@À4ÈÈÈÄ9Ñ*LÑMÔMˆEŒNØ!ˆDŒNØ!%ˆEÔÐå)¨$Ñ/Ô/ˆEŒNØ�Š�t”y $Ñ'Ô'Ð'àŒ;˜&Ò Ð Ø#Ô7ˆEÔØÐ$Ô$¨Ô)9¸AÑ)=ÀÑ(CÑCÐ$Ô$à#Ô3¸¼ÀqÑ8HÈBÑ7NÑOˆÔð
 	Œ	�Š˜ Ô!5¸¼	¿ºÑ8HÔ8HÑ!HÑIÑJÔJÐJØÔ# t¤y§~¢~Ñ'7Ô'7Ò7Ð7Ð7Ð7à�Š�c˜5Ñ!Ô!Ð!Ð!Ð!r   c                 ó   — | j         |         S rI   rJ   rK   s     r   r[   zSFNTWriter.__getitem__.  s   € ØŒ{˜3ÔÐr   c                 óÆ  — t          | j                             ¦   «         ¦  «        }t          |¦  «        | j        k    r&t          d| j        t          |¦  «        fz  ¦  «        ‚| j        dk    �rœd| _        d| _        d| _	        | xj	        dt          |¦  «        z  z  c_	        |D ] \  }}| xj	        |j
        dz   dz  z  c_	        Œ!| j        r| j        nt          ¦   «         }|j        � |j        �|j        | _        |j        | _        nNt          | d
¦  «        r0t!          j        d| j        dd…         ¦  «        \  | _        | _        ndx| _        | _        |j        r•t          |j        ¦  «        | _        | j                             dd¦  «         | j                             ¦   «         | _        t3          |j        ¦  «        }t          |¦  «        | _        | j                             |¦  «         ndx| _        x| _        | _        |j        r³| j                             dd¦  «         | j                             ¦   «         }|dz   dz  }| j                             d||z
  z  ¦  «         | j                             ¦   «         | _        t          |j        ¦  «        | _        | j                             |j        ¦  «         ndx| _        | _        | j                             dd¦  «         | j                             ¦   «         | _        n| j        rJ d| j        z  ¦   «         ‚	 tA          j!        | j"        | ¦  «        }| j                             | j#        | j$        z   ¦  «         d}	|D ]$\  }}|dk    rd}	|| %                    ¦   «         z   }Œ%|	r|  &                    |¦  «         | j                             | j#        ¦  «         | j                             |¦  «         d	S )zTAll tables must have been written to disk. Now write the
        directory.
        z-wrong number of tables; expected %d, found %dr!   r    r   rT   r”   rw   r§   Nr¨   z>HHr   rR   r~   r•   r‘   rQ   r   )'r>   r@   r?   r4   r;   r   r,   r˜   ÚreservedÚtotalSfntSizer¬   r-   rA   ÚmajorVersionÚminorVersionÚhasattrÚstructr5   r¨   ÚmetaDataÚmetaOrigLengthr*   r   rg   Ú
metaOffsetr‚   Ú
metaLengthr¢   ÚprivDataÚ
privOffsetÚ
privLengthr­   r   Úpackr–   rŸ   r—   ÚtoStringÚwriteMasterChecksum)
rB   r@   r=   rF   rE   ÚcompressedMetaDataÚoffÚ	paddedOffÚ	directoryÚseenHeads
             r   r_   zSFNTWriter.close1  s²  € õ ˜œ×)Ò)Ñ+Ô+Ñ,Ô,ˆÝˆv‰;Œ;˜$œ.Ò(Ð(ÝØ?Ø”>¥3 v¡;¤;Ð/ñ0ñô ð ð
 Œ;˜&Ò Ñ Ø$ˆDŒNØˆDŒMà!#ˆDÔØÐÔ "¥s¨6¡{¤{Ñ"2Ñ2ÐÔØ$ð Bð B‘
��UØÐ"Ô" uÔ'7¸!Ñ';¸rÑ&AÑAÐ"Ô"Ð"à&*¤oÐK�4”?�?½>Ñ;KÔ;KˆDØÔ Ð,°Ô1BÐ1NØ$(Ô$5�Ô!Ø$(Ô$5�Ô!Ð!å˜4 Ñ-Ô-ð >Ý;A¼=Ø˜tœ~¨a°¨cÔ2ñ<ô <Ñ8�DÔ% tÔ'8Ð'8ð =>Ð=�DÔ%¨Ô(9ØŒ}ð LÝ&)¨$¬-Ñ&8Ô&8�Ô#Ø”	—’˜q !Ñ$Ô$Ð$Ø"&¤)§.¢.Ñ"2Ô"2�”Ý%-¨d¬mÑ%<Ô%<Ð"Ý"%Ð&8Ñ"9Ô"9�”Ø”	—’Ð 2Ñ3Ô3Ð3Ð3àJKÐK�”ÐK $¤/°DÔ4GØŒ}ð 	6Ø”	—’˜q !Ñ$Ô$Ð$Ø”i—n’nÑ&Ô&�Ø  1™W¨™N�	Ø”	—’ ¨°S©Ñ 9Ñ:Ô:Ð:Ø"&¤)§.¢.Ñ"2Ô"2�”Ý"% d¤mÑ"4Ô"4�”Ø”	—’ ¤Ñ.Ô.Ð.Ð.à45Ð5�” $¤/àŒI�NŠN˜1˜aÑ Ô Ð Øœ)Ÿ.š.Ñ*Ô*ˆDŒKˆKð ”{ÐGÐGÐ$9¸D¼KÑ$GÑGÔGÐGØå”L Ô!5°tÑ<Ô<ˆ	àŒ	�Š�tÔ+¨dÔ.@Ñ@ÑAÔAÐAØˆØ ð 	5ð 	5‰JˆC�Ø�fŠ}ˆ}Ø�Ø! E§N¢NÑ$4Ô$4Ñ4ˆIˆIØð 	0Ø×$Ò$ YÑ/Ô/Ð/ØŒ	�Š�tÔ+Ñ,Ô,Ð,ØŒ	�Š˜	Ñ"Ô"Ð"Ð"Ð"r   c                 ó‚  — t          | j                             ¦   «         ¦  «        }g }t          t	          |¦  «        ¦  «        D ]-}|                     | j        ||                  j        ¦  «         Œ.| j        t          k    rÇddl	m
}  || j        d¦  «        \  | _        | _        | _        t          j        t"          | ¦  «        }t%          | j                             ¦   «         ¦  «        }|D ]Z\  }}t          ¦   «         }	|j        |	_        |j        |	_        |j        |	_        |j        |	_        ||	                     ¦   «         z   }Œ[t4          t	          | j        ¦  «        t6          z  z   }
|
t	          |¦  «        k    sJ ‚|                     t9          |¦  «        ¦  «         t;          |¦  «        dz  }d|z
  dz  }|S )Nr   r’   r”   ì   ÿÿ l   º/ac )Úlistr@   rN   r:   r4   ÚappendrW   r/   r.   r›   r“   r;   rœ   r�   rž   r   r¾   r6   r>   r?   r=   r«   r&   r¬   r­   r¿   r3   r™   rV   Úsum)rB   rÄ   ÚtagsÚ	checksumsr'   r“   r@   r=   rF   Ú	sfntEntryÚdirectory_endrZ   Úchecksumadjustments                r   Ú_calcMasterChecksumzSFNTWriter._calcMasterChecksumx  s¯  € å�D”K×$Ò$Ñ&Ô&Ñ'Ô'ˆØˆ	Ý•s˜4‘y”yÑ!Ô!ð 	<ð 	<ˆAØ×Ò˜Tœ[¨¨a¬Ô1Ô:Ñ;Ô;Ð;Ð;àÔÕ"4Ò4Ð4à6Ð6Ð6Ð6Ð6Ð6àDRÀNØ” ñEô EÑAˆDÔ˜dÔ0°$´/õ  œÕ%8¸$Ñ?Ô?ˆIÝ˜DœK×-Ò-Ñ/Ô/Ñ0Ô0ˆFØ$ð =ð =‘
��UÝ.Ñ0Ô0�	Ø %¤	�	”Ø%*¤^�	Ô"Ø#(Ô#3�	Ô Ø#(Ô#3�	Ô Ø%¨	×(:Ò(:Ñ(<Ô(<Ñ<�	�	å)­C°´Ñ,<Ô,<Õ?UÑ,UÑUˆØ¥ I¡¤Ò.Ð.Ð.Ð.à×Ò� iÑ0Ô0Ñ1Ô1Ð1Ý�y‘>”> JÑ.ˆà(¨8Ñ3°zÑAÐØ!Ð!r   c                 óä   — |                       |¦  «        }| j                             | j        d         j        dz   ¦  «         | j                             t          j        d|¦  «        ¦  «         d S )NrQ   rR   z>L)rÐ   r*   r   r@   r&   r¢   r¶   r¾   )rB   rÄ   rÏ   s      r   rÀ   zSFNTWriter.writeMasterChecksum™  s`   € Ø!×5Ò5°iÑ@Ô@ÐàŒ	�Š�t”{ 6Ô*Ô1°AÑ5Ñ6Ô6Ð6ØŒ	�Š�œ DÐ*<Ñ=Ô=Ñ>Ô>Ð>Ð>Ð>r   c                 ó   — dS ©NFru   rO   s    r   ÚreordersTableszSFNTWriter.reordersTablesŸ  s   € Øˆur   )r"   NN)rq   rr   rs   r   rG   r¥   r®   r[   r_   rÐ   rÀ   rÔ   ru   r   r   r‹   r‹   Æ   s±   € € € € € ð#ð #ð #ð, 'ØØð/$ð /$ð /$ð /$ðb!ð !ð !ð"ð "ð "ð< ð  ð  ðE#ð E#ð E#ðN"ð "ð "ðB?ð ?ð ?ðð ð ð ð r   r‹   a  
		> # big endian
		TTCTag:                  4s # "ttcf"
		Version:                 L  # 0x00010000 or 0x00020000
		numFonts:                L  # number of fonts
		# OffsetTable[numFonts]: L  # array with offsets from beginning of file
		# ulDsigTag:             L  # version 2.0 only
		# ulDsigLength:          L  # version 2.0 only
		# ulDsigOffset:          L  # version 2.0 only
zä
		> # big endian
		sfntVersion:    4s
		numTables:      H    # number of tables
		searchRange:    H    # (max2 <= numTables)*16
		entrySelector:  H    # log2(max2 <= numTables)
		rangeShift:     H    # numTables*16-searchRange
zc
		> # big endian
		tag:            4s
		checkSum:       L
		offset:         L
		length:         L
ab  
		> # big endian
		signature:      4s   # "wOFF"
		sfntVersion:    4s
		length:         L    # total woff file size
		numTables:      H    # number of tables
		reserved:       H    # set to 0
		totalSfntSize:  L    # uncompressed size
		majorVersion:   H    # major version of WOFF file
		minorVersion:   H    # minor version of WOFF file
		metaOffset:     L    # offset to metadata block
		metaLength:     L    # length of compressed metadata
		metaOrigLength: L    # length of uncompressed metadata
		privOffset:     L    # offset to private data block
		privLength:     L    # length of private data block
zº
		> # big endian
		tag:            4s
		offset:         L
		length:         L    # compressed length
		origLength:     L    # original length
		checkSum:       L    # original checksum
c                   óD   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
S )r/   c                 ó   — d| _         d S rÓ   )r©   rO   s    r   rG   zDirectoryEntry.__init__ç  s   € Ø!ˆÔÐÐr   c                 ól   — t          j        | j        |                     | j        ¦  «        | ¦  «         d S rI   )r   r5   Úformatr   r    )rB   r*   s     r   r<   zDirectoryEntry.fromFileê  s,   € ÝŒ�t”{ D§I¢I¨d¬oÑ$>Ô$>ÀÑEÔEÐEÐEÐEr   c                 ó<   — t          j        | j        || ¦  «         d S rI   )r   r5   rØ   )rB   Ústrs     r   Ú
fromStringzDirectoryEntry.fromStringí  s   € ÝŒ�t”{ C¨Ñ.Ô.Ð.Ð.Ð.r   c                 ó6   — t          j        | j        | ¦  «        S rI   )r   r¾   rØ   rO   s    r   r¿   zDirectoryEntry.toStringð  s   € ÝŒ|˜DœK¨Ñ.Ô.Ð.r   c                 ó¦   — t          | d¦  «        r$d| j        j        | j        t	          | ¦  «        fz  S d| j        j        t	          | ¦  «        fz  S )Nr=   z<%s '%s' at %x>z
<%s at %x>)rµ   Ú	__class__rq   r=   ÚidrO   s    r   Ú__repr__zDirectoryEntry.__repr__ó  sO   € Ý�4˜ÑÔð 	FØ$¨¬Ô(?ÀÄÍ2ÈdÉ8Ì8Ð'TÑTÐTà 4¤>Ô#:½B¸t¹H¼HÐ"EÑEÐEr   c                 óö   — |                      | j        ¦  «         |                     | j        ¦  «        }t	          |¦  «        | j        k    sJ ‚t          | j        d¦  «        r|                      |¦  «        }|S )NÚ
decodeData)r   r&   r   r­   r4   rµ   rÞ   râ   ©rB   r*   rE   s      r   rU   zDirectoryEntry.loadDataù  sl   € Ø�	Š	�$”+ÑÔÐØ�yŠy˜œÑ%Ô%ˆÝ�4‰yŒy˜DœKÒ'Ð'Ð'Ð'Ý�4”> <Ñ0Ô0ð 	)Ø—?’? 4Ñ(Ô(ˆDØˆr   c                 óà   — t          | j        d¦  «        r|                      |¦  «        }t          |¦  «        | _        |                     | j        ¦  «         |                     |¦  «         d S )NÚ
encodeData)rµ   rÞ   rå   r4   r­   r   r&   r¢   rã   s      r   rª   zDirectoryEntry.saveData  s`   € Ý�4”> <Ñ0Ô0ð 	)Ø—?’? 4Ñ(Ô(ˆDÝ˜$‘i”iˆŒØ�	Š	�$”+ÑÔÐØ�
Š
�4ÑÔÐÐÐr   c                 ó   — |S rI   ru   )rB   ÚrawDatas     r   râ   zDirectoryEntry.decodeData  s   € Øˆr   c                 ó   — |S rI   ru   )rB   rE   s     r   rå   zDirectoryEntry.encodeData  s   € Øˆr   N)rq   rr   rs   rG   r<   rÛ   r¿   rà   rU   rª   râ   rå   ru   r   r   r/   r/   æ  s¡   € € € € € ð"ð "ð "ðFð Fð Fð/ð /ð /ð/ð /ð /ðFð Fð Fðð ð ðð ð ðð ð ðð ð ð ð r   r/   c                   ó   — e Zd ZeZeZdS )r.   N)rq   rr   rs   ÚsfntDirectoryEntryFormatrØ   r™   r    ru   r   r   r.   r.     s   € € € € € Ø%€FØ'€J€J€Jr   r.   c                   ó2   ‡ — e Zd ZeZeZˆ fd„Zd„ Zd„ Z	ˆ xZ
S )r7   c                 óœ   •— t          t          | ¦  «                             ¦   «          t          t          d¦  «        st          | _        d S d S )NÚzlibCompressionLevel)Úsuperr7   rG   rµ   ÚZLIB_COMPRESSION_LEVELrí   )rB   rÞ   s    €r   rG   zWOFFDirectoryEntry.__init__  sN   ø€ ÝÕ  $Ñ'Ô'×0Ò0Ñ2Ô2Ð2õ Õ)Ð+AÑBÔBð 	?Ý(>ˆDÔ%Ð%Ð%ð	?ð 	?r   c                 ó¶   — dd l }| j        | j        k    r|}nA| j        | j        k     sJ ‚|                     |¦  «        }t	          |¦  «        | j        k    sJ ‚|S ©Nr   )r†   r­   r¬   Ú
decompressr4   )rB   rç   r†   rE   s       r   râ   zWOFFDirectoryEntry.decodeData#  se   € ØˆˆˆàŒ;˜$œ/Ò)Ð)ØˆDˆDà”; ¤Ò0Ð0Ð0Ð0Ø—?’? 7Ñ+Ô+ˆDÝ�t‘9”9 ¤Ò/Ð/Ð/Ð/Øˆr   c                 óî   — t          |¦  «        | _        | j        st          || j        ¦  «        }| j        st          |¦  «        | j        k    r|}| j        | _        n|}t          |¦  «        | _        |S rI   )r4   r¬   r©   r‚   rí   r­   )rB   rE   ÚcompressedDatarç   s       r   rå   zWOFFDirectoryEntry.encodeData.  ss   € Ý˜d™)œ)ˆŒØÔ ð 	GÝ% d¨DÔ,EÑFÔFˆNØÔð 	'¥ NÑ 3Ô 3°t´Ò FÐ FàˆGØœ/ˆDŒKˆKà$ˆGÝ˜g™,œ,ˆDŒKØˆr   )rq   rr   rs   ÚwoffDirectoryEntryFormatrØ   ÚwoffDirectoryEntrySizer    rG   râ   rå   Ú__classcell__)rÞ   s   @r   r7   r7     s`   ø€ € € € € Ø%€FØ'€Jð	?ð 	?ð 	?ð 	?ð 	?ð	ð 	ð 	ðð ð ð ð ð ð r   r7   c                   ó    — e Zd ZdZdd„Zd„ ZdS )rA   r!   Nc                 ór  — d | _         d | _        d | _        d | _        |�r|j         | _         |j        | _        |j        rŽ|j                             |j        ¦  «         |j                             |j        ¦  «        }t          |¦  «        |j        k    sJ ‚|  
                    |¦  «        }t          |¦  «        |j        k    sJ ‚|| _        |j        rc|j                             |j        ¦  «         |j                             |j        ¦  «        }t          |¦  «        |j        k    sJ ‚|| _        d S d S d S rI   )r³   r´   r·   r»   rº   r*   r   r¹   r   r4   Ú_decompressr¸   r½   r¼   )rB   Úreaderrç   rE   s       r   rG   zWOFFFlavorData.__init__?  s=  € Ø ˆÔØ ˆÔØˆŒØˆŒØñ 	%Ø &Ô 3ˆDÔØ &Ô 3ˆDÔØÔ ð %Ø”× Ò  Ô!2Ñ3Ô3Ð3Ø œ+×*Ò*¨6Ô+<Ñ=Ô=�Ý˜7‘|”| vÔ'8Ò8Ð8Ð8Ð8Ø×'Ò'¨Ñ0Ô0�Ý˜4‘y”y FÔ$9Ò9Ð9Ð9Ð9Ø $�”ØÔ ð %Ø”× Ò  Ô!2Ñ3Ô3Ð3Ø”{×'Ò'¨Ô(9Ñ:Ô:�Ý˜4‘y”y FÔ$5Ò5Ð5Ð5Ð5Ø $�”��ð	%ð 	%ð%ð %r   c                 ó4   — dd l }|                     |¦  «        S rñ   )r†   rò   )rB   rç   r†   s      r   rú   zWOFFFlavorData._decompressT  s   € Øˆˆˆà�Š˜wÑ'Ô'Ð'r   rI   )rq   rr   rs   ÚFlavorrG   rú   ru   r   r   rA   rA   <  s<   € € € € € Ø€Fð%ð %ð %ð %ð*(ð (ð (ð (ð (r   rA   c                 ó8  — t          | ¦  «        dz  }|r| dd|z
  z  z  } d}d}|dz  dk    sJ ‚t          dt          | ¦  «        |¦  «        D ]L}| |||z   …         }t          j        dt          |¦  «        dz  z  |¦  «        }|t	          |¦  «        z   dz  }ŒM|S )a,  Calculate the checksum for an arbitrary block of data.

    If the data length is not a multiple of four, it assumes
    it is to be padded with null byte.

            >>> print(calcChecksum(b"abcd"))
            1633837924
            >>> print(calcChecksum(b"abcdxyz"))
            3655064932
    r   r•   r   i   ú>%dLrÇ   )r4   r:   r¶   r5   rÊ   )rE   Ú	remainderÚvalueÚ	blockSizer'   ÚblockÚlongss          r   rV   rV   Z  s½   € õ �D‘	”	˜A‘€IØð (Ø�˜˜Y™Ñ'Ñ'ˆØ€EØ€IØ�q‰=˜AÒÐÐÐÝ�1•c˜$‘i”i Ñ+Ô+ð 2ð 2ˆØ�Q˜˜Y™Ð&Ô'ˆÝ”˜f­¨E©
¬
°a©Ñ8¸%Ñ@Ô@ˆØ�˜U™œÑ# zÑ1ˆˆØ€Lr   c                 ó  — |                       d¦  «         |                      t          ¦  «        }t          |¦  «        t          k    rt	          d¦  «        ‚t          ¦   «         }t          j        t          ||¦  «         |j	        dk    rt	          d¦  «        ‚|j
        dk    s|j
        dk    sJ d|j
        z  ¦   «         ‚t          j        d|j        z  |                      |j        d	z  ¦  «        ¦  «        |_        |j
        dk    r	 |S )
Nr   r   ÚttcfzNot a Font Collectioné   i   zunrecognized TTC version 0x%08xrÿ   r   )r   r   ÚttcHeaderSizer4   r   r   r   r5   ÚttcHeaderFormatÚTTCTagÚVersionr¶   r1   r2   )r*   rE   rB   s      r   r0   r0   r  sû   € Ø‡I‚Iˆa�L„L€LØ�9Š9•]Ñ#Ô#€DÝ
ˆ4�y„y•MÒ!Ð!ÝÐBÑCÔCÐCÝÑÔ€DÝ„N•? D¨$Ñ/Ô/Ð/Ø„{�fÒÐÝÐ0Ñ1Ô1Ð1ØŒ<˜:Ò%Ð%¨¬¸Ò)CÐ)CÐ)CØ)¨D¬LÑ8ñ *DÔ)CÐ)Cõ ”}Ø�”Ñ §	¢	¨$¬-¸!Ñ*;Ñ <Ô <ñô €DÔð „|�zÒ!Ð!ØØ€Kr   c                 ód  — t          ¦   «         }d|_        d|_        ||_        |                      d¦  «         |                      t          j        t          |¦  «        ¦  «         |  	                    ¦   «         }|                      t          j        d|j        z  gdg|j        z  ¢R Ž ¦  «         |S )Nr  r  r   rÿ   )r   r
  r  r1   r   r¢   r   r¾   r	  rg   r¶   )r*   r1   rB   r&   s       r   ÚwriteTTCHeaderr  †  s•   € ÝÑÔ€DØ€D„KØ€D„LØ€D„MØ‡I‚Iˆa�L„L€LØ‡J‚J�wŒ|�O¨TÑ2Ô2Ñ3Ô3Ð3Ø�YŠY‰[Œ[€FØ‡J‚J�vŒ{˜6 D¤MÑ1ÐJ°a°S¸4¼=Ñ5HÐJÐJÐJÑKÔKÐKØ€Mr   Ú__main__)1Ú__doc__Úior   Útypesr   ÚfontTools.misc.textToolsr   ÚfontTools.miscr   r›   r   r   r¶   Úcollectionsr	   ÚloggingÚ	getLoggerrq   rX   r   r   rï   r…   rˆ   r‚   r‹   r	  Úcalcsizer  r6   r3   rê   r™   r9   r8   rõ   rö   r/   r.   r7   rA   rV   r0   r  ÚsysÚdoctestÚexitÚtestmodÚfailedru   r   r   ú<module>r     s  ððð ð Ð Ð Ð Ð Ð Ø !Ð !Ð !Ð !Ð !Ð !Ø (Ð (Ð (Ð (Ð (Ð (Ø "Ð "Ð "Ð "Ð "Ð "Ø BÐ BÐ BÐ BÐ BÐ BÐ BÐ BØ €€€Ø #Ð #Ð #Ð #Ð #Ð #Ø €€€ð €gÔ˜Ñ!Ô!€ð|$ð |$ð |$ð |$ð |$�ñ |$ô |$ð |$ð@ Ð ð €
ð 	ØØØØ	Ø	Ø	Ø	Ø
ðð €ð 0ð Bð Bð Bð Bð&Zð Zð Zð Zð Z�ñ Zô Zð Zð~	€ð !�Ô  Ñ1Ô1€ðÐ ð %�GÔ$Ð%8Ñ9Ô9Ð ðÐ ð *˜Ô)Ð*BÑCÔCÐ ðÐ ð" %�GÔ$Ð%8Ñ9Ô9Ð ðÐ ð *˜Ô)Ð*BÑCÔCÐ ð&ð &ð &ð &ð &�Vñ &ô &ð &ðR(ð (ð (ð (ð (˜ñ (ô (ð (ð
%ð %ð %ð %ð %˜ñ %ô %ð %ðP(ð (ð (ð (ð (ñ (ô (ð (ð<ð ð ð0ð ð ð(	ð 	ð 	ð ˆzÒÐØ€J€J€JØ€N€N€Nà€C„Hˆ_ˆWŒ_ÑÔÔ%Ñ&Ô&Ð&Ð&Ð&ð	 Ðr   