a
    w=icNm                 (   @   sL  d Z ddlmZ ddlmZ ddlmZmZ ddlmZm	Z	m
Z
mZmZm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 ddlZddlZddlZejd ZeeZdZdZ G dd de!Z"G dd dej#Z$G dd de%Z&G dd de%Z'dd Z(G dd de%Z)G dd de)Z*G dd de)Z+G dd  d e)Z,G d!d" d"e)Z-G d#d$ d$e-Z.G d%d& d&e-Z/G d'd( d(e%Z0G d)d* d*e0Z1G d+d, d,e1Z2G d-d. d.e0Z3G d/d0 d0e0Z4G d1d2 d2e%Z5G d3d4 d4e%Z6G d5d6 d6e%Z7d7d8 Z8d9d: Z9d;d< Z:d=d> Z;d?d@ Z<dAdB Z=dCdD Z>dEdF Z?dGdH Z@dIdJ ZAdKdL ZBdMdN ZCdOdP ZDdQdR ZEG dSdT dTe%ZFG dUdV dVeFZGG dWdX dXeFZHdYdZ ZId[d\ ZJG d]d^ d^eFZKG d_d` d`eFZLG dadb dbeFZMG dcdd ddeMZNG dedf dfeMZOG dgdh dheMZPG didj djeFZQG dkdl dle%ZRdmdn ZSdodp ZTdqdr ZUdsdt ZVdudv ZWdwdx ZXdydz ZYG d{d| d|e%ZZG d}d~ d~eFZ[dd Z\dd Z]dd Z^dd Z_G dd deMZ`G dd deFZaG dd deFZbdd Zcdd Zddd ZeG dd de%ZfG dd de%ZgG dd deFZhdddddeh fddddddeH fddddeH fdddddddddddddg ddfddddg ddfdddddddddddddeQ fddddde[ fddddeN fdd4ddea fdddde` fdd6ddeP fddddeb fg$Ziddddg ddfdd4ddea fdddde` fdd6ddeP fddddeb fgZjdZkdZldelekdddfdddddddddddddddddddddddeO fgZmdelekdddfdddddddddddddddddeO fgZndd Zoeoem eoei G dd dejpZqG dd dejpZrG dd de%Zsdd ZtG dd desZuG dd desZvG dd desZwG dd de%ZxG dd dexZyG dd dexZzG dd dexZ{G dd de%Z|g d Z}dZ~ee}e~ksJ i Zee~D ]Zeee}e < qg dZdZeeeksJ g dZdZeeeks&J g dZdZeeeksHJ dS (  a+  cffLib: read/write Adobe CFF fonts

OpenType fonts with PostScript outlines contain a completely independent
font file, Adobe's *Compact Font Format*. So dealing with OpenType fonts
requires also dealing with CFF. This module allows you to read and write
fonts written in the CFF format.

In 2016, OpenType 1.8 introduced the `CFF2 <https://docs.microsoft.com/en-us/typography/opentype/spec/cff2>`_
format which, along with other changes, extended the CFF format to deal with
the demands of variable fonts. This module parses both original CFF and CFF2.

    )sstruct)psCharStrings)	unionRectintRect)bytechrbyteord	bytesjointobytestostrsafeEval)TTFont)OTTableWriter)OTTableReader)otTables)BytesION   z%
	major:   B
	minor:   B
	hdrSize: B
i  c                   @   s   e Zd ZdS )StopHintCountEventN)__name__
__module____qualname__ r   r   j/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/site-packages/fontTools/cffLib/__init__.pyr   )   s   r   c                   @   sJ   e Zd ZdZdddZdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dS )_DesubroutinizingT2Decompiler)op_hintmaskZop_cntrmaskZ
op_rmovetoZ
op_hmovetoZ
op_vmovetoNc                 C   s   t j| ||| d S N)r   SimpleT2Decompiler__init__)self
localSubrsglobalSubrsprivater   r   r   r   1   s    z&_DesubroutinizingT2Decompiler.__init__c                 C   sf  d| _ | jD ]}t| || j qt|drh| j rd| jrdztj| | W n t	yb   | jd= Y n0 d S g |_
tj| | |jd d  }t|j
D ]t\}}|dksJ ||d  dv sJ ||d  t||d  tksJ |d dkr|d d }|||d |< q| jjsXd|v r6|d |dd  }n"t|rN|d dkrX|d ||_|`
d S )	NT_desubroutinized   r   )ZcallsubrZ	callgsubrreturnendchar)need_hintcountstop_hintcount_opssetattrstop_hint_counthasattrcallingStackr   r   executer   _patchesprogramreversedtypeintr    in_cff2indexlenappendr!   )r   
charStringop_nameZdesubroutinizedidxZ	expansionr   r   r   r,   5   s6    

 


z%_DesubroutinizingT2Decompiler.executec                 C   s4   | j | jd | j  }tj| | | || d S Nr"   )r   operandStackZ	localBiasr   r   op_callsubrprocessSubrr   r3   subrr   r   r   r;   [   s    z)_DesubroutinizingT2Decompiler.op_callsubrc                 C   s4   | j | jd | j  }tj| | | || d S r9   )r   r:   Z
globalBiasr   r   op_callgsubrr<   r=   r   r   r   r?   `   s    z*_DesubroutinizingT2Decompiler.op_callgsubrc                 G   s<   d| _ | jD ]}t| |d  q| jd }t|dr8t d S )NFr"   r!   )r&   r'   r(   r+   r*   r   )r   argsr7   csr   r   r   r)   e   s    


z-_DesubroutinizingT2Decompiler.stop_hint_countc                 C   s    t j| | | jr|   d S r   )r   r   r   r&   r)   r   r3   r   r   r   r   m   s    z)_DesubroutinizingT2Decompiler.op_hintmaskc                 C   s*   | j d }t|ds&|j||jf d S )Nr"   r!   )r+   r*   r-   r5   r!   )r   r3   r>   rA   r   r   r   r<   r   s    

z)_DesubroutinizingT2Decompiler.processSubr)N)r   r   r   r'   r   r,   r;   r?   r)   r   r<   r   r   r   r   r   -   s   
&r   c                   @   sf   e Zd ZdZdddZdd Zdd Zd	d
 Zdd ZdddZ	dd Z
dddZdd Zdd ZdS )
CFFFontSeta  A CFF font "file" can contain more than one font, although this is
	extremely rare (and not allowed within OpenType fonts).

	This class is the entry point for parsing a CFF table. To actually
	manipulate the data inside the CFF font, you will want to access the
	``CFFFontSet``'s :class:`TopDict` object. To do this, a ``CFFFontSet``
	object can either be treated as a dictionary (with appropriate
	``keys()`` and ``values()`` methods) mapping font names to :class:`TopDict`
	objects, or as a list.

	.. code:: python

		from fontTools import ttLib
		tt = ttLib.TTFont("Tests/cffLib/data/LinLibertine_RBI.otf")
		tt["CFF "].cff
		# <fontTools.cffLib.CFFFontSet object at 0x101e24c90>
		tt["CFF "].cff[0] # Here's your actual font data
		# <fontTools.cffLib.TopDict object at 0x1020f1fd0>
	
	Nc                 C   s8  || _ tt|d|  |durL|r*dnd}| j|krhtd|| jf n| jdv s^J d| jdk}|std|dd	 | _|	| j
 td
d t||dD | _t||d| _t|| _nLtd|dd	 | _|	| j
 dg| _|j}t||| j|d| _d| _t||d| _| j| j_| j| j_dS )ag  Parse a binary CFF file into an internal representation. ``file``
		should be a file handle object. ``otFont`` is the top-level
		:py:class:`fontTools.ttLib.ttFont.TTFont` object containing this CFF file.

		If ``isCFF2`` is passed and set to ``True`` or ``False``, then the
		library makes an assertion that the CFF header is of the appropriate
		version.
		   Nr#   r   2Invalid CFF 'major' version: expected %d, found %dr   r#   Unknown CFF formatBr   c                 s   s   | ]}t |V  qd S r   r
   .0sr   r   r   	<genexpr>       z'CFFFontSet.decompile.<locals>.<genexpr>isCFF2>HCFF2Font)otFontr   unpackcffHeaderFormatreadmajor
ValueErrorstructoffSizeseekhdrSizelistIndex	fontNamesTopDictIndextopDictIndexIndexedStringsstringstopDictSizegetGlyphOrderGlobalSubrsIndexGlobalSubrs)r   filerS   rP   expected_majorcff2GetGlyphOrderr   r   r   	decompile   s:    




zCFFFontSet.decompilec                 C   s
   t | jS r   )r4   r_   r   r   r   r   __len__   s    zCFFFontSet.__len__c                 C   s
   t | jS r   )r]   r_   rl   r   r   r   keys   s    zCFFFontSet.keysc                 C   s   | j S r   )ra   rl   r   r   r   values   s    zCFFFontSet.valuesc                 C   sb   t |dr| }nDt|trP|}z| j|}W qX tyL   t|Y qX0 nt|| j	| S )zp Return TopDict instance identified by name (str) or index (int
		or any object that implements `__index__`).
			__index__)
r*   rp   
isinstancestrr_   r3   rX   KeyError	TypeErrorra   )r   ZnameOrIndexr3   namer   r   r   __getitem__   s    


zCFFFontSet.__getitem__c                 C   s  || _ |dur8|rdnd}| j|krTtd|| jf n| jdv sJJ d| jdk}|jrr|sr| jD ]}|  qd|s~t }nd}t|}| jj|| |d}|rd| _	|
tt|  | | _|
td	| j n2d
| _	d
| _|
tt|  |
td| j |sDt }	| jD ]}
|	|
 q|
|	j|| |d |
| |sb|
|  |
| jj|| |d | jD ],}t|dr|jdu r| }||_q||}|D ]}|
| q|| dS )at  Write the object back into binary representation onto the given file.
		``file`` should be a file handle object. ``otFont`` is the top-level
		:py:class:`fontTools.ttLib.ttFont.TTFont` object containing this CFF file.

		If ``isCFF2`` is passed and set to ``True`` or ``False``, then the
		library makes an assertion that the CFF header is of the appropriate
		version.
		Nr#   r   rE   rF   rG   rO      rQ      rH   charset)rS   rW   rX   ZrecalcBBoxesra   recalcFontBBoxrb   	CFFWritergetCompilerr\   addr   packrU   getDataLengthrd   rY   rZ   r^   r_   r5   rg   r*   ry   re   getChildrentoFile)r   rh   rS   rP   ri   topDictrc   writerZtopCompilerr_   ru   ry   childrenchildr   r   r   compile   sZ    	










zCFFFontSet.compilec                 C   s   |j d| jd |  |j d| jd |  | jD ]B}|jdt|d |  | | }|| |d |  q6|  |d |  | j	| |d |  dS )zWrite the object into XML representation onto the given
		:class:`fontTools.misc.xmlWriter.XMLWriter`.

		.. code:: python

			writer = xmlWriter.XMLWriter(sys.stdout)
			tt["CFF "].cff.toXML(writer)

		rW   valueminorCFFFontru   rg   N)
	simpletagrW   newliner   r_   begintagr
   toXMLendtagrg   )r   	xmlWriterfontNamefontr   r   r   r     s"    





zCFFFontSet.toXMLc                 C   s8  || _ t| dsd| _t| ds&d| _|dkr| jdkrt| dsJd| _t| dsZd| _t| d	slt | _t| d
sg | _t	 | _
|d }| j| t| jd}d|_nb| jdkrt| dsd| _t| d	st | _t| d
sdg| _| j j}t| j|d}t	d|| _
| j
| |D ].}t|tr2q|\}}}|||| qt|dr4|jd jdu r4|j}	|	D ]}
t|
drv|j|
j_qvn|d	krtj}t| d	st | _|D ]@}t|trҐq|\}}}| }|||| | j| qn2|dkrt|d | _n|dkr4t|d | _dS )z?Reads data from the XML element into the ``CFFFontSet`` object.rW   r   r   r   r   rZ   rx   r\   rg   r_   ru   )rg   Nr#   rw   rR   )rg   rj   VarStorePrivater   )rS   r*   rW   r   rZ   r\   rf   rg   r_   r`   ra   r5   TopDictry   re   rq   rr   fromXMLFDArrayvstorer   r   r   T2CharStringr1   )r   ru   attrscontentrS   r   r   rj   elementfdArrayfontDictZsubrCharStringClassr>   r   r   r   r   .  sv    















zCFFFontSet.fromXMLc                 C   s8  d| _ | jj}td|}| jj|_|| _|d }t|drB|j}nd}tt	}||_
||_tD ]:}|d }||vr^||jv r|j|= t||r^t|| q^t|dsVt  }	|_d|	_|j|	_|	|j_|j}
|
jr|	|
j_n|	|
_t }|d |	| ||_tt}tD ]B}|d }||vr||jv r:|j|= t||rt|| qn|j}	tt}|	D ]}|d |j D ]0}||j
vr|j|= t||rt|| q|j}tD ]B}|d }||vr||jv r|j|= t||rt|| qqht }| j||dd |d | j ||dd dS )	zConverts this object from CFF format to CFF2 format. This conversion
		is done 'in-place'. The conversion cannot be reversed.

		This assumes a decompiled CFF table. (i.e. that the object has been
		filled via :meth:`decompile`.)r#   Nr   r   r   r   TrO   )!rW   rS   re   r`   ra   itemsr*   r   
buildOrdertopDictOperators2orderrj   topDictOperatorsrawDictdelattrFDArrayIndexr   rc   rg   r   CharStringscharStringsAreIndexedcharStringsIndexFontDictsetCFF2r5   privateDictOperators2privateDictOperatorsrn   r   r   r[   rk   )r   rS   rj   ZtopDictDatar   ZprivateDictZopOrderentrykeyr   charStringsr   ZprivateOpOrderrh   r   r   r   convertCFFToCFF2r  sz    











zCFFFontSet.convertCFFToCFF2c                 C   s   | j D ]}| | }|j}|jD ]N}||\}}|  t|jdg }t||j|j}|	| |j
|_|`
qt|dr|jD ]*}	|	j}
t|
dr|
`d|
jv r~|
jd= q~q|j}
t|
dr|
`d|
jv r|
jd= q| j  d S )NSubrsr   )r_   r   ry   getItemAndSelectorrk   getattrr    r   r   r,   r!   r.   r*   r   r   r   r   rg   clear)r   r   r   rA   gc_ZsubrsZ
decompilerfdpdr   r   r   desubroutinize  s0    









zCFFFontSet.desubroutinize)N)N)N)r   r   r   __doc__rk   rm   rn   ro   rv   r   r   r   r   r   r   r   r   r   rC   x   s   
+
?
DPrC   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	r{   zUHelper class for serializing CFF data to binary. Used by
	:meth:`CFFFontSet.compile`.c                 C   s   g | _ || _d S r   )datarP   r   rP   r   r   r   r     s    zCFFWriter.__init__c                 C   s   | j | d S r   )r   r5   )r   tabler   r   r   r}     s    zCFFWriter.addc           	      C   sR  d }d}t  td| |d }d}|g}| jD ]f}t|drd||  }t|trp|jrp| | _n|t	| }t|dr|
|| |}|| q.||krq|}qt  td | }| jrtd| j| jd< n"t|d | _td	| j| jd< dg}| jD ]:}t|d
r || n
|| || |  q||ksNJ d S )Nr   z CFFWriter.toFile() iteration: %dr   r   setPosz#CFFWriter.toFile() writing to file.rQ   r"   rH   r   )logDEBUGr   r*   r   rq   TopDictIndexCompilerrP   rd   r4   r   r5   tellrY   r~   calcOffSizerZ   r   write)	r   rh   ZlastPosListcountposZposListitemendPosbeginr   r   r   r     s@    




zCFFWriter.toFileN)r   r   r   r   r   r}   r   r   r   r   r   r{     s   r{   c                 C   s2   | dk rd}n | dk rd}n| dk r*d}nd}|S )N   r   i   r#   i   rD   rx   r   )ZlargestOffsetrZ   r   r   r   r     s    r   c                   @   s:   e Zd ZdZdddZdd Zdd Zd	d
 Zdd ZdS )IndexCompilerzBase class for writing CFF `INDEX data <https://docs.microsoft.com/en-us/typography/opentype/spec/cff2#5-index-data>`_
	to binary.Nc                 C   sB   |d u r$t |dr$|j}|d us$J || _| ||| _|| _d S NrP   )r*   rP   getItemsr   parent)r   r   rc   r   rP   r   r   r   r   !  s    zIndexCompiler.__init__c                 C   s   |S r   r   r   r   rc   r   r   r   r   )  s    zIndexCompiler.getItemsc                 C   sT   | j rLd}|g}| j D ]2}t|dr2||  }n|t| }|| qng }|S )Nr   r   )r   r*   r   r4   r5   )r   r   offsetsr   r   r   r   
getOffsets,  s    

zIndexCompiler.getOffsetsc                 C   sV   | j rd}nd}| jrN|  d }t|}|d t| jd |  | d }n|}|S )Nrx   r#   r"   r   )rP   r   r   r   r4   )r   Z	countSizeZ
lastOffsetrZ   
dataLengthr   r   r   r   ;  s$    zIndexCompiler.getDataLengthc           	      C   s   |   }| jr t|t| j nt|t| j | jrt|d }t|| | }tj	}|D ]2}|d||d  }t|| ksJ |
| q\| jD ]0}t|dr|| qt|dd}|
| qd S )Nr"   >lr   latin1encoding)r   rP   writeCard32r4   r   writeCard16r   
writeCard8rY   r~   r   r*   r   r	   )	r   rh   r   rZ   r~   offset	binOffsetr   r   r   r   r   r   P  s$    


zIndexCompiler.toFile)N)	r   r   r   r   r   r   r   r   r   r   r   r   r   r     s   
r   c                   @   s   e Zd Zdd ZdS )IndexedStringsCompilerc                 C   s   |j S r   rc   r   r   r   r   r   j  s    zIndexedStringsCompiler.getItemsN)r   r   r   r   r   r   r   r   r   h  s   r   c                       sH   e Zd ZdZdd Zdd Z fddZ fdd	Z fd
dZ  Z	S )r   z/Helper class for writing the TopDict to binary.c                 C   s$   g }|D ]}| |||  q|S r   r5   r|   r   r   rc   outr   r   r   r   r   q  s    zTopDictIndexCompiler.getItemsc                 C   s$   g }| j D ]}||| q
|S r   r   extendr   )r   rc   r   r   r   r   r   r   w  s    
z TopDictIndexCompiler.getChildrenc                    s.   | j rd| jd  g}|S tt|  S d S Nr   )rP   r   r   superr   r   )r   r   	__class__r   r   r   }  s    zTopDictIndexCompiler.getOffsetsc                    s*   | j r| jd  }|S tt|  S d S r   )rP   r   r   r   r   )r   r   r   r   r   r     s    z"TopDictIndexCompiler.getDataLengthc                    s,   | j r| jd | ntt| | d S r   )rP   r   r   r   r   r   rh   r   r   r   r     s    zTopDictIndexCompiler.toFile)
r   r   r   r   r   r   r   r   r   __classcell__r   r   r   r   r   n  s   r   c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )FDArrayIndexCompilerzHelper class for writing the
	`Font DICT INDEX <https://docs.microsoft.com/en-us/typography/opentype/spec/cff2#10-font-dict-index-font-dicts-and-fdselect>`_
	to binary.c                 C   s$   g }|D ]}| |||  q|S r   r   r   r   r   r   r     s    zFDArrayIndexCompiler.getItemsc                 C   s$   g }| j D ]}||| q
|S r   r   )r   rc   r   r   r   r   r   r     s    
z FDArrayIndexCompiler.getChildrenc                 C   s   |   }| jr t|t| j nt|t| j t|d }t|| | }tj	}|D ]2}|d||d  }t|| ks~J |
| qV| jD ]$}t|dr|| q|
| qd S )Nr"   r   r   )r   rP   r   r4   r   r   r   r   rY   r~   r   r*   r   )r   rh   r   rZ   r~   r   r   r   r   r   r   r     s     


zFDArrayIndexCompiler.toFilec                 C   s   || j jd< d S )Nr   r   r   r   r   r   r   r   r   r     s    zFDArrayIndexCompiler.setPosN)r   r   r   r   r   r   r   r   r   r   r   r   r     s
   r   c                   @   s   e Zd ZdZdd ZdS )GlobalSubrsCompilerzHelper class for writing the `global subroutine INDEX <https://docs.microsoft.com/en-us/typography/opentype/spec/cff2#9-local-and-global-subr-indexes>`_
	to binary.c                 C   s*   g }|D ]}| | j ||j q|S r   r   rP   r5   bytecoder   r   rc   r   rA   r   r   r   r     s
    zGlobalSubrsCompiler.getItemsN)r   r   r   r   r   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZdd ZdS )SubrsCompilerzHelper class for writing the `local subroutine INDEX <https://docs.microsoft.com/en-us/typography/opentype/spec/cff2#9-local-and-global-subr-indexes>`_
	to binary.c                 C   s   || j j }|| j jd< d S Nr   )r   r   r   )r   r   r   r   r   r   r   r     s    zSubrsCompiler.setPosN)r   r   r   r   r   r   r   r   r   r     s   r   c                   @   s    e Zd ZdZdd Zdd ZdS )CharStringsCompilerzHelper class for writing the `CharStrings INDEX <https://docs.microsoft.com/en-us/typography/opentype/spec/cff2#9-local-and-global-subr-indexes>`_
	to binary.c                 C   s*   g }|D ]}| | j ||j q|S r   r   r   r   r   r   r     s
    zCharStringsCompiler.getItemsc                 C   s   || j jd< d S Nr   r   r   r   r   r   r     s    zCharStringsCompiler.setPosN)r   r   r   r   r   r   r   r   r   r   r     s   r   c                   @   sX   e Zd ZdZeZdddZdd Zdd Zd	d
 Z	dd Z
dd ZdddZdd ZdS )r^   zThis class represents what the CFF spec calls an INDEX (an array of
	variable-sized objects). `Index` items can be addressed and set using
	Python list indexing.Nc                 C   s8  |d u |d u ksJ g | _ | jj}|d u r.d S || _ttd||  || _|r\t|}nt	|}|dkrpd S d g| | _ t
|}ttd|| |dksJ d| g  | _}dd|  }t|d D ]2}||}	||	 }	td|	\}
|t|
 q| d | _|| j|d	   ttd
||  d S )Nloading %s at %sr   z    index count: %s offSize: %srx   zoffSize too large: %s    r   >Lr"       end of %s at %s)r   r   r   _isCFF2r   r   r   rh   
readCard32
readCard16	readCard8r   rangerV   rY   rT   r5   r1   
offsetBaser[   )r   rh   rP   ru   r   rZ   r   padr3   chunkr   r   r   r   r     s6    


zIndex.__init__c                 C   s
   t | jS r   )r4   r   rl   r   r   r   rm     s    zIndex.__len__c                 C   s   | j | }|d ur|S | j| | j }| j|d  | j|  }| j}|| ||}t||kshJ | ||||}|| j |< |S Nr   )r   r   r   rh   r[   rV   r4   produceItem)r   r3   r   r   sizerh   r   r   r   r   rv     s    



zIndex.__getitem__c                 C   s   || j |< d S r   r   )r   r3   r   r   r   r   __setitem__  s    zIndex.__setitem__c                 C   s   |S r   r   )r   r3   r   rh   r   r   r   r   r    s    zIndex.produceItemc                 C   s   | j | dS )zAdd an item to an INDEX.N)r   r5   )r   r   r   r   r   r5     s    zIndex.appendc                 C   s   | j | |||dS NrO   compilerClassr   rc   r   rP   r   r   r   r|     s    zIndex.getCompilerc                 C   s   | j dd= dS )zEmpty the INDEX.Nr  rl   r   r   r   r   !  s    zIndex.clear)NN)N)r   r   r   r   r   r
  r   rm   rv   r  r  r5   r|   r   r   r   r   r   r^     s   

r^   c                       sR   e Zd ZdZeZejZejZ	d fdd	Z
dd Zdd Zd	d
 Zdd Z  ZS )rf   a  This index contains all the global subroutines in the font. A global
	subroutine is a set of ``CharString`` data which is accessible to any
	glyph in the font, and are used to store repeated instructions - for
	example, components may be encoded as global subroutines, but so could
	hinting instructions.

	Remember that when interpreting a ``callgsubr`` instruction (or indeed
	a ``callsubr`` instruction) that you will need to add the "subroutine
	number bias" to number given:

	.. code:: python

		tt = ttLib.TTFont("Almendra-Bold.otf")
		u = tt["CFF "].cff[0].CharStrings["udieresis"]
		u.decompile()

		u.toXML(XMLWriter(sys.stdout))
		# <some stuff>
		# -64 callgsubr <-- Subroutine which implements the dieresis mark
		# <other stuff>

		tt["CFF "].cff[0].GlobalSubrs[-64] # <-- WRONG
		# <T2CharString (bytecode) at 103451d10>

		tt["CFF "].cff[0].GlobalSubrs[-64 + 107] # <-- RIGHT
		# <T2CharString (source) at 103451390>

	("The bias applied depends on the number of subrs (gsubrs). If the number of
	subrs (gsubrs) is less than 1240, the bias is 107. Otherwise if it is less
	than 33900, it is 1131; otherwise it is 32768.",
	`Subroutine Operators <https://docs.microsoft.com/en-us/typography/opentype/otspec180/cff2charstr#section4.4>`)
	Nc                    s8   t t| j||d || _|| _|r*|| _|r4|| _d S r  )r   rf   r   r   r    fdSelectr   )r   rh   r   r    r  r   rP   r   r   r   r   L  s    zGlobalSubrsIndex.__init__c                 C   sn   | j d ur| j }nJt| drX| jd urXt| drF| jd urF| j| }nd}| j| j}nd }| j||| jdS )Nr   r  r   r    r   )r    r*   r   r  r   	subrClassr   )r   r3   r   rh   r   r    fdIndexr   r   r   r  V  s    
zGlobalSubrsIndex.produceItemc                 C   s|   | d |  tt| D ]X}| | }| rD|jd|dd n|jd|d |  || |d |  qdS )zWrite the subroutines index into XML representation onto the given
		:class:`fontTools.misc.xmlWriter.XMLWriter`.

		.. code:: python

			writer = xmlWriter.XMLWriter(sys.stdout)
			tt["CFF "].cff[0].GlobalSubrs.toXML(writer)

		zDThe 'index' attribute is only for humans; it is ignored when parsed.
CharStringr   )r3   rawr3   N)commentr   r   r4   needsDecompilationr   r   r   )r   r   ir>   r   r   r   r   c  s    


zGlobalSubrsIndex.toXMLc                 C   s0   |dkrd S |   }|||| | | d S )Nr  )r  r   r5   )r   ru   r   r   r>   r   r   r   r   |  s
    zGlobalSubrsIndex.fromXMLc                 C   s$   d }t | dr| j| }| | |fS )Nr  )r*   r  )r   r3   selr   r   r   r     s    

z#GlobalSubrsIndex.getItemAndSelector)NNNNNN)r   r   r   r   r   r
  r   r   r  charStringClassr   r  r   r   r   r   r   r   r   r   rf   &  s   !  
rf   c                   @   s   e Zd ZdZeZdS )
SubrsIndexzThis index contains a glyph's local subroutines. A local subroutine is a
	private set of ``CharString`` data which is accessible only to the glyph to
	which the index is attached.N)r   r   r   r   r   r
  r   r   r   r   r    s   r  c                       s6   e Zd ZdZeZd
 fdd	Zdd Zdd	 Z  Z	S )r`   aS  This index represents the array of ``TopDict`` structures in the font
	(again, usually only one entry is present). Hence the following calls are
	equivalent:

	.. code:: python

		tt["CFF "].cff[0]
		# <fontTools.cffLib.TopDict object at 0x102ed6e50>
		tt["CFF "].cff.topDictIndex[0]
		# <fontTools.cffLib.TopDict object at 0x102ed6e50>

	Nr   c                    s   |d u |d u ksJ || _ |d ur|r|| _g | _| jj}ttd||  || _d}d g| | _d|g| _	| | _
|| j
|  ttd||  ntt| j||d d S )Nr   r   r   r   rO   )rj   r   r   r   r   r   r   r   rh   r   r   r[   r   r`   r   )r   rh   rj   ZtopSizerP   ru   r   r   r   r   r     s    

zTopDictIndex.__init__c                 C   s*   t | j||| j| j| jd}|| |S r  )r   rc   rg   rj   r   rk   )r   r3   r   rh   r   topr   r   r   r    s    
zTopDictIndex.produceItemc                 C   sL   t t| D ]:}|jd|d |  | | | |d |  qd S Nr   r  r   r4   r   r   r   r   r   r   r  r   r   r   r     s    
zTopDictIndex.toXML)NNr   N)
r   r   r   r   r   r
  r   r  r   r   r   r   r   r   r`     s     r`   c                   @   s(   e Zd ZeZdd Zdd Zdd ZdS )r   c                 C   sL   t t| D ]:}|jd|d |  | | | |d |  qd S r  r  r  r   r   r   r     s    
zFDArrayIndex.toXMLc                 C   s*   t | j||| j| j| jd}|| |S N)rP   r   )r   rc   rg   r   r   rk   )r   r3   r   rh   r   r   r   r   r   r    s    
zFDArrayIndex.produceItemc                 C   sN   |dkrd S t  }|D ](}t|tr&q|\}}}|||| q| | d S )Nr   )r   rq   rr   r   r5   )r   ru   r   r   r   r   r   r   r   r     s    

zFDArrayIndex.fromXMLN)r   r   r   r   r
  r   r  r   r   r   r   r   r     s   r   c                   @   sF   e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd Zdd Z	dS )VarStoreDataNc                 C   s   || _ d | _|| _t | _d S r   )rh   r   
otVarStorer   r   )r   rh   r  r   r   r   r     s    zVarStoreData.__init__c                 C   sL   | j rHt| j }| j || _i }t| j|}t | _| j|| j	 | S r   )
rh   r   rV   r   r   otr   r  rk   r   )r   lengthZglobalStatereaderr   r   r   rk     s    

zVarStoreData.decompilec                 C   s$   t  }| j|| j | | _d S r   )r   r  r   r   Z
getAllDatar   )r   r   r   r   r   r     s    zVarStoreData.compilec                 C   s   | j || j d S r   )r  r   r   )r   r   ru   r   r   r   writeXML  s    zVarStoreData.writeXMLc                 C   sB   t  | _|D ].}t|tr|\}}}| j|||| j qqd S r   )r   r   r  rq   tupler   r   )r   ru   r   r   r   r   r   r   r   xmlRead  s    


zVarStoreData.xmlReadc                 C   s
   t | jS r   r4   r   rl   r   r   r   rm     s    zVarStoreData.__len__c                 C   s"   |d u rd}| j j| }|j}|S r   )r  ZVarDataZVarRegionCount)r   ZvsIndexZvarData
numRegionsr   r   r   getNumRegions  s
    zVarStoreData.getNumRegions)NN)
r   r   r   r   rk   r   r#  r%  rm   r(  r   r   r   r   r    s   

r  c                   @   s6   e Zd ZdddZdd Zdd Zdd	 Zd
d ZdS )FDSelectNc                 C   s  |rt || _| jdkr@ddlm} |d|| | _q| jdkrd g| }t|}d }d }t|D ]8}	t|}
|d urt||
D ]}|||< q|
}t |}ql|d urt|}
t||
D ]}|||< q|| _n| jdkrxd g| }t|}d }d }t|D ]>}	t|}
|d ur4t||
D ]}|||< q$|
}t|}q|d urpt|}
t||
D ]}|||< q`|| _ndsJ d| n|| _g | _d S )Nr   )arrayrH   rD   rx   Fzunsupported FDSelect format: %s)	r   formatr*  rV   tolistgidArrayr   r   r   )r   rh   	numGlyphsr+  r*  r-  nRangesr   prevr  firstglyphIDr   r   r   r     sT    









zFDSelect.__init__c                 C   s
   t | jS r   )r4   r-  rl   r   r   r   rm   J  s    zFDSelect.__len__c                 C   s
   | j | S r   r-  rB   r   r   r   rv   M  s    zFDSelect.__getitem__c                 C   s   || j |< d S r   r3  )r   r3   fdSelectValuer   r   r   r  P  s    zFDSelect.__setitem__c                 C   s   | j | d S r   )r-  r5   )r   r4  r   r   r   r5   S  s    zFDSelect.append)NNN)r   r   r   r   rm   rv   r  r5   r   r   r   r   r)    s
   
1r)  c                   @   sf   e Zd ZdZdddZdd Zdd Zd	d
 ZeZdd Z	dd Z
dd Zdd Zdd Zdd ZdS )r   a  The ``CharStrings`` in the font represent the instructions for drawing 
	each glyph. This object presents a dictionary interface to the font's
	CharStrings, indexed by glyph name:

	.. code:: python
	
		tt["CFF "].cff[0].CharStrings["a"]
		# <T2CharString (bytecode) at 103451e90>

	See :class:`fontTools.misc.psCharStrings.T1CharString` and
	:class:`fontTools.misc.psCharStrings.T2CharString` for how to decompile,
	compile and interpret the glyph drawing instructions in the returned objects.

	Nc	                 C   s   || _ || _|d urZt||||||d| _i  | _}	tt|D ]}
|
|	||
 < q@d| _n.i | _d| _|| _|d urz|| _	|d ur|| _
d S )NrO   r   r   )r   varStorer  r   r   r   r4   r   r    r  r   )r   rh   ry   r   r    r  r   rP   r5  r   r  r   r   r   r   g  s"    
zCharStrings.__init__c                 C   s   t | j S r   )r]   r   rn   rl   r   r   r   rn   ~  s    zCharStrings.keysc                 C   s   | j r| jS t| j S d S r   )r   r   r]   r   ro   rl   r   r   r   ro     s    zCharStrings.valuesc                 C   s
   || j v S r   )r   )r   ru   r   r   r   has_key  s    zCharStrings.has_keyc                 C   s
   t | jS r   )r4   r   rl   r   r   r   rm     s    zCharStrings.__len__c                 C   s   | j | }| jr| j| }|S r   )r   r   r   )r   ru   r6   r   r   r   rv     s    

zCharStrings.__getitem__c                 C   s*   | j r| j| }|| j|< n
|| j|< d S r   )r   r   r   )r   ru   r6   r3   r   r   r   r    s    
zCharStrings.__setitem__c                 C   sZ   | j r| j| }| j|S t| drDt| dr>| j| j}qHd}nd }| j| |fS d S )Nr   r  r   )r   r   r   r   r*   fdSelectIndex)r   ru   r3   r  r   r   r   r     s    


zCharStrings.getItemAndSelectorc                 C   s   t |  }|D ]}| |\}}| r2dg}ng }|d u rV|dd|fg|  n|dd|fd|fg|  |  || |d |  qd S )N)r  r   r  ru   r7  )sortedrn   r   r  r   r   r   r   )r   r   namesru   ZcharStrr7  r  r   r   r   r     s     

zCharStrings.toXMLc           
   	   C   s   |D ]}t |trq|\}}}|dkr(qd}t| drlzt|d }W n ty\   d}Y n0 | j| j}n| j}|d }tj	}||| j
d}	|	||| |dkr||	_|	| |< qd S )Nr  r"   r   r7  r   ru   r  )rq   rr   r*   r   rs   r   r   r    r   r   r   r   r7  )
r   ru   r   r   r   ZfdIDr    	glyphNamer  r6   r   r   r   r     s0    



zCharStrings.fromXML)NN)r   r   r   r   r   rn   ro   r6  __contains__rm   rv   r  r   r   r   r   r   r   r   r   W  s    
r   c                 C   s   t | dS r  )r   rV   )rh   r   r   r   r     s    r   c                 C   s   t d| d\}|S )NrQ   r#   rY   rT   rV   rh   r   r   r   r   r     s    r   c                 C   s   t d| d\}|S )Nr   rx   r<  r=  r   r   r   r     s    r   c                 C   s   |  t| d S r   )r   r   r=  r   r   r   r     s    r   c                 C   s   |  td| d S NrQ   r   rY   r~   r=  r   r   r   r     s    r   c                 C   s   |  td| d S Nr   r?  r=  r   r   r   r     s    r   c                 C   s   t | S r   )r   r   r   r   r   	packCard8  s    rA  c                 C   s   t d| S r>  rY   r~   r   r   r   r   
packCard16  s    rC  c                 C   s   t d| S r@  rB  r   r   r   r   
packCard32  s    rD  c                 C   s(   i }| D ]\}}}}}||f||< q|S r   r   r   dopru   argdefaultconvr   r   r   buildOperatorDict  s    rK  c                 C   sT   i }| D ]F\}}}}}t |tr:t|d t|d  }nt|}||f||< q|S Nr   r   )rq   r$  r   rE  r   r   r   buildOpcodeDict  s    
rM  c                 C   s&   g }| D ]\}}}}}| | q|S r   )r5   )r   lrG  ru   rH  rI  rJ  r   r   r   r     s    r   c                 C   s,   i }| D ]\}}}}}|d ur|||< q|S r   r   rE  r   r   r   buildDefaults  s
    
rO  c                 C   s$   i }| D ]\}}}}}|||< q|S r   r   rE  r   r   r   buildConverters   s    
rP  c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )SimpleConverterc              	   C   sN   t |ds| ||S |j}| }z| ||W || S || 0 d S )Nrh   )r*   _readrh   r   r[   )r   r   r   rh   r   r   r   r   rV   )  s    

zSimpleConverter.readc                 C   s   |S r   r   r   r   r   r   r   r   rR  3  s    zSimpleConverter._readc                 C   s   |S r   r   rS  r   r   r   r   6  s    zSimpleConverter.writec                 C   s   |j ||d |  d S )Nr   )r   r   r   r   ru   r   r   r   r   xmlWrite9  s    zSimpleConverter.xmlWritec                 C   s   |d S Nr   r   r   ru   r   r   r   r   r   r   r%  =  s    zSimpleConverter.xmlReadN)r   r   r   rV   rR  r   rU  r%  r   r   r   r   rQ  '  s
   
rQ  c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ASCIIConverterc                 C   s   t |ddS Nasciir   rI   rS  r   r   r   rR  C  s    zASCIIConverter._readc                 C   s   t |ddS rY  r	   rS  r   r   r   r   F  s    zASCIIConverter.writec                 C   s"   |j |t|ddd |  d S )NrZ  r   r   r   r
   r   rT  r   r   r   rU  I  s    zASCIIConverter.xmlWritec                 C   s   t |d ddS )Nr   rZ  r   r[  rW  r   r   r   r%  M  s    zASCIIConverter.xmlReadNr   r   r   rR  r   rU  r%  r   r   r   r   rX  A  s   rX  c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
Latin1Converterc                 C   s   t |ddS Nr   r   rI   rS  r   r   r   rR  S  s    zLatin1Converter._readc                 C   s   t |ddS r_  r[  rS  r   r   r   r   V  s    zLatin1Converter.writec                 C   s<   t |dd}|dv r"tdd|}|j||d |  d S )Nr   r   )Notice	Copyrightz	[\r\n]\s+ r   )r
   resubr   r   rT  r   r   r   rU  Y  s
    zLatin1Converter.xmlWritec                 C   s   t |d ddS )Nr   r   r   r[  rW  r   r   r   r%  `  s    zLatin1Converter.xmlReadNr]  r   r   r   r   r^  Q  s   r^  c                 C   s&   zt | }W n   t| }Y n0 |S r   )r1   float)rL   r   r   r   r   parseNumd  s
    rf  c                 C   s`   g }| D ]>}t |trq|\}}}|d  }dd |D }|| qt|dkr\|d }|S )Nr   c                 S   s   g | ]}t |qS r   )evalrK   valr   r   r   
<listcomp>s  rN   z"parseBlendList.<locals>.<listcomp>r   r   )rq   rr   splitr5   r4   )rL   	valueListr   ru   r   r   	blendListr   r   r   parseBlendListl  s    

rn  c                   @   s   e Zd Zdd Zdd ZdS )NumberConverterc                 C   s   t |trj|| |  |  ddd |D }|jt|d |  |  |	| |  n|j||d |  d S )Nrb  c                 S   s   g | ]}t |qS r   rr   rh  r   r   r   rj    rN   z,NumberConverter.xmlWrite.<locals>.<listcomp>r   
rq   r]   r   r   indentjoinr   kBlendDictOpNamededentr   )r   r   ru   r   
blendValuer   r   r   rU  {  s    



zNumberConverter.xmlWritec                 C   s.   | dd }|d u rt|}nt|d }|S rV  )getrn  rf  )r   ru   r   r   r   valueStringr   r   r   r   r%    s
    
zNumberConverter.xmlReadNr   r   r   rU  r%  r   r   r   r   ro  z  s   ro  c                   @   s   e Zd Zdd Zdd ZdS )ArrayConverterc                 C   s   |r|t |d tr||| |  |  |D ].}ddd |D }|jt|d |  q0|  |	| |  n*ddd |D }|j||d |  d S )Nr   rb  c                 S   s   g | ]}t |qS r   rp  rh  r   r   r   rj    rN   z+ArrayConverter.xmlWrite.<locals>.<listcomp>r   c                 S   s   g | ]}t |qS r   rp  rh  r   r   r   rj    rN   rq  )r   r   ru   r   rl  rv  r   r   r   rU    s    



zArrayConverter.xmlWritec                 C   s8   | dd }|d u rt|}n| }dd |D }|S )Nr   c                 S   s   g | ]}t |qS r   )rf  )rK   r   r   r   r   rj    rN   z*ArrayConverter.xmlRead.<locals>.<listcomp>)rw  rn  rk  )r   ru   r   r   r   rx  rl  ro   r   r   r   r%    s    
zArrayConverter.xmlReadNry  r   r   r   r   rz    s   rz  c                   @   s   e Zd Zdd Zdd ZdS )TableConverterc                 C   s2   | | |  || || |  d S r   )r   r   r   r   rT  r   r   r   rU    s
    


zTableConverter.xmlWritec                 C   s<   |    }|D ](}t|trq|\}}}|||| q|S r   )getClassrq   rr   r   )r   ru   r   r   r   obr   r   r   r   r%    s    


zTableConverter.xmlReadNry  r   r   r   r   r{    s   r{  c                   @   s$   e Zd Zdd Zdd Zdd ZdS )PrivateDictConverterc                 C   s   t S r   )PrivateDictrl   r   r   r   r|    s    zPrivateDictConverter.getClassc           
      C   s|   |\}}|j }|j}z
|j}W n ty4   d }Y n0 t|j||||d}|| ||}	t|	|ksnJ |	|	 |S r  )
rh   r   r   AttributeErrorr  rc   r[   rV   r4   rk   )
r   r   r   r  r   rh   rP   r   Zprivr   r   r   r   rR    s    




zPrivateDictConverter._readc                 C   s   dS )N)r   r   r   rS  r   r   r   r     s    zPrivateDictConverter.writeNr   r   r   r|  rR  r   r   r   r   r   r~    s   r~  c                   @   s$   e Zd Zdd Zdd Zdd ZdS )SubrsConverterc                 C   s   t S r   )r  rl   r   r   r   r|    s    zSubrsConverter.getClassc                 C   s(   |j }|j}||j|  t||dS r  )rh   r   r[   r   r  )r   r   r   rh   rP   r   r   r   rR    s    zSubrsConverter._readc                 C   s   dS r   r   rS  r   r   r   r     s    zSubrsConverter.writeNr  r   r   r   r   r    s   r  c                   @   s$   e Zd Zdd Zdd Zdd ZdS )CharStringsConverterc              
   C   s   |j }|j}|j}t|dd }|j}t|drP|j}t|drF|j}	nd }	d }
nd\}	}|j}
|	| t
||||
|	|||d}|S )Nr   r   r)  )NN)rP   r5  )rh   r   ry   r   rg   r*   r   r)  r   r[   r   )r   r   r   rh   rP   ry   r5  r   r   r  r    r   r   r   r   rR    s$    


zCharStringsConverter._readc                 C   s   dS r   r   rS  r   r   r   r     s    zCharStringsConverter.writec           	      C   sp   t |dr,|j}t |dr"|j}nd }d }n|jd d   }}}td d |j|||t|dd d}|||| |S )Nr   r)  r   )r5  )r*   r   r)  r   r   rg   r   r   )	r   ru   r   r   r   r   r  r    r   r   r   r   r%    s    

zCharStringsConverter.xmlReadNr   r   r   rR  r   r%  r   r   r   r   r    s   r  c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
CharsetConverterc                 C   s  t |d}|dkr|j}|j}|| ttd| t|}|dkrZt|||j|}n(|dksj|dkr~t	|||j||}nt
t||ksJ ttd|  i }g }	|D ]`}
|
|v r||
 }|
d t| |v r|d7 }q|d ||
< |
d t| }
d||
< |	|
 q|	}nT|s*d|jvr>|dks8J d }n.|dkrNt}n|dkr^t}n|dkrlt}|rt||jkr|d |j }|S )	NROSr#   zloading charset at %sr   r   z    charset end at %s#r   )r*   r.  rh   r[   r   r   r   parseCharset0rc   parseCharsetNotImplementedErrorr4   r   rr   r5   r   cffISOAdobeStringscffIExpertStringscffExpertSubsetStrings)r   r   r   isCIDr.  rh   r+  ry   ZallNamesZ
newCharsetr:  nr   r   r   rR    sL    






zCharsetConverter._readc                 C   s   dS r   r   rS  r   r   r   r   H  s    zCharsetConverter.writec                 C   s   | d |  d S )Nz8charset is dumped separately as the 'GlyphOrder' element)r  r   rT  r   r   r   rU  K  s    
zCharsetConverter.xmlWritec                 C   s   d S r   r   rW  r   r   r   r%  R  s    zCharsetConverter.xmlReadNr]  r   r   r   r   r    s   .r  c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
CharsetCompilerc                 C   s\   |d dksJ t |jd}t|||}t|||}t|t|k rL|| _n|| _|| _d S )Nr   .notdefr  )r*   dictObjpackCharset0packCharsetr4   r   r   )r   rc   ry   r   r  data0r   r   r   r   r   X  s    zCharsetCompiler.__init__c                 C   s   || j jd< d S )Nry   r   r   r   r   r   r   c  s    zCharsetCompiler.setPosc                 C   s
   t | jS r   r&  rl   r   r   r   r   f  s    zCharsetCompiler.getDataLengthc                 C   s   | | j d S r   r   r   r   r   r   r   r   i  s    zCharsetCompiler.toFileNr   r   r   r   r   r   r   r   r   r   r   r  V  s   r  c                 C   s|   d }t tdfttdfttdfg}t| }|D ]J\}}}|d urB qx||krLq,|}t|D ]}| | || krXd } q,qXq,|S )Nr   r   r#   )cffISOAdobeStringCountr  cffExpertStringCountr  cffExpertSubsetStringCountr  r4   r   )ry   ZpredefinedCharSetValZpredefinedCharSetsZlcsZcntZpcscsvr  r   r   r   getStdCharSetm  s"    r  c                 C   s   t | dd  S )NrD   )r1   ru   rc   r   r   r   getCIDfromName  s    r  c                 C   s
   | | S r   )getSIDr  r   r   r   getSIDfromName  s    r  c                 C   sJ   d}t |g}|rt}nt}| dd  D ]}|t||| q(t|S rL  )rA  r  r  r5   rC  r   )ry   r  rc   fmtr   	getNameIDru   r   r   r   r    s    
r  c                 C   s   d}g }d }d}|rt }nt}| dd  D ]R}|||}	|d u rF|	}n2|d |	krx|| }
|
dkrfd}|||
f |	}|	}q*|r|| }
|
dkrd}|||
f t|g}|dkrt}nt}|D ]\}}
|t|||
  qt|S )Nr   r      r#   )r  r  r5   rA  rC  r   )ry   r  rc   r  rangesr1  endr  ru   SIDnLeftr   	nLeftFuncr   r   r   r    s<    

r  c                 C   sj   dg}|r>t | d D ]$}t|}|dt|d  qn(t | d D ]}t|}|||  qJ|S Nr  r   Zcidrw   )r   r   r5   rr   zfill)r.  rh   rc   r  ry   r  CIDr  r   r   r   r    s    r  c                 C   s   dg}d}|dkrt }nt}|| k rt|}||}	|rjt|||	 d D ]}
|dt|
d  qJn&t|||	 d D ]}|||  q|||	 d }q|S r  )r   r   r   r5   rr   r  )r.  rh   rc   r  r  ry   r   r  r1  r  r  r  r   r   r   r    s    r  c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
EncodingCompilerc                 C   sZ   t |trJ t|jj||j}t|jj||j}t|t|k rJ|| _n|| _|| _	d S r   )
rq   rr   packEncoding0r  ry   rc   packEncoding1r4   r   r   )r   rc   r   r   r  Zdata1r   r   r   r     s    zEncodingCompiler.__init__c                 C   s   || j jd< d S )NEncodingr   r   r   r   r   r     s    zEncodingCompiler.setPosc                 C   s
   t | jS r   r&  rl   r   r   r   r     s    zEncodingCompiler.getDataLengthc                 C   s   | | j d S r   r  r   r   r   r   r     s    zEncodingCompiler.toFileNr  r   r   r   r   r    s   
r  c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
EncodingConverterc                 C   s   |dkrdS |dkrdS |dks$J |j }|| ttd| t|}|d@ }|r^td|d@ }|dkrt|j|||j}n|dkrt	|j|||j}|S d S )	Nr   StandardEncodingr   ExpertEncodingzloading Encoding at %s   z*Encoding supplements are not yet supported   )
rh   r[   r   r   r   r  parseEncoding0ry   rc   parseEncoding1)r   r   r   rh   r  haveSupplementr   r   r   r   rR    s,    


zEncodingConverter._readc                 C   s   |dkrdS |dkrdS dS )Nr  r   r  r   r   rS  r   r   r   r     s
    zEncodingConverter.writec                 C   s   |dv r"|j ||d |  d S || |  tt|D ]0}|| }|dkr@|j dt||d |  q@|| |  d S )N)r  r  r   r  map)coderu   )r   r   r   r   r4   hexr   )r   r   ru   r   r  r:  r   r   r   rU    s    


zEncodingConverter.xmlWritec           	      C   sZ   d|v r|d S dgd }|D ]6}t |tr.q|\}}}t|d }|d }|||< q|S )Nru   r  r   r  )rq   rr   r   )	r   ru   r   r   r   r   r   r  r:  r   r   r   r%  "  s    



zEncodingConverter.xmlReadNr]  r   r   r   r   r    s   r  c                 C   sF   t |}dgd }td|d D ] }t |}|dkr | | ||< q |S )Nr  r   r   r   r   r   )ry   rh   r  rc   ZnCodesr   r2  r  r   r   r   r  0  s    
r  c           
      C   sl   t |}dgd }d}t|D ]H}t |}t |}	t|||	 d D ]}| | ||< |d }qD|d }q|S )Nr  r   r   r  )
ry   rh   r  rc   r/  r   r2  r  r  r  r   r   r   r  :  s    


r  c           	      C   s   d}i }t t|D ]}|| }|dkr|||< qg }| dd  D ]}||}|| qB|rv|d d u rv|  q\t|tt|g}|D ]}|d u rd}|t| qt|S )Nr   r  r   r"   r   r4   rw  r5   poprA  r   )	ry   r   rc   r  mr  ru   codesr   r   r   r   r  H  s$    


r  c                 C   s  d}i }t t|D ]}|| }|dkr|||< qg }d }d}	| dd  D ]H}||d}|d u rh|}n&|	d |kr|	| }
|||
f |}|}	qJ|	| }
|||
f |r|d d dkr|  qt|tt|g}|D ]*\}}
|dkrd}|t|t|
  qt|S )Nr   r  r   r"   r  )ry   r   rc   r  r  r  ru   r  r1  r  r  r   r   r   r   r  _  s8    

r  c                   @   s$   e Zd Zdd Zdd Zdd ZdS )FDArrayConverterc                 C   s^   z
|j }W n ty    d }Y n0 |j}|j}|| t||d}||_|j|_|j|_|S r  )	r   r  rh   r   r[   r   r   rc   rg   )r   r   r   r   rh   rP   r   r   r   r   rR    s    


zFDArrayConverter._readc                 C   s   dS r   r   rS  r   r   r   r     s    zFDArrayConverter.writec                 C   s8   t  }|D ](}t|trq
|\}}}|||| q
|S r   )r   rq   rr   r   )r   ru   r   r   r   r   r   r   r   r   r%    s    

zFDArrayConverter.xmlReadNr  r   r   r   r   r    s   r  c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
FDSelectConverterc                 C   s    |j }|| t||j}|S r   )rh   r[   r)  r.  )r   r   r   rh   r  r   r   r   rR    s    
zFDSelectConverter._readc                 C   s   dS r   r   rS  r   r   r   r     s    zFDSelectConverter.writec                 C   s    | |d|jfg |  d S Nr+  )r   r+  r   rT  r   r   r   rU    s    zFDSelectConverter.xmlWritec           	      C   s$   t |d }d }d }t|||}|S r  )r   r)  )	r   ru   r   r   r   r  rh   r.  r  r   r   r   r%    s
    zFDSelectConverter.xmlReadNr]  r   r   r   r   r    s   r  c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
VarStoreConverterc                 C   s$   |j }|| t|}|  |S r   )rh   r[   r  rk   )r   r   r   rh   r5  r   r   r   rR    s
    
zVarStoreConverter._readc                 C   s   dS r   r   rS  r   r   r   r     s    zVarStoreConverter.writec                 C   s   | || d S r   )r#  rT  r   r   r   rU    s    zVarStoreConverter.xmlWritec                 C   s   t  }||||| |S r   )r  r%  )r   ru   r   r   r   r5  r   r   r   r%    s    zVarStoreConverter.xmlReadNr]  r   r   r   r   r    s   r  c                 C   s.   d}t |g}| D ]}|t | qt|S r   )rA  r5   r   )fdSelectArrayr  r   r3   r   r   r   packFDSelect0  s
    
r  c           
      C   s   d}g }t | }d}t|D ]&}| | }||kr|||g |}q|d }t|g}|tt | |D ](}	|t|	d  |t|	d  ql|t| t|S )NrD   r"   r   r   )r4   r   r5   rA  rC  r   
r  r  ZfdRangesZlenArrayZlastFDIndexr  r  ZsentinelGIDr   ZfdRanger   r   r   packFDSelect3  s"    
r  c           
      C   s   d}g }t | }d}t|D ]&}| | }||kr|||g |}q|d }t|g}|tt | |D ](}	|t|	d  |t|	d  ql|t| t|S )Nrx   r"   r   r   )r4   r   r5   rA  rD  rC  r   r  r   r   r   packFDSelect4  s"    
r  c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
FDSelectCompilerc                 C   s   |j }|j}|dkr t|| _nb|dkr4t|| _nN|dkrHt|| _n:t|}t|}t|t|k rv|| _d|_ n|| _d|_ || _d S )Nr   rD   rx   )r+  r-  r  r   r  r  r4   r   )r   r  r   r  r  r  Zdata3r   r   r   r      s     zFDSelectCompiler.__init__c                 C   s   || j jd< d S )Nr)  r   r   r   r   r   r     s    zFDSelectCompiler.setPosc                 C   s
   t | jS r   r&  rl   r   r   r   r     s    zFDSelectCompiler.getDataLengthc                 C   s   | | j d S r   r  r   r   r   r   r     s    zFDSelectCompiler.toFileNr  r   r   r   r   r    s   r  c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
VarStoreCompilerc                 C   s6   || _ |js|  tt|j|jg}t|| _d S r   )r   r   r   rC  r4   r   )r   varStoreDatar   r   r   r   r   r   "  s    zVarStoreCompiler.__init__c                 C   s   || j jd< d S )Nr   r   r   r   r   r   r   ,  s    zVarStoreCompiler.setPosc                 C   s
   t | jS r   r&  rl   r   r   r   r   /  s    zVarStoreCompiler.getDataLengthc                 C   s   | | j d S r   r  r   r   r   r   r   2  s    zVarStoreCompiler.toFileNr  r   r   r   r   r     s   
r  c                   @   s   e Zd Zdd Zdd ZdS )ROSConverterc                 C   s<   |\}}}| |dt|fdt|fd|fg |  d S NRegistryZOrderZ
Supplementr\  )r   r   ru   r   registryr   Z
supplementr   r   r   rU  8  s    


zROSConverter.xmlWritec                 C   s   |d |d t |d fS r  )r   rW  r   r   r   r%  C  s    zROSConverter.xmlReadNry  r   r   r   r   r  6  s   r  )   ZmaxstacknumberNN)      r  )r  r  r  ))r     ZSyntheticBaser  NN)r   versionr  NNr`  r  )r  r   ra  )r#   ZFullNamer  NN))r  &   FontNamer  NN)rD   Z
FamilyNamer  NN)rx   Weightr  NN))r  r   ZisFixedPitchr  r   N))r  r#   ZItalicAngler  r   N))r  rD   ZUnderlinePositionr  iN))r  rx   ZUnderlineThicknessr  2   N))r  rw   Z	PaintTyper  r   N))r     ZCharstringTyper  r#   N)r     
FontMatrixr*  )MbP?r   r   r  r   r   )   ZUniqueIDr  NNrw   FontBBox)r   r   r   r   ))r     ZStrokeWidthr  r   N)   ZXUIDr*  NN))r     
PostScriptr  NN))r     ZBaseFontNamer  NN))r     ZBaseFontBlenddeltaNN))r     CIDFontVersionr  r   N))r      CIDFontRevisionr  r   N))r  !   CIDFontTyper  r   N))r  "   CIDCountr  i"  N   ry   r  ))r  #   ZUIDBaser  NN   r     r   )r  r  )r  %   )r  $   r         r   blendr  )r  vsindexr  NNrm  )r  Z
BlueValuesr  NN)r  Z
OtherBluesr  NN)r  ZFamilyBluesr  NN)	   ZFamilyOtherBluesr  NN))r  r  Z	BlueScaler  g}?5^I?N))r  
   Z	BlueShiftr  r  N))r     ZBlueFuzzr  r   N)r  ZStdHWr  NN)r  ZStdVWr  NN))r  r  Z	StemSnapHr  NN))r  r  Z	StemSnapVr  NN))r  r  Z	ForceBoldr  r   N))r  r  ZForceBoldThresholdr  NN))r  r  ZlenIVr  NN))r  r  ZLanguageGroupr  r   N))r  r  ZExpansionFactorr  gQ?N))r     ZinitialRandomSeedr  r   N)r  defaultWidthXr  r   N)r  nominalWidthXr  r   Nr  r   c                 C   s   t t| D ]x}| | \}}}}}|d ur,q|dv r<t }n6|dkrLt }n&|dkr\t }n|dkrjd }ndsrJ |||||f| |< qd S )N)r  r*  r  r  rm  F)r   r4   rz  ro  rX  )r   r  rG  ru   rH  rI  rJ  r   r   r   addConverters  s    r  c                   @   s   e Zd ZeeZdS )TopDictDecompilerN)r   r   r   rK  r   	operatorsr   r   r   r   r     s   r   c                   @   s   e Zd ZeeZdS )PrivateDictDecompilerN)r   r   r   rK  r   r  r   r   r   r   r    s   r  c                   @   sb   e Zd ZdZdddZdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd ZdS )DictCompilerr   Nc           	      C   s   |rt |tsJ |d u r6t|dr6|j}|d us6J || _|| _|| _|| _i }|jD ]J}t||d }|d u rrqX|j	| }|
||}||j|krqX|||< qX|| _d S r   )rq   rb   r*   rP   r  rc   r   r   r   
convertersr   defaultsrw  r   )	r   r  rc   r   rP   r   ru   r   rJ  r   r   r   r     s(    


zDictCompiler.__init__c                 C   s   d S r   r   r   r   r   r   r     s    zDictCompiler.setPosc                 C   s   t | dS )Nr   )r4   r   rl   r   r   r   r     s    zDictCompiler.getDataLengthc                 C   s   t  td| jj| | j}g }| jjD ]}||}|d u r>q&| j| \}}t	|t
rt|}t||ksrJ dt|D ]0}	||	 }
||	 }t| d|
 }||| qznt| d| }||| || q&t|}|S )Nz-- compiling %s for %szvalue doesn't match arg typeZarg_)r   r   r   r   r   r  r   rw  opcodesrq   r$  r4   r   r   r5   r   )r   reasonr   r   ru   r   rG  ZargTyperN  r  rH  vZ
arghandlerr   r   r   r     s*    

zDictCompiler.compilec                 C   s   |  d}|| d S )Nr   )r   r   )r   rh   r   r   r   r   r   	  s    
zDictCompiler.toFilec                 C   sJ   t |tr>dd |D }|td |tt t|}nt|}|S )Nc                 S   s   g | ]}t |qS r   encodeNumberrh  r   r   r   rj  	  rN   z+DictCompiler.arg_number.<locals>.<listcomp>r   )rq   r]   r5   r
  r   blendOpr   )r   numr   Zdatumr   r   r   
arg_number	  s    

zDictCompiler.arg_numberc                 C   s   t | j|S r   )r   encodeIntCFFrc   r  )r   rL   r   r   r   arg_SID	  s    zDictCompiler.arg_SIDc                 C   s&   g }|D ]}| | | qt|S r   )r5   r  r   )r   r   r   r  r   r   r   	arg_array	  s    zDictCompiler.arg_arrayc                 C   sn   |sdS |d }t |tr&| |}n@g }d}|D ]}|||  |}q2g }|D ]}|t| qRt|S )NrN   r   )rq   r]   arg_delta_blendr5   r
  r   )r   r   Zval0r   r   lastr  r  r   r   r   	arg_delta	  s    
zDictCompiler.arg_deltac                 C   s,  t |d }t |}|| d }|| jkrt| jd | }g }tt ||}|dkrXq|d| }| |}	||	 ||d }q@ndg| }
dg| }d}d}||k r|| d }|| |
|< |}|| dd ||< |d7 }q|
}|D ]}|| qdd |D }|t| |tt	 |S )a'  A delta list with blend lists has to be *all* blend lists.

		The value is a list is arranged as follows::

			[
				[V0, d0..dn]
				[V1, d0..dn]
				...
				[Vm, d0..dn]
			]

		``V`` is the absolute coordinate value from the default font, and ``d0-dn``
		are the delta values from the *n* regions. Each ``V`` is an absolute
		coordinate from the default font.

		We want to return a list::

			[
				[v0, v1..vm]
				[d0..dn]
				...
				[d0..dn]
				numBlends
				blendOp
			]

		where each ``v`` is relative to the previous default font value.
		r   r   Nc                 S   s   g | ]}t |qS r   r	  rh  r   r   r   rj  l	  rN   z0DictCompiler.arg_delta_blend.<locals>.<listcomp>)
r4   maxBlendStackr1   minr  r   r5   r
  r   r  )r   r   Z
numMastersZ	numBlendsZnumStackZnumBlendValuesr   ZnumValZvalListZout1Z	firstListZ	deltaListr  ZprevValdefaultValueZrelValueListrm  r   r   r   r  +	  s<    





zDictCompiler.arg_delta_blend)N)r   r   r   r  r   r   r   r   r   r  r  r  r  r  r   r   r   r   r    s   

r  c                 C   s"   t | trt| S t| S d S r   )rq   re  r   ZencodeFloatr  )r  r   r   r   r
  r	  s    

r
  c                   @   s   e Zd ZeeZdd ZdS )TopDictCompilerc                 C   s  | j }g }| jjd u rt| jdrr| jjrrt| jdr<d }nt| jj}|d u rh|t|| jj|  n
|| jd< t| jdr| jj	r| jj	}t
|ts|t|||  n(t| jdr| jj}t|| }|| t| jdr4| jj}t|dkr | jj}	| jjD ]}
||	|
 j qt|| }|| t| jdrg }| jj}	| jjD ]}
||	|
  qVt||| |d}|| t| jd	r| jj|| }|| ||| t| jd
r| jj|| }|| ||| |S )Nry   r  r  r   r)  r   r   rO   r   r   )rP   r  rj   r*   ry   r  r5   r  r   r  rq   rr   r  r   r  r)  r4   r   r7  r  r   r   r|   r   r   r   )r   rc   rP   r   ZcharsetCoder   r  ZvarStoreCompr  r   ru   ZfdSelectCompr   ZcharStringsCompZfdArrayIndexCompprivCompr   r   r   r   }	  sX    








zTopDictCompiler.getChildrenN)r   r   r   rM  r   r  r   r   r   r   r   r  y	  s   r  c                       s.   e Zd ZeeZd fdd	Zdd Z  ZS )FontDictCompilerNc           	         s   t t| j||||d g }| j}tt|jt|j D ]^}||jv rT|	| q:|j
|}|d ur~|j| }|||}t||d |kr:|	| q:|rtddt|  d S )NrO   z:Some CFF FDArray/FontDict keys were ignored upon compile: rb  )r   r  r   r  r8  setr  r   r   r5   r  rw  rV   r   r   warningrs  )	r   r  rc   r   rP   ignoredNamesru   rI  rJ  r   r   r   r   	  s$    

zFontDictCompiler.__init__c                 C   s>   g }t | jdr:| jj|| }|| ||| |S Nr   )r*   r  r   r|   r5   r   r   )r   rc   r   r  r   r   r   r   	  s    
zFontDictCompiler.getChildren)N)	r   r   r   rM  r   r  r   r   r   r   r   r   r   r  	  s    r  c                   @   s(   e Zd ZeZeeZdd Zdd Z	dS )PrivateDictCompilerc                 C   s"   || }||f| j jd< || _d S r  )r   r   r   )r   r   r   r  r   r   r   r   	  s    zPrivateDictCompiler.setPosc                 C   s*   g }t | jdr&|| jj||  |S r   )r*   r  r5   r   r|   )r   rc   r   r   r   r   r   	  s    zPrivateDictCompiler.getChildrenN)
r   r   r   maxStackLimitr  rM  r   r  r   r   r   r   r   r   r  	  s   r  c                   @   sH   e Zd ZdddZdd Zdd Zddd	Zd
d Zdd Zdd Z	dS )BaseDictNc                 C   sd   |d u |d u ksJ i | _ g | _|| _|d u r2d S || _|| _|d ur`ttd| jj| || _	d S )Nr   )
r   	skipNamesrc   r   rh   r   r   r   r   r   )r   rc   rh   r   rP   r   r   r   r   	  s    zBaseDict.__init__c                 C   sF   t  td| jjt| | | j| }|| | | _	| 
  d S )Nz    length %s is %d)r   r   r   r   r4   decompilerClassrc   rk   ZgetDictr   postDecompile)r   r   decr   r   r   rk   
  s
    

zBaseDict.decompilec                 C   s   d S r   r   rl   r   r   r   r#  	
  s    zBaseDict.postDecompilec                 C   s   | j | |||dS r  r	  r  r   r   r   r|   
  s    zBaseDict.getCompilerc                 C   s   |d d |dd    kr$dkr0n nt || j|d }|d u rR| j|}|d u rbt || j| }|| |}t| || |S )Nr#   __)r  r   rw  r  r  rV   r(   )r   ru   r   rJ  r   r   r   __getattr__
  s    (
zBaseDict.__getattr__c                 C   s   | j D ]F}|| jv rqt| |d }|d u r4|dkr4q| j| }|||| qt| jt| j  }|r|ddt	|  |
  d S )Nry   zsome keys were ignored: %srb  )r   r!  r   r  rU  r  r   r  rs  r8  r   )r   r   ru   r   rJ  r  r   r   r   r    
  s    



zBaseDict.toXMLc                 C   s*   | j | }||||| }t| || d S r   )r  r%  r(   )r   ru   r   r   rJ  r   r   r   r   r   8
  s    
zBaseDict.fromXML)NNNN)N)
r   r   r   r   rk   r#  r|   r'  r   r   r   r   r   r   r   	  s   

r   c                       sj   e Zd ZdZeeZeeZe	Z
eeZeZd fdd	Zdd Zdd Zd	d
 Zdd Zdd Z  ZS )r   a  The ``TopDict`` represents the top-level dictionary holding font
	information. CFF2 tables contain a restricted set of top-level entries
	as described `here <https://docs.microsoft.com/en-us/typography/opentype/spec/cff2#7-top-dict-data>`_,
	but CFF tables may contain a wider range of information. This information
	can be accessed through attributes or through the dictionary returned
	through the ``rawDict`` property:

	.. code:: python

		font = tt["CFF "].cff[0]
		font.FamilyName
		# 'Linux Libertine O'
		font.rawDict["FamilyName"]
		# 'Linux Libertine O'

	More information is available in the CFF file's private dictionary, accessed
	via the ``Private`` property:

	.. code:: python

		tt["CFF "].cff[0].Private.BlueValues
		# [-15, 0, 515, 515, 666, 666]
	
	Nc                    s^   t t| j||||d || _|| _|rFtt| _| | _t	t| _
ntt| _t	t| _
d S r  )r   r   r   rj   rg   rO  r   r  ry   r   r   r   )r   rc   rh   r   rg   rj   rP   r   r   r   r   ^
  s    

zTopDict.__init__c                 C   s   | j S )z.Returns a list of glyph names in the CFF font.)ry   rl   r   r   r   re   k
  s    zTopDict.getGlyphOrderc                 C   sH   | j d}|d u rd S | j| | jr8t| j| _nt| j| _d S r   )r   rw  rh   r[   r   r   r.  r   )r   r   r   r   r   r#  o
  s    zTopDict.postDecompilec                 C   sR   t | dr|   t | dr$dg| _t | dr8t | dsBg d| _t| | d S )Nr   r  r  )r  r  r  r  )r*   decompileAllCharStringsr!  r   r   )r   r   r   r   r   r   z
  s    


zTopDict.toXMLc                 C   sD   t | j D ]0\}}z|  W q   td|  Y q0 qd S )NzError in charstring %s)	enumerater   ro   rk   r   error)r   r  r6   r   r   r   r(  
  s    zTopDict.decompileAllCharStringsc                 C   sp   d }| j  D ]0}|| j }|d ur|d ur:t||}q|}q|d u r^| jd d d  | _ntt|| _d S )Nr  )r   ro   Z
calcBoundsr   r  r  r]   r   )r   ZfontBBoxr6   Zboundsr   r   r   rz   
  s    zTopDict.recalcFontBBox)NNNNNN)r   r   r   r   rO  r   r  rP  r  r  r
  r   r   r   r"  r   re   r#  r   r(  rz   r   r   r   r   r   r   >
  s     	r   c                       sH   e Zd Zi ZeeZeZg dZ	dgZ
eZd fdd	Zdd Z  ZS )	r   )r  r  r  r   r   Nc                    s,   t t| j||||d || _| | d S r  )r   r   r   r   r   )r   rc   rh   r   rg   rP   r   r   r   r   r   
  s    zFontDict.__init__c                 C   s&   |r| j | _d| _n| j| _d| _d S )NTF)	orderCFF2r   r   orderCFFr   r   r   r   r   
  s
    zFontDict.setCFF2)NNNNNN)r   r   r   r  rP  r   r  r  r
  r,  r+  r   r"  r   r   r   r   r   r   r   r   
  s     r   c                       sT   e Zd ZeeZeeZeeZ	e
ZeZd fdd	Zedd Zd	ddZ  ZS )
r  Nc                    s\   t t| j||||d || _|rDtt| _tt| _d  | _	| _
ntt| _tt| _d S r  )r   r  r   r   rO  r   r  r   r   r  r  r   )r   rc   rh   r   rP   r   r   r   r   r   
  s    


zPrivateDict.__init__c                 C   s   | j S r   )r   rl   r   r   r   r2   
  s    zPrivateDict.in_cff2c                 C   s.   |d u rt | dr| j}nd}| j|}|S )Nr  r   )r*   r  r   r(  )r   vir'  r   r   r   r(  
  s    
zPrivateDict.getNumRegions)NNNNN)N)r   r   r   rO  r   r  rP  r  r   r   r  r"  r  r
  r   propertyr2   r(  r   r   r   r   r   r  
  s     
r  c                   @   sJ   e Zd ZdZdddZdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dS )rb   zSID -> string mapping.Nc                 C   s.   |d u rg }ndd t |ddD }|| _d S )Nc                 S   s   g | ]}t |d dqS )r   r   rI   rJ   r   r   r   rj  
  s   z+IndexedStrings.__init__.<locals>.<listcomp>FrO   )r^   rc   )r   rh   rc   r   r   r   r   
  s    
zIndexedStrings.__init__c                 C   s   t | d | ddS )NFrO   )r   rl   r   r   r   r|     s    zIndexedStrings.getCompilerc                 C   s
   t | jS r   )r4   rc   rl   r   r   r   rm     s    zIndexedStrings.__len__c                 C   s"   |t k rt| S | j|t   S d S r   )cffStandardStringCountcffStandardStringsrc   )r   r  r   r   r   rv   
  s    zIndexedStrings.__getitem__c                 C   sn   t | ds|   t|dd}|tv r0t| }n:|| jv rF| j| }n$t| jt }| j| || j|< |S )NstringMappingr   r   )	r*   buildStringMappingr
   cffStandardStringMappingr1  r4   rc   r/  r5   )r   rL   r  r   r   r   r    s    



zIndexedStrings.getSIDc                 C   s   | j S r   r   rl   r   r   r   
getStrings  s    zIndexedStrings.getStringsc                 C   s2   i | _ tt| jD ]}|t | j | j| < qd S r   )r1  r   r4   rc   r/  rB   r   r   r   r2  !  s    z!IndexedStrings.buildStringMapping)N)r   r   r   r   r   r|   rm   rv   r  r4  r2  r   r   r   r   rb   
  s   

rb   (  r  spaceexclamquotedbl
numbersigndollarpercent	ampersand
quoteright	parenleft
parenrightasteriskpluscommahyphenperiodslashzeroonetwothreefourfivesixseveneightninecolon	semicolonlessequalgreaterquestionatArH   CDEFGHIJKLMNOPQRSTUVWXYZbracketleft	backslashbracketrightasciicircum
underscore	quoteleftabr   rF  efr   hr  jkrN  r  r  opqrrL   tur  wxyz	braceleftbar
braceright
asciitilde
exclamdowncentsterlingfractionyenflorinsectioncurrencyquotesinglequotedblleftguillemotleftguilsinglleftguilsinglrightfiflendashdagger	daggerdblperiodcentered	paragraphbulletquotesinglbasequotedblbasequotedblrightguillemotrightellipsisperthousandquestiondowngraveacute
circumflextildemacronbreve	dotaccentdieresisringcedillahungarumlautogonekcaronemdashAEordfeminineLslashOslashOEordmasculineaedotlessilslashoslashoe
germandblsonesuperior
logicalnotmu	trademarkEthonehalf	plusminusThorn
onequarterdivide	brokenbardegreethornthreequarterstwosuperior
registeredminusethmultiplythreesuperior	copyrightAacuteAcircumflex	AdieresisAgraveAringAtildeCcedillaEacuteEcircumflex	EdieresisEgraveIacuteIcircumflex	IdieresisIgraveNtildeOacuteOcircumflex	OdieresisOgraveOtildeScaronUacuteUcircumflex	UdieresisUgraveYacute	YdieresisZcaronaacuteacircumflex	adieresisagravearingatildeccedillaeacuteecircumflex	edieresisegraveiacuteicircumflex	idieresisigraventildeoacuteocircumflex	odieresisograveotildescaronuacuteucircumflex	udieresisugraveyacute	ydieresiszcaronexclamsmallHungarumlautsmalldollaroldstyledollarsuperiorampersandsmall
Acutesmallparenleftsuperiorparenrightsuperiortwodotenleaderonedotenleaderzerooldstyleoneoldstyletwooldstylethreeoldstylefouroldstylefiveoldstylesixoldstylesevenoldstyleeightoldstylenineoldstylecommasuperiorthreequartersemdashperiodsuperiorquestionsmall	asuperior	bsuperiorcentsuperior	dsuperior	esuperior	isuperior	lsuperior	msuperior	nsuperior	osuperior	rsuperior	ssuperior	tsuperiorffffifflparenleftinferiorparenrightinferiorCircumflexsmallhyphensuperior
GravesmallAsmallBsmallCsmallDsmallEsmallFsmallGsmallHsmallIsmallJsmallKsmallLsmallMsmallNsmallOsmallPsmallQsmallRsmallSsmallTsmallUsmallVsmallWsmallXsmallYsmallZsmallcolonmonetary	onefittedrupiah
TildesmallexclamdownsmallcentoldstyleLslashsmallScaronsmallZcaronsmallDieresissmall
Brevesmall
CaronsmallDotaccentsmallMacronsmall
figuredashhypheninferiorOgoneksmall	RingsmallCedillasmallquestiondownsmall	oneeighththreeeighthsfiveeighthsseveneighthsonethird	twothirdszerosuperiorfoursuperiorfivesuperiorsixsuperiorsevensuperioreightsuperiorninesuperiorzeroinferioroneinferiortwoinferiorthreeinferiorfourinferiorfiveinferiorsixinferiorseveninferioreightinferiornineinferiorcentinferiordollarinferiorperiodinferiorcommainferiorAgravesmallAacutesmallAcircumflexsmallAtildesmallAdieresissmall
AringsmallAEsmallCcedillasmallEgravesmallEacutesmallEcircumflexsmallEdieresissmallIgravesmallIacutesmallIcircumflexsmallIdieresissmallEthsmallNtildesmallOgravesmallOacutesmallOcircumflexsmallOtildesmallOdieresissmallOEsmallOslashsmallUgravesmallUacutesmallUcircumflexsmallUdieresissmallYacutesmall
ThornsmallYdieresissmallz001.000z001.001z001.002z001.003ZBlackZBoldZBookZLightZMediumZRegularZRomanZSemiboldi  )r  r5  r6  r7  r8  r9  r:  r;  r<  r=  r>  r?  r@  rA  rB  rC  rD  rE  rF  rG  rH  rI  rJ  rK  rL  rM  rN  rO  rP  rQ  rR  rS  rT  rU  rV  rH   rW  rX  rY  rZ  r[  r\  r]  r^  r_  r`  ra  rb  rc  rd  re  rf  rg  rh  ri  rj  rk  rl  rm  rn  ro  rp  rq  rr  rs  rt  ru  rv  r   rF  rw  rx  r   ry  r  rz  r{  rN  r  r  r|  r}  r~  r  rL   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r	  r
  r  r  r  r     )r  r5  r  r  r  r  r  r  r  r  r  r  rA  rB  rC  r  r  r  r  r  r  r  r  r   r!  r"  rO  rP  r#  r$  r%  r&  r'  r(  r)  r*  r+  r,  r-  r.  r/  r0  r1  r2  r3  r4  r  r  r5  r6  r7  r8  r9  r:  r;  r<  r=  r>  r?  r@  rA  rB  rC  rD  rE  rF  rG  rH  rI  rJ  rK  rL  rM  rN  rO  rP  rQ  rR  rS  rT  rU  rV  rW  rX  rY  rZ  r[  r\  r]  r^  r_  r`  ra  rb  rc  rd  re  rf  rg  rh  r  r  r  ri  rj  rk  rl  rm  rn  ro  rp  r  r  r  rq  rr  rs  rt  ru  rv  rw  rx  ry  rz  r{  r|  r}  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r     )Wr  r5  r  r  r  r  r  r  rA  rB  rC  r  r  r  r  r  r  r  r  r   r!  r"  rO  rP  r#  r$  r%  r'  r(  r)  r*  r+  r,  r-  r.  r/  r0  r1  r2  r3  r4  r  r  r5  r6  r7  r8  r:  rV  rW  rX  r[  rd  re  r  r  r  rj  rk  rl  rm  rn  ro  rp  r  r  r  rq  rr  rs  rt  ru  rv  rw  rx  ry  rz  r{  r|  r}  r~  r  r  r  r  r  r  W   )r   ZfontTools.miscr   r   ZfontTools.misc.arrayToolsr   r   ZfontTools.misc.textToolsr   r   r   r	   r
   r   ZfontTools.ttLibr   ZfontTools.ttLib.tables.otBaser   r   ZfontTools.ttLib.tablesr   r   ior   rY   loggingrc  r   	getLoggerr   r   rU   r  	Exceptionr   r   r   objectrC   r{   r   r   r   r   r   r   r   r   r^   rf   r  r`   r   r  r)  r   r   r   r   r   r   r   rA  rC  rD  rK  rM  r   rO  rP  rQ  rX  r^  rf  rn  ro  rz  r{  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   rt  r  r   r   r  ZDictDecompilerr   r  r  r
  r  r  r  r   r   r   r  rb   r0  r/  r4   r3  r   Z_ir  r  r  r  r  r  r   r   r   r   <module>   s   

K  j1K$)	Hd42@ /=%=
""* (=,Ka3$4
A
 
"
