
    NgY!                       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mZ d dl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mZmZm Z m!Z! dd	l"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z-m.Z/m0Z0 d d
l1m2Z2m3Z3 d dl4m5Z5 d dl6m7Z7 d dl8Z8d dl9Z9d dl:m;Z; d dl<Z< e<j=        e>          Z?d Z@d ZA G d deB          ZC G d deC          ZD G d deD          ZE G d deD          ZF G d deF          ZG G d deF          ZH G d deH          ZI G d d eEeH          ZJ G d! d"eF          ZK G d# d$eF          ZL G d% d&eF          ZM G d' d(eF          ZN G d) d*eF          ZO G d+ d,eF          ZP G d- d.ePeN          ZQ G d/ d0ePeL          ZR G d1 d2ePeH          ZS G d3 d4eD          ZT G d5 d6eD          ZU G d7 d8eU          ZV G d9 d:eL          ZW G d; d<eL          ZX G d= d>eD          ZY G d? d@eY          ZZ G dA dBeY          Z[ G dC dDe[          Z\ G dE dFe[          Z] G dG dHe]          Z^ G dI dJe^          Z_ G dK dLeD          Z` G dM dNeD          Za G dO dPeC          Zb G dQ dReb          Zc G dS dTeb          Zd G dU dVed          Ze G dW dXed          Zf G dY dZeb          Zg G d[ d\ed          Zh G d] d^eeeh          Zi G d_ d`ed          Zj G da dbeF          Zk G dc ddek          Zl G de dfeC          Zm G dg dheC          Zn G di djeC          Zo G dk dleC          Zp G dm dneC          Zq G do dpeC          Zr G dq dreC          Zs G ds dteC          Zt G du dveC          Zu G dw dx          Zv G dy dzeC          Zw G d{ d|eL          Zx G d} d~eN          Zy G d dey          Z, G d dey          Z.i deMdeKdeGdeNdeLdeOdeHdeadeId eJdLe`d4eTd6eUd8eVd:eWd@eZdDe\i dFe]dHe^dJe_debdeddeedefddeldresdtetdveud|exde,de.d<eXd e5ewev          d e5ewe$          eqerecececeod d d d d d dZzdS )    )fixedToFloatfloatToFixedfloatToFixedToStrstrToFixedToFloatensureVersionIsLongversionToFixed)TupleVariation)nearestMultipleShortestReprotRound)	bytesjointobytestostrpadsafeEval)LazyList)getSearchRange   )CountReferenceFormatSwitchingBaseTableOTTableReaderOTTableWriterValueRecordFactory)lookupTypesVarCompositeGlyphAATStateTableAATState	AATActionContextualMorphActionLigatureMorphActionInsertionMorphActionMorxSubtable
ExtendModeCompositeModeNO_VARIATION_INDEX)zip_longest
accumulate)partial)SimpleNamespaceN)Optionalc                 ,    t          | t                    S N)
isinstancetuple)ts    _/var/www/html/ai-engine/env/lib/python3.11/site-packages/fontTools/ttLib/tables/otConverters.py<lambda>r0   -   s    Jq%((     c           	      4   g }i }| D ]\  }}}}}|}	|                     d          r|dk    sJ t          }
n|                    d          s|dv rt          t          t
          d|         }
nq|dk    rt          }
nc|dk    rt          }
nU|dk    rt          }
nG|d	k    rt          }
n9|d
v rt          }
n-|t          vrd|vr
|}	t          }
nt          ||t                    }
 |
||||          }|j        r|j        }n/|dv r|                    |          }n|                    |	          }|j        s||_        |dv rZ|d         |_        |j                                        D ]3}|                                D ]}t%          ||||          ||j        <   4|d	k    rP|d         |_        |d	         |_        |j                                        D ]}t%          ||||          ||j        <   |                    |           ||vs
J |            |||<   ||fS )zGiven a table spec from otData.py, build a converter object for each
    field of the table. This is called for each table in otData.py, and
    the results are assigned to the corresponding class in otTables.py.ValueFormatuint16Count)StructLength	MorphType)uint8r4   uint32SubTableExtSubTable	SubStructFeatureParams)CIDGlyphMappingGlyphCIDMapping(description)	MortChainMortSubtable	MorxChain)r:   r;   r<   r   featureParamTypes)
startswithr3   endswithComputedUInt8ComputedUShortComputedULongr:   r;   r<   r=   StructWithLengthconverterMappingStructeval
tableClassgetr   valuesTable__name__rF   defaultFeatureParamsappend)	tableSpectableNamespace
convertersconvertersByNametpnamerepeatauxdescr	tableNameconverterClassconvrP   r.   clss                  r/   buildConvertersrd   0   s    J(1 6& 6&$D&#u	??=)) 	L>>>>(NN]]7## 	Lt/L'L'L&('  	NN
 Z%NN]""(NN[  &NN_$$*NN;;;-NN)))cmm	!'!%b.:J!K!K~dFCUCCC? 	7JJ==='++B//JJ'++I66J 	)(DO;;;-m<D%,,.. S S88:: S SC5:4c5R5R$S\22S?""%34G%HD"(6(GD%-4466 O O16tVS#1N1N ..$++++T+++!%'''r1   c                       e Zd ZdZddddZd Zd Zd Zd	 Zdd
Z	d Z
d Z ej        d          Zdee         fdZdS )BaseConverterz\Base class for converter objects. Apart from the constructor, this
    is an abstract class.N rA   c                ,   || _         || _        || _        | j        r"| j        st          | j        dd          | _        || _        |                    d          p|dv | _        |                    d          p|dk    | _        |dv | _        || _	        d S )Nz<string>rO   r5   )DesignAxisRecordSizeValueRecordSize
LookupTyper7   )
ClassCountClass2Count
FeatureTagSettingsCountVarRegionCountMappingCountRegionAxisCountDesignAxisCountri   AxisValueCountrj   	AxisCountBaseGlyphRecordCountLayerRecordCountAxisIndicesList)
r\   r]   r^   compilerP   rH   isCountisLookupTypeisPropagatedrB   selfr\   r]   r^   rP   rB   s         r/   __init__zBaseConverter.__init__t   s    	8 	=DK 	=txV<<DH$}}W-- 
 :
 2
 !MM,77N4;;N  %
 
" 'r1   c                    	
 j         o|dk    }|r                                

t          u rd}|s@g }t          |          D ],}|                                         |                     -|S 
 fd} |            	t          	fdt          |          D                       }                    |
z             |S )z(Read an array of values from the reader.   Fc                  T                                     j        fd} | S )Nc                 h                         | z  z                                  i           S r+   )seekread)ifontposreader_copy
recordSizer~   s    r/   	read_itemzABaseConverter.readArray.<locals>.get_read_item.<locals>.read_item   s6    $$S1z>%9:::99[$;;;r1   copyr   )r   r   r   r   readerr   r~   s    @@r/   get_read_itemz.BaseConverter.readArray.<locals>.get_read_item   sN    $kkmmj< < < < < < < < < ! r1   c              3      K   | ]}V  d S r+    ).0r   r   s     r/   	<genexpr>z*BaseConverter.readArray.<locals>.<genexpr>   s#      99q999999r1   )lazygetRecordSizeNotImplementedrangerV   r   r   advance)r~   r   r   	tableDictcountr   lr   r   r   r   s   ```      @@r/   	readArrayzBaseConverter.readArray   s   y&UQY 	++F33J^++ 	A5\\ = =64;;<<<<H! ! ! ! ! ! ! ! &I9999E%LL99999ANN5:-...Hr1   c                 >    t          | d          r| j        S t          S )N
staticSize)hasattrr   r   r~   r   s     r/   r   zBaseConverter.getRecordSize   s"    4&& 	#?"r1   c                      t          |           )zRead a value from the reader.NotImplementedErrorr~   r   r   r   s       r/   r   zBaseConverter.read       !$'''r1   c                     	 t          |          D ]\  }}|                     |||||           d S # t          $ r}|j        |fz   |_         d }~ww xY wr+   )	enumeratewrite	Exceptionargs)r~   writerr   r   rR   r   valuees           r/   
writeArrayzBaseConverter.writeArray   sz    	%f-- > >5

64E1====> > 	 	 	Vqd]AF	s   .2 
AAAc                      t          |           )zWrite a value to the writer.r   r~   r   r   r   r   repeatIndexs         r/   r   zBaseConverter.write   r   r1   c                      t          |           )zRead a value from XML.r   r~   attrscontentr   s       r/   xmlReadzBaseConverter.xmlRead   r   r1   c                      t          |           )zWrite a value to XML.r   r~   	xmlWriterr   r   r\   r   s         r/   xmlWritezBaseConverter.xmlWrite   r   r1   zVarIndexBase\s*\+\s*(\d+)returnc                     | j                             | j                  }|sdS t          |                    d                    S )zJIf description has `VarIndexBase + {offset}`, return the offset else None.Nr   )varIndexBasePlusOffsetREsearchrB   intgroup)r~   ms     r/   getVarIndexOffsetzBaseConverter.getVarIndexOffset   s>    )001ABB 	41771::r1   r+   )rT   
__module____qualname____doc__r   r   r   r   r   r   r   r   rery   r   r)   r   r   r   r1   r/   rf   rf   p   s         '" ' ' ' ' '>  <  
( ( (  ( ( ( (( ( (( ( (  *rz*FGG8C=      r1   rf   c                   F    e Zd Zed             Zed             Zd Zd ZdS )SimpleValuec                     | S r+   r   r   s    r/   toStringzSimpleValue.toString       r1   c                     | S r+   r   r   s    r/   
fromStringzSimpleValue.fromString   r   r1   c                     |                     ||d|                     |          fgz              |                                 d S Nr   )	simpletagr   newliner   s         r/   r   zSimpleValue.xmlWrite   sI    D%GT]]55I5I+J*K"KLLLr1   c                 8    |                      |d                   S r   )r   r   s       r/   r   zSimpleValue.xmlRead   s    uW~...r1   N)rT   r   r   staticmethodr   r   r   r   r   r1   r/   r   r      sf          \   \  / / / / /r1   r   c                       e Zd ZdZd Zd ZdS )OptionalValueNc                     || j         k    r*|                    d|                     |          f           |                    ||           |                                 d S r   )DEFAULTrV   r   r   r   r   s         r/   r   zOptionalValue.xmlWrite   s`    DL  LL'4==#7#78999D%(((r1   c                 N    d|v r|                      |d                   S | j        S r   )r   r   r   s       r/   r   zOptionalValue.xmlRead   s+    e??5>222|r1   )rT   r   r   r   r   r   r   r1   r/   r   r      s7        G      r1   r   c                   $    e Zd Zed             ZdS )IntValuec                 "    t          | d          S Nr   )r   r   s    r/   r   zIntValue.fromString   s    5!}}r1   NrT   r   r   r   r   r   r1   r/   r   r      s-          \  r1   r   c                   ,    e Zd ZdZd Zd ZddZd ZdS )Long   c                 *    |                                 S r+   readLongr   s       r/   r   z	Long.read         r1   c                 ,    |                     |          S r+   )readLongArrayr~   r   r   r   r   s        r/   r   zLong.readArray      ##E***r1   Nc                 0    |                     |           d S r+   )	writeLongr   s         r/   r   z
Long.write      r1   c                 0    |                     |           d S r+   )writeLongArrayr~   r   r   r   rR   s        r/   r   zLong.writeArray
      f%%%%%r1   r+   rT   r   r   r   r   r   r   r   r   r1   r/   r   r      Z        J! ! !+ + +       & & & & &r1   r   c                   ,    e Zd ZdZd Zd ZddZd ZdS )ULongr   c                 *    |                                 S r+   	readULongr   s       r/   r   z
ULong.read      !!!r1   c                 ,    |                     |          S r+   )readULongArrayr   s        r/   r   zULong.readArray      $$U+++r1   Nc                 0    |                     |           d S r+   
writeULongr   s         r/   r   zULong.write      %     r1   c                 0    |                     |           d S r+   )writeULongArrayr   s        r/   r   zULong.writeArray      v&&&&&r1   r+   r   r   r1   r/   r   r     Z        J" " ", , ,! ! ! !' ' ' ' 'r1   r   c                   $    e Zd Zed             ZdS )Flags32c                     d| z  S )Nz0x%08Xr   r   s    r/   r   zFlags32.toString      %r1   N)rT   r   r   r   r   r   r1   r/   r  r    s-            \     r1   r  c                       e Zd ZeZdS )VarIndexN)rT   r   r   r$   r   r   r1   r/   r	  r	  $  s         GGGr1   r	  c                   ,    e Zd ZdZd Zd ZddZd ZdS )Short   c                 *    |                                 S r+   )	readShortr   s       r/   r   z
Short.read+  r   r1   c                 ,    |                     |          S r+   )readShortArrayr   s        r/   r   zShort.readArray.  r   r1   Nc                 0    |                     |           d S r+   )
writeShortr   s         r/   r   zShort.write1  r   r1   c                 0    |                     |           d S r+   )writeShortArrayr   s        r/   r   zShort.writeArray4  r  r1   r+   r   r   r1   r/   r  r  (  r  r1   r  c                   ,    e Zd ZdZd Zd ZddZd ZdS )UShortr  c                 *    |                                 S r+   
readUShortr   s       r/   r   zUShort.read;        """r1   c                 ,    |                     |          S r+   )readUShortArrayr   s        r/   r   zUShort.readArray>  s    %%e,,,r1   Nc                 0    |                     |           d S r+   writeUShortr   s         r/   r   zUShort.writeA      5!!!!!r1   c                 0    |                     |           d S r+   )writeUShortArrayr   s        r/   r   zUShort.writeArrayD  s    '''''r1   r+   r   r   r1   r/   r  r  8  sZ        J# # #- - -" " " "( ( ( ( (r1   r  c                   ,    e Zd ZdZd Zd ZddZd ZdS )Int8r   c                 *    |                                 S r+   )readInt8r   s       r/   r   z	Int8.readK  r   r1   c                 ,    |                     |          S r+   )readInt8Arrayr   s        r/   r   zInt8.readArrayN  r   r1   Nc                 0    |                     |           d S r+   )	writeInt8r   s         r/   r   z
Int8.writeQ  r   r1   c                 0    |                     |           d S r+   )writeInt8Arrayr   s        r/   r   zInt8.writeArrayT  r   r1   r+   r   r   r1   r/   r$  r$  H  r   r1   r$  c                   ,    e Zd ZdZd Zd ZddZd ZdS )UInt8r   c                 *    |                                 S r+   )	readUInt8r   s       r/   r   z
UInt8.read[  r   r1   c                 ,    |                     |          S r+   )readUInt8Arrayr   s        r/   r   zUInt8.readArray^  r   r1   Nc                 0    |                     |           d S r+   )
writeUInt8r   s         r/   r   zUInt8.writea  r   r1   c                 0    |                     |           d S r+   )writeUInt8Arrayr   s        r/   r   zUInt8.writeArrayd  r  r1   r+   r   r   r1   r/   r.  r.  X  r  r1   r.  c                        e Zd ZdZd ZddZdS )UInt24   c                 *    |                                 S r+   
readUInt24r   s       r/   r   zUInt24.readk  r  r1   Nc                 0    |                     |           d S r+   writeUInt24r   s         r/   r   zUInt24.writen  r   r1   r+   rT   r   r   r   r   r   r   r1   r/   r8  r8  h  s<        J# # #" " " " " "r1   r8  c                       e Zd Zd ZdS )ComputedIntc                 j    |0|                     |d|           |                                 d S d S )N=)commentr   r   s         r/   r   zComputedInt.xmlWrites  sG    uu5666 r1   NrT   r   r   r   r   r1   r/   rB  rB  r  s#                 r1   rB  c                       e Zd ZdS )rI   NrT   r   r   r   r1   r/   rI   rI   y          Dr1   rI   c                       e Zd ZdS )rJ   NrH  r   r1   r/   rJ   rJ   }  rI  r1   rJ   c                       e Zd ZdS )rK   NrH  r   r1   r/   rK   rK     rI  r1   rK   c                        e Zd ZdZd ZddZdS )Tagr   c                 *    |                                 S r+   )readTagr   s       r/   r   zTag.read  s    ~~r1   Nc                 0    |                     |           d S r+   )writeTagr   s         r/   r   z	Tag.write  s    r1   r+   r@  r   r1   r/   rM  rM    s<        J          r1   rM  c                   0    e Zd ZdZdZd Zd Zd ZddZdS )	GlyphIDr  Hc                 j    |                     |                    | j        | j        |                    S r+   )getGlyphNameManyr   typecoder   r   s        r/   r   zGlyphID.readArray  s3    $$T]DOUCC
 
 	
r1   c                 h    |                     |                    | j        | j                            S r+   )getGlyphName	readValuerW  r   r   s       r/   r   zGlyphID.read  s*      !1!1$-!Q!QRRRr1   c                 b    |                     | j        |                    |                     d S r+   )r   rW  getGlyphIDManyr   s        r/   r   zGlyphID.writeArray  s.    $-)<)<V)D)DEEEEEr1   Nc                 b    |                     | j        |                    |                     d S r+   )
writeValuerW  
getGlyphIDr   s         r/   r   zGlyphID.write  s,    $-)?)?@@@@@r1   r+   )	rT   r   r   r   rW  r   r   r   r   r   r1   r/   rS  rS    sk        JH
 
 

S S SF F FA A A A A Ar1   rS  c                       e Zd ZdZdZdS )	GlyphID32r   LN)rT   r   r   r   rW  r   r1   r/   ra  ra    s        JHHHr1   ra  c                       e Zd Zd ZdS )NameIDc                    |                     ||d|fgz              |r|r|                    d          }|rt|                    |          }|                    d           |r|                    |           n2|                    d           t
                              d|z             |                                 d S )Nr   r\     zmissing from name tablez"name id %d missing from name table)r   rQ   getDebugNamer   rE  logwarningr   )r~   r   r   r   r\   r   	nameTables          r/   r   zNameID.xmlWrite  s    D%GU+;*<"<=== 		NE 		N((I N --e44%%% N%%d++++%%&?@@@KK Du LMMMr1   NrF  r   r1   r/   rd  rd    s#            r1   rd  c                       e Zd Zd ZdS )	STATFlagsc                 P   |                     ||d|fgz              g }|dz  r|                    d           |dz  r|                    d           |r=|                    d           |                    d                    |                     |                                 d S )Nr   r   OlderSiblingFontAttributer  ElidableAxisValueNamerf   )r   rV   r   rE  joinr   r~   r   r   r   r\   r   flagss          r/   r   zSTATFlags.xmlWrite  s    D%GU+;*<"<===4< 	6LL45554< 	2LL0111 	/OOD!!!chhuoo...r1   NrF  r   r1   r/   rl  rl    s#        
 
 
 
 
r1   rl  c                   $    e Zd Zed             ZdS )
FloatValuec                      t          |           S r+   )floatr   s    r/   r   zFloatValue.fromString      U||r1   Nr   r   r1   r/   ru  ru    s-          \  r1   ru  c                        e Zd ZdZd ZddZdS )
DeciPointsr  c                 0    |                                 dz  S N
   r  r   s       r/   r   zDeciPoints.read  s      ""R''r1   Nc                 P    |                     t          |dz                       d S r|  )r  roundr   s         r/   r   zDeciPoints.write  s(    5,,-----r1   r+   r@  r   r1   r/   rz  rz    s<        J( ( (. . . . . .r1   rz  c                       e Zd ZeZeZeZeZd ZddZ	e
d             Ze
d             Ze
d             Ze
d             ZdS )	BaseFixedValuec                 b    |                       t          || j                                        S r+   )fromIntgetattrreaderMethodr   s       r/   r   zBaseFixedValue.read  s*    ||>GFD,=>>@@AAAr1   Nc                 h     t          || j                  |                     |                     d S r+   )r  writerMethodtoIntr   s         r/   r   zBaseFixedValue.write  s1    *)**4::e+<+<=====r1   c                 ,    t          || j                  S r+   )fi2flprecisionBitsrc   r   s     r/   r  zBaseFixedValue.fromInt      UC-...r1   c                 ,    t          || j                  S r+   )fl2fir  r  s     r/   r  zBaseFixedValue.toInt  r  r1   c                 ,    t          || j                  S r+   )str2flr  r  s     r/   r   zBaseFixedValue.fromString      eS.///r1   c                 ,    t          || j                  S r+   )fl2strr  r  s     r/   r   zBaseFixedValue.toString  r  r1   r+   )rT   r   r   r   r   r  r  r  r   r   classmethodr  r  r   r   r   r1   r/   r  r    s        J"M!L!LB B B> > > > / / [/ / / [/ 0 0 [0 0 0 [0 0 0r1   r  c                       e Zd ZdZdZdZdZdS )Fixedr      r   r   NrT   r   r   r   r  r  r  r   r1   r/   r  r    s"        JMLLLLr1   r  c                       e Zd ZdZdZdZdZdS )F2Dot14r     r  r  Nr  r   r1   r/   r  r    s"        JMLLLLr1   r  c                   |     e Zd ZdZdZe fd            Ze fd            Zed             Zed             Z	 xZ
S )Angleg        g     ?c                 \    t                                          |          | j        z   dz  S N   )superr  biasrc   r   	__class__s     r/   r  zAngle.fromInt  s%    &&1S88r1   c                 \    t                                          |dz  | j        z
            S r  )r  r  r  r  s     r/   r  zAngle.toInt
  s$    ww}}eckSX5666r1   c                 Z    t          t          |          | j        z            | j        z  S r+   )r   rw  factorr  s     r/   r   zAngle.fromString  s&     uU||cj011CJ>>r1   c                 ,    t          || j                  S r+   )r
   r  r  s     r/   r   zAngle.toString  s    *5#*===r1   )rT   r   r   r  r  r  r  r  r   r   __classcell__r  s   @r/   r  r     s         D"F9 9 9 9 [9 7 7 7 7 [7 ? ? [? > > [> > > > >r1   r  c                       e Zd ZdZdS )BiasedAngleg      ?N)rT   r   r   r  r   r1   r/   r  r    s         DDDr1   r  c                   b    e Zd ZdZd ZddZed             Zed             Zed             Z	dS )	Versionr   c                 .    |                                 }|S r+   r   )r~   r   r   r   r   s        r/   r   zVersion.read!  s    !!r1   Nc                 N    t          |          }|                    |           d S r+   )fi2ver   r   s         r/   r   zVersion.write%  s'    er1   c                      t          |           S r+   )ve2fir   s    r/   r   zVersion.fromString)  rx  r1   c                     d| z  S )N0x%08xr   r   s    r/   r   zVersion.toString-  r  r1   c                 "    t          | d          S )Nr  )r  )vs    r/   	fromFloatzVersion.fromFloat1  s    Q||r1   r+   )
rT   r   r   r   r   r   r   r   r   r  r   r1   r/   r  r    s        J            \     \    \  r1   r  c                   $    e Zd ZdZdZd ZddZdS )Char64zAn ASCII string with up to 64 characters.

    Unused character positions are filled with 0x00 bytes.
    Used in Apple AAT fonts in the `gcid` table.
    @   c                    |                     | j                  }|                    d          }|dk    r
|d |         }t          |dd          }|t          |dd          k    rt                              d|z             |S )N    r   asciireplaceencodingerrorsignorez%replaced non-ASCII characters in "%s")readDatar   findr   rh  ri  )r~   r   r   r   datazeroPosss          r/   r   zChar64.read?  s    t//))E""a<<>D$;;;dWX>>>>>KK?!CDDDr1   Nc                 f   t          |dd          }|t          |dd          k    rt                              d|z             t          |          | j        k    r$t                              d|| j        fz             |d| j        z  z   d | j                 }|                    |           d S )Nr  r  r  r  z&replacing non-ASCII characters in "%s"z$truncating overlong "%s" to %d bytesr  )r   rh  ri  lenr   	writeData)r~   r   r   r   r   r   r  s          r/   r   zChar64.writeI  s    uwyAAA7578DDDDDKK@5HIIIt99t&&KK6%9QQ   ut..0A$/0ABr1   r+   )rT   r   r   r   r   r   r   r   r1   r/   r  r  6  sH          J  	 	 	 	 	 	r1   r  c                   4    e Zd Zd Zd ZddZd Zd Zd ZdS )	rN   c                 D    | j         o| j                             |          S r+   )rP   r   r   s     r/   r   zStruct.getRecordSizeV  s    H4?#@#@#H#HHr1   c                 Z    |                                  }|                    ||           |S r+   )rP   	decompile)r~   r   r   r   tables        r/   r   zStruct.readY  s*    !!%%%r1   Nc                 2    |                     ||           d S r+   ry   r   s         r/   r   zStruct.write^  s    fd#####r1   c                     |4|r0|                     ||dgz              |                                 d S d S |                    ||||           d S )N)emptyr   )r\   )r   r   toXMLr   s         r/   r   zStruct.xmlWritea  sk    =  ##D%<.*@AAA!!#####KK	4TK:::::r1   c                 *   d|v rt          |d                   rd S |                                 }|                    d          }|t          |          |_        t          |d           }|rd}|                                D ]{}|j        rrd}t          |d          si |_        |j        }	|j	        |	vsJ |j	        |	f            t          ||j	        d            t          |j        |j	                  |	|j	        <   ||D ]6}
t          |
t                    r|
\  }}}|                    ||||           67|                    t#          |dd                      |r3|r1|                                D ]}|j        r|j        }	|	|j	        = |	s|`|S )Nr  FormatpostReadFT_propagator)
propagator)r   rP   rQ   r   r  r   getConvertersr|   r  r\   setattrr   __dict__r,   r-   fromXMLpopulateDefaultsr  )r~   r   r   r   r  r  
noPostReadcleanPropagationrb   r  elementr\   s               r/   r   zStruct.xmlReadn  s   ew 8 84!!8$$v;;EL 
333
 	V$++-- V V$ V'+$"477 .+-(!%!1J9J666J8O666E49d333,:5>49,U,UJty) 	 	G'5)) '.$eWdE7D9999'$t*L*LMMM 	1 1!//11 1 1D( 1%)%5
&ty1) 1 $ 0r1   c                 0    dt          | j                  z   S )Nz
Struct of )reprrP   )r~   s    r/   __repr__zStruct.__repr__  s    d4?3333r1   r+   )	rT   r   r   r   r   r   r   r   r  r   r1   r/   rN   rN   U  sw        I I I  
$ $ $ $; ; ;( ( (T4 4 4 4 4r1   rN   c                       e Zd Zd ZddZdS )rL   c                     |j         }|                                 }|                    ||           |                    ||j        z              |S r+   )r   rP   r  r   r6   )r~   r   r   r   r   r  s         r/   r   zStructWithLength.read  sK    j!!%%%C%,,---r1   Nc                 R   t          |                                          D ]\  }}|j        dk    r nt          |j                  |z   }t          |t                    r|dz  }dddd|j                 }	|                                }
|	|_	        |
                    ||           |                                |
z
  }|                                }|                    ||||           |j        |         dd |j                 k    sJ |                                |j        |<   d S )Nr6   r      i     >[= )r   r  r      ޭ)r   r  r\   r  itemsr,   r   r   getDataLengthr6   ry   getSubWriterr   
getAllData)r~   r   r   r   r   r   	convIndexrb   lengthIndexdeadbeefbeforelengthlengthWriters                r/   r   zStructWithLength.write  s7   ()<)<)>)>?? 	 	OItyN** +&,'')3e566 	1K:66tG%%''%fd###%%''&0**,,

<y&999|K(,?@Q$/@Q,RRRRR$0$;$;$=$=[!!!r1   r+   rT   r   r   r   r   r   r1   r/   rL   rL     s7          > > > > > >r1   rL   c                   ,    e Zd ZdZd Zd Zd ZddZdS )rS   r  c                 *    |                                 S r+   r  r   s     r/   
readOffsetzTable.readOffset  r  r1   c                 0    |                     d           d S r   r  r~   r   s     r/   writeNullOffsetzTable.writeNullOffset      1r1   c                     |                      |          }|dk    rd S |                                 }|                    |          }|j        r||_        ||_        n|                    ||           |S r   )r  rP   getSubReaderr   r   r   r  )r~   r   r   r   offsetr  s         r/   r   z
Table.read  sv    ((Q;;4!!$$V,,9 	*!ELEJJOOFD)))r1   Nc                     ||                      |           d S |                                }| j        |_        |||_        |                    || j                   |                    ||           d S )N
offsetSize)r  r  r\   r   writeSubTabler   ry   )r~   r   r   r   r   r   	subWriters          r/   r   zTable.write  s~    =  (((((++--I!YIN&(3	%  t GGGMM)T*****r1   r+   )rT   r   r   r   r  r  r   r   r   r1   r/   rS   rS     sZ        J# # #    	+ 	+ 	+ 	+ 	+ 	+r1   rS   c                       e Zd ZdZd Zd ZdS )LTabler   c                 *    |                                 S r+   r   r   s     r/   r  zLTable.readOffset  r   r1   c                 0    |                     d           d S r   r   r  s     r/   r  zLTable.writeNullOffset  s    !r1   NrT   r   r   r   r  r  r   r1   r/   r  r    s7        J" " "    r1   r  c                       e Zd ZdZd Zd ZdS )Table24r9  c                 *    |                                 S r+   r;  r   s     r/   r  zTable24.readOffset  r  r1   c                 0    |                     d           d S r   r>  r  s     r/   r  zTable24.writeNullOffset  r  r1   Nr  r   r1   r/   r  r    s7        J# # #    r1   r  c                   $     e Zd Zd Z fdZ xZS )r<   c                 v    | j         |         |         }|                     | j        | j        | j        |          S r+   r   r  r\   r]   r^   r~   	tableType
lookupTyperP   s       r/   getConverterzSubStruct.getConverter  2    %i0<
~~didh
KKKr1   c                 `    t          t          |                               |||d |           d S r+   )r  r<   r   r~   r   r   r   r\   r   r  s         r/   r   zSubStruct.xmlWrite  s/    i''	4eLLLLLr1   rT   r   r   r  r   r  r  s   @r/   r<   r<     sS        L L LM M M M M M M M Mr1   r<   c                   $     e Zd Zd Z fdZ xZS )r:   c                 v    | j         |         |         }|                     | j        | j        | j        |          S r+   r  r  s       r/   r  zSubTable.getConverter  r  r1   c                 `    t          t          |                               |||d |           d S r+   )r  r:   r   r  s         r/   r   zSubTable.xmlWrite  s/    h&&y$tUKKKKKr1   r  r  s   @r/   r:   r:     sS        L L LL L L L L L L L Lr1   r:   c                       e Zd ZddZdS )r;   Nc                 R    d|_         t                              | |||||           d S )NT)	ExtensionrS   r   r   s         r/   r   zExtSubTable.write  s,    D&$	5+FFFFFr1   r+   )rT   r   r   r   r   r1   r/   r;   r;     s.        G G G G G Gr1   r;   c                       e Zd Zd ZdS )r=   c                     | j                             || j                  }|                     | j        | j        | j        |          S r+   )rF   rQ   rU   r  r\   r]   r^   )r~   
featureTagrP   s      r/   r  zFeatureParams.getConverter
  s;    +//
D<UVV
~~didh
KKKr1   N)rT   r   r   r  r   r1   r/   r=   r=   	  s(        L L L L Lr1   r=   c                   .    e Zd ZdZddddZd ZddZdS )	r3   r  Nrg   rA   c                v    t                               | |||||           d|d         dk    rdndz   | _        d S )NrA   r3   21)rf   r   whichr}   s         r/   r   zValueFormat.__init__  sN    $Z[ 	 	
 	
 	
 #T"X__cc#F


r1   c                 \    |                                 }t          |          || j        <   |S r+   )r  r   r)  r~   r   r   r   formats        r/   r   zValueFormat.read  s,    ""$$/77tzr1   c                 ^    |                     |           t          |          || j        <   d S r+   )r  r   r)  )r~   r   r   r   r,  r   s         r/   r   zValueFormat.write  s0    6"""/77tzr1   r+   )rT   r   r   r   r   r   r   r   r1   r/   r3   r3     sb        JG" G G G G G  
8 8 8 8 8 8r1   r3   c                   .    e Zd Zd Zd ZddZd Zd ZdS )ValueRecordc                 <    dt          || j                           z  S Nr  )r  r)  r   s     r/   r   zValueRecord.getRecordSize#  s    3vdj)****r1   c                 D    || j                                      ||          S r+   )r)  readValueRecordr   s       r/   r   zValueRecord.read&  s    dj!11&$???r1   Nc                 J    || j                                      |||           d S r+   )r)  writeValueRecordr   s         r/   r   zValueRecord.write)  s'    tz++FD%@@@@@r1   c                 H    |d S |                     ||| j        |           d S r+   )r  r\   r   s         r/   r   zValueRecord.xmlWrite,  s,    =DKK	4E:::::r1   c                 V    ddl m}  |            }|                    d |||           |S )Nr   )r/  )otBaser/  r  )r~   r   r   r   r/  r   s         r/   r   zValueRecord.xmlRead2  s<    ''''''dE7D111r1   r+   )rT   r   r   r   r   r   r   r   r   r1   r/   r/  r/  "  sk        + + +@ @ @A A A A; ; ;    r1   r/  c                       e Zd ZdZdddZd ZddZed             Zd	 Z	d
 Z
d Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd ZdS )	AATLookupr}  rg   rA   c                    t                               | |||||           t          | j        t                    r|                     dd d           | _        d S t          dd d | j                  | _        d S )NrA   Value)r\   r]   r^   )r\   r]   r^   rP   )rf   r   
issubclassrP   r   	converterrS   r}   s         r/   r   zAATLookup.__init__=  s    $Z[ 	 	
 	
 	
 do{33 	!__'$D_QQDNNN"Tt  DNNNr1   c                 \   |                                 }|dk    r|                     ||          S |dk    r|                     ||          S |dk    r|                     ||          S |dk    r|                     ||          S |dk    r|                     ||          S J d|z              )Nr   r  r      r   Fzunsupported lookup format: %d)r  readFormat0readFormat2readFormat4readFormat6readFormat8r+  s        r/   r   zAATLookup.readH  s    ""$$Q;;##FD111q[[##FD111q[[##FD111q[[##FD111q[[##FD111B9FBBBBr1   Nc                 .   t          t          fd|                                D                                 }t          t          t          d |                     ||          |                     ||          |                     ||          |                     ||          g                              }|d         \  }}	}
|                                } |
             |                                |z
  }||k    sJ d|	||fz              d S )Nc                 D    g | ]\  }}                     |          |fS r   r_  )r   glyphvalr   s      r/   
<listcomp>z#AATLookup.write.<locals>.<listcomp>Y  s.    RRRjeST__U++S1RRRr1   r   z;AATLookup format %d claimed to write %d bytes, but wrote %d)	listsortedr  filterbuildFormat0buildFormat2buildFormat6buildFormat8r  )r~   r   r   r   r   r   rR   formatsdataSizelookupFormatwriteMethodr   
actualSizes     `          r/   r   zAATLookup.writeW  s;   RRRREKKMMRRRSS
 
 ))&$??))&$??))&$??))&$??	 
 

 
 /6aj+,""$$))++c1
("""HL
 
 #""""r1   c                    |                      |           |                      |           t          ||          \  }}}|                      |           |                      |           |                      |           d S )N)nitemSize)r  r   )r   numUnitsunitSizesearchRangeentrySelector
rangeShifts         r/   writeBinSearchHeaderzAATLookup.writeBinSearchHeaderw  s    8$$$8$$$1?2
 2
 2
.]J 	;'''=))):&&&&&r1   c                      t                                                    }t                    |k    rd S  j        j        }d||z  z   d fdfS )Nr  r   c                  2                                    S r+   )writeFormat0r   r~   rR   r   s   r/   r0   z(AATLookup.buildFormat0.<locals>.<lambda>      D%%fdF;; r1   )r  getGlyphOrderr>  r   )r~   r   r   rR   	numGlyphs	valueSizes   ````  r/   rO  zAATLookup.buildFormat0  sn    **,,--	v;;)##4N-		I%%;;;;;;;
 	
r1   c                 ~    |                     d           |D ]$\  }}| j                            ||d |d            %d S )Nr   r   r   r   )r  r>  r   )r~   r   r   rR   glyphID_r   s         r/   rc  zAATLookup.writeFormat0  sb    1% 	 	OHeN  Et !    	 	r1   c                 P    |d         \  }}|}g |dd          D ]5\  }}||dz   k    s||k    r                     |||f           |x}}|}3|}6                     |||f            j        j        }	t                    dz   |	dz   }}
d j        z   |
|z  z   d fdfS )Nr   r   r   r  c                  2                                    S r+   )writeFormat2)r   segmentsr~   r   s   r/   r0   z(AATLookup.buildFormat2.<locals>.<lambda>  s    D%%fdH== r1   )rV   r>  r   r  BIN_SEARCH_HEADER_SIZE)r~   r   r   rR   segStartsegValuesegEndglyphIDcurValuerh  r[  r\  ro  s   ```         @r/   rP  zAATLookup.buildFormat2  s    #AY(!' 	! 	!GX&1*$$H(<(<68 <===$++6# 684555N-	 ]]Q.	A(++h.AA=======
 	
r1   c                    |                     d           | j        j        }t          |          |dz   }}|                     |||           |D ]O\  }}}	|                     |           |                     |           | j                            ||d |	d            P|                     d           |                     d           |                    d|z             d S )Nr  r   rj    r  r  r>  r   r  r`  r   r  )
r~   r   r   ro  rh  r[  r\  
firstGlyph	lastGlyphr   s
             r/   rn  zAATLookup.writeFormat2  s   1N-	 ]]IM(!!&(H===,4 	 	(J	5y)))z***N  Et !     	6"""6"""9,-----r1   c                       j         j        }t                    |dz   }}d j        z   |dz   |z  z   d fdfS )Nr  r   r@  c                  2                                    S r+   )writeFormat6rd  s   r/   r0   z(AATLookup.buildFormat6.<locals>.<lambda>  re  r1   )r>  r   r  rp  )r~   r   r   rR   rh  r[  r\  s   ````   r/   rQ  zAATLookup.buildFormat6  s^    N-	 [[)a-(++x!|x.GG;;;;;;;
 	
r1   c                 p   |                     d           | j        j        }t          |          |dz   }}|                     |||           |D ]9\  }}|                     |           | j                            ||d |d            :|                     d           |                    d|z             d S )Nr@  r  rj  rw  r  rx  )	r~   r   r   rR   rh  r[  r\  rt  r   s	            r/   r}  zAATLookup.writeFormat6  s    1N-	 [[)a-(!!&(H===$ 	 	NGUw'''N  Et !     	6"""9,-----r1   c                      d         d         d         d         }}t                    ||z
  dz   k    rd S  j        j        }dt                    |z  z   d fdfS )Nr   r&  r   r@  r   c                  2                                    S r+   )writeFormat8rd  s   r/   r0   z(AATLookup.buildFormat8.<locals>.<lambda>  re  r1   )r  r>  r   )r~   r   r   rR   
minGlyphID
maxGlyphIDrh  s   ````   r/   rR  zAATLookup.buildFormat8  s~    !'1vbz!}J
v;;*z1A5554N-	Fi'';;;;;;;
 	
r1   c                    |d         d         }|                     d           |                     |           |                     t          |                     |D ]$\  }}| j                            ||d |d            %d S )Nr   r   rj  )r  r  r>  r   )r~   r   r   rR   firstGlyphID_r   s          r/   r  zAATLookup.writeFormat8  s    ay|1<(((3v;;''' 	 	HAuN  Et !    	 	r1   c                     t                                                    }| j                            |d |          }fdt	          |          D             S )Nr   r   c                 B    i | ]\  }}                     |          |S r   rY  )r   kr   r   s      r/   
<dictcomp>z)AATLookup.readFormat0.<locals>.<dictcomp>  s-    LLL5!!!$$eLLLr1   )r  rf  r>  r   r   )r~   r   r   rg  r  s     `  r/   rA  zAATLookup.readFormat0  sZ    **,,--	~''I'VVLLLLIdOOLLLLr1   c                    i }|j         dz
  }|                                |                                }}|d| j        j        z   k    s
J |            t	          |          D ]}|                    |||z  z   dz              |                                }|                                }	| j                            ||d           }
|dk    r.t	          |	|dz             D ]}|
||                    |          <   |S )Nr  r      r   rw  r   r   r  r>  r   r   r   r   rY  )r~   r   r   mappingr   r\  r[  r   lastfirstr   r  s               r/   rB  zAATLookup.readFormat2  s   j1n#..00&2C2C2E2E(1t~88888(888x 	: 	:AKKa(l*R/000$$&&D%%''EN'''EEEv~~udQh// : :A49GD--a0011r1   c                 p   i }|j         dz
  }|                                }|dk    s
J |            t          |                                          D ]}|                    |||z  z   dz              |                                }|                                }|                                }	|dk    r|                    d          }
|
                    ||	z              | j                            |
|d ||z
  dz             }t          |          D ] \  }}|||                    ||z             <   !|S )Nr  r@  r  rw  r   r   r  )	r   r  r   r   r   r>  r   r   rY  )r~   r   r   r  r   r\  r   r  r  r  
dataReaderr  r  r  s                 r/   rC  zAATLookup.readFormat4  sL   j1n$$&&1}}}h}}}v((**++ 	> 	>AKKa(l*R/000$$&&D%%''E&&((Fv~~#0033
f---~//D5L1<L 0   &dOO > >DAq<=GD--eai8899r1   c                    i }|j         dz
  }|                                }|d| j        j        z   k    s
J |            t	          |                                          D ]o}|                    |||z  z   dz              |                                }| j                            ||d           }|dk    r|||                    |          <   p|S )Nr  r  r  rw  r  )	r~   r   r   r  r   r\  r   rt  r   s	            r/   rD  zAATLookup.readFormat6
  s    j1n$$&&1t~88888(888v((**++ 	< 	<AKKa(l*R/000''))GN'''EEE&  6;))'223r1   c                     |                                 |                                 }| j                            |d |          }fdt          |          D             S )Nr  c                 H    i | ]\  }}                     |z             |S r   r  )r   r  r   r  r   s      r/   r  z)AATLookup.readFormat8.<locals>.<dictcomp>  s1    VVV
E!!%!),,eVVVr1   )r  r>  r   r   )r~   r   r   r   r  r  s     `  @r/   rE  zAATLookup.readFormat8  sh    !!##!!##~''E'RRVVVVViPTooVVVVr1   c                     i }|D ]H}t          |t                    r1|\  }}}|dk    r%| j                            |||          ||d         <   I|S )NLookuprI  )r,   r-   r>  r   )	r~   r   r   r   r   r  r\   a
eltContents	            r/   r   zAATLookup.xmlRead  sj     	T 	TG'5)) T&-#a8##(,(>(>q*d(S(SE!G*%r1   c           	      >   |                     ||           |                                 t          |                                          D ]'\  }}| j                            |||dd|fg           (|                    |           |                                 d S )Nr  rI  )r   r\   r   )begintagr   rM  r  r>  r   endtag)r~   r   r   r   r\   r   rI  s          r/   r   zAATLookup.xmlWrite&  s    4'''"5;;==11 	 	LE5N##4u8WeDTCU $     	r1   r+   )rT   r   r   rp  r   r   r   r   r`  rO  rc  rP  rn  rQ  r}  rR  r  rA  rB  rC  rD  rE  r   r   r   r1   r/   r:  r:  :  s_       EG 	 	 	 	 	C C C
 
 
 
@ ' ' \'	
 	
 	
  
 
 
(. . .
 
 
. . .	
 	
 	
  M M M
    (  W W W      r1   r:  c                   (    e Zd Zd ZddZd Zd ZdS )AATLookupWithDataOffsetc                    |                                 }|                                 }|                    |          }t          dd d t                    }|                    |||          }i }	|                                D ]L\  }
}|                    ||z             }|                                 }|                    ||           ||	|
<   M|	S NDataOffsets)r   r   r:  r  r   r  rP   r  )r~   r   r   r   lookupOffset
dataOffsetlookupReaderlookupoffsetsresultrI  r  r  items                 r/   r   zAATLookupWithDataOffset.read9  s    ''))%%''
**<88=$f==++lD)<<$]]__ 	! 	!ME6,,Vj-@AAJ??$$DNN:t,,, F5MMr1   Nc                    i i d}}}g }	t          ||j                  D ]}
t                      }||
                             ||           |                                }|                    |d           }|d k    r.|}|t          |          z   }|||<   |	                    |           |||
<   |                                }t          dd d t                    }|                    ||||d            |                                }|                    |d           |                    |d           |	D ]}|                    |           d S )Nr   )keyr  r   r  )rM  r_  r   ry   r  rQ   r  rV   r  r:  r  r   r  r  )r~   r   r   r   r   r   offsetByGlyphoffsetByDatadataLencompiledDatarI  r  r  r  lookupWriterr  
dataWriterds                     r/   r   zAATLookupWithDataOffset.writeG  sy    022qW|Et777 
	* 
	*E%I%L  D111''))D!%%dD11F~~ !CII-%+T"##D)))#)M%   **,,=$f==\4M4HHH((**
\a888ZA666 	$ 	$A  ####	$ 	$r1   c                 ^    t          dd d | j                  }|                    |||          S r  )r:  rP   r   )r~   r   r   r   r  s        r/   r   zAATLookupWithDataOffset.xmlReadj  s-    =$doFF~~eWd333r1   c                 f    t          dd d | j                  }|                    |||||           d S r  )r:  rP   r   )r~   r   r   r   r\   r   r  s          r/   r   z AATLookupWithDataOffset.xmlWriten  s7    =$doFF	4e<<<<<r1   r+   rT   r   r   r   r   r   r   r   r1   r/   r  r  8  sV          !$ !$ !$ !$F4 4 4= = = = =r1   r  c                       e Zd ZdddddZd e                                D             Zddd	d
Zd Zd Zd Z	d Z
ddZdS )MorxSubtableConverterLayoutOrderReversedLayoutOrderLogicalOrderReversedLogicalOrder))FF)TFFT)TTc                     i | ]\  }}||	S r   r   )r   r  rJ  s      r/   r  z MorxSubtableConverter.<dictcomp>|  s    "W"W"WS3"W"W"Wr1   Nrg   rA   c                F    t                               | |||||           d S NrA   )rf   r   r}   s         r/   r   zMorxSubtableConverter.__init__~  s6    $Z[ 	 	
 	
 	
 	
 	
r1   c                 \    |dz  dk    r	d|_         d S |dz  dk    r	d|_         d S d|_         d S )N    r   Any   Vertical
Horizontal)TextDirection)r~   rs  subtables      r/   "_setTextDirectionFromCoverageFlagsz8MorxSubtableConverter._setTextDirectionFromCoverageFlags  sJ    DLQ%*H"""dlq  %/H"""%1H"""r1   c                    |j         }t                      }|                                |_        |                                }|dz  dk    |dz  dk    f}| j        |         |_        |                     ||           |                                |_	        |xj	        |dz  dz  z  c_	        |                                |_
        |                                |_        t          d                             |j
                  }|J d|j
        z              |j         |z
  }	|j        |j         |j         |j        z   |	z
           }
t          |
          |j        |	z
  k    sJ t!          |
|j                  } |            |_        |j                            ||           |                    ||j        z              |S )	Nr  r   r     morxFz!unsupported 'morx' lookup type %s)r  tableTag)r   r!   r   r6   r0  _PROCESSING_ORDERSProcessingOrderr  r  Reservedr7   SubFeatureFlagsr   rQ   r  r  r   r  r<   r  r   )r~   r   r   r   r   r   rs  orderKeyrP   headerLengthr  	subReaders               r/   r   zMorxSubtableConverter.read  s   jNN))++  ""T\a'%$,1)<= 3H=//q999&&((
	

us{r))

&&((",,.. (,,Q[99
K=KKKK zC'{6:
Q^(Cl(RRS4yyAN\99999!tfoFFF	 jll	i...C!.()))r1   c                 H   |                     ||           |                                 |                    d|j        z             |                                 |                    d|j                   |                                 |                    d|j                   |                                 |j        dk    r3|                    dd|j        z             |                                 |                    d|j        z             |                                 |                    d	d
|j	        z             |                                 |j
                            ||           |                    |           |                                 d S )NzStructLength=%dr  r   r  r   r  z0x%04xzMorphType=%dr  r  )r  r   rE  r6   r   r  r  r  r7   r  r<   r  r  r   s         r/   r   zMorxSubtableConverter.xmlWrite  s   4'''+e.@@AAAO53FGGG-U5JKKK>Q
(U^2KLLL.5?:;;;-X@U5UVVVi...r1   c                     t                      }d}d|_        t          t          |          D ]:\  }}}|dk    rPt	          |d                   }|dz  dk    |dz  dk    f}	| j        |	         |_        |                     ||           ]|dk    r.|d         |_        |j        | j        v sJ d|j        z              |dk    r)|d         |_	        |j	        d	v sJ d
|j	        z              |dk    rt	          |d                   |_        |dk    rt	          |d                   |_
        |                    d          r|                    ||||           2J |            |dz  dz  |j        z  |_        |S )Nr   CoverageFlagsr   r  r  r  zunknown ProcessingOrder: %sr  >   r  r  r  zunknown TextDirection %sr  r  MorphFr  )r!   r  rN  istupler   r  r  r  _PROCESSING_ORDERS_REVERSEDr  r  rH   r  )
r~   r   r   r   r   covFlagseltNameeltAttrsr  r  s
             r/   r   zMorxSubtableConverter.xmlRead  s   NN
-3GW-E-E 	& 	&)GXz/))#HW$566%_2X_4JK$($;H$E!77!DDDD---$,W$5!(D,LLLL1A4EE MLLL O++"*7"3*KKKK.@ LKKK J&&%hw&788

---$,Xg->$?$?!!!!'** &		'8Z>>>>%g%%%n+aj8
r1   c                    |j         dz  dz	  }| j        |j                 \  }}||j        dk    rdndz  }||rdndz  }||j        dk    rdndz  }||rdndz  }||_        t          |j                  }	|                                }
d	|_        |j         }|j         d
z  |_         |	                    ||           ||_         |j        |	         dk    sJ |                                |
z
  }t          j        d|          |j        |	<   d S )Ni   r  r  r  r   r  r  r  r  rw  r  z>L)r  r  r  r  r  r  r  r  r6   ry   structpack)r~   r   r   r   r   r   r  reverseOrderlogicalOrderr  r  origReservedr  s                r/   r   zMorxSubtableConverter.write  s8   NZ/B6%)%E!&
"l 	E/:==DD1DL/DDa/E/588DDa?L/DDa/&&,''%%''' ~&0fd###%|K(,?????%%''&0$*Kf$=$=[!!!r1   r+   )rT   r   r   r  r  r  r   r  r   r   r   r   r   r1   r/   r  r  s  s         &,%,  #X"W<N<T<T<V<V"W"W"W
" 
 
 
 
 

2 2 2  6  (  @> > > > > >r1   r  c                   |    e Zd ZdddZd Zd Zd Zd Zd Zdd
Z	d Z
d Zd Zd Zd Zd Zd Zd Zd Zd Zd	S )	STXHeaderrg   rA   c                4   t                               | |||||           t          | j        t                    sJ t          dd d t                    | _        t          | j        t                    rt          dd d t                    | _
        d S d | _
        d S )NrA   GlyphClassesPerGlyphLookup)rf   r   r=  rP   r   r:  r  classLookupr   rS  perGlyphLookupr}   s         r/   r   zSTXHeader.__init__  s    $Z[ 	 	
 	
 	
 $/955555$^T4HHdo'<== 	'"+,<dD'"R"RD"&Dr1   c                 R   t                      }|j        }|                    d          }|                    d          }|                    d          }d }	d }
|                                |_        |                    ||                                z              |                    ||                                z              |                    ||                                z              | j        ?|                    d          }|                    ||                                z              t          | j        t                    r|                    d          }	|	                    ||                                z              |                    d          }|                    ||                                z              |                    d          }
|
                    ||                                z              |
j        |j        z
  dz  }|dk    sJ |
                    |          |_        |                     |
|          |_        nYt          | j        t                    r?|                    d          }	|	                    ||                                z              | j                            |||          |_        t%          |j        |j        z
  |j        dz  z            }t'          |          D ]u}t)                      }|j                            |           t'          |j                  D ]6}|                                }|                     ||||	          |j        |<   7v| j        |                     |||          |_        |S )Nr   r  )r   r   r   r   GlyphClassCountr   r  r=  rP   r   r  LigComponents_readLigatures	Ligaturesr    r  r   r  r   r   r   StatesrV   r  _readTransitionTransitions_readPerGlyphLookupsPerGlyphLookups)r~   r   r   r   r  r   classTableReaderstateArrayReaderentryTableReaderactionReaderligaturesReaderperGlyphTableReaderligComponentReadernumLigComponents	numStates
stateIndexstate
glyphClass
entryIndexs                      r/   r   zSTXHeader.read   s   j!..q11!..q11!..q11 & 0 0 2 2cF$4$4$6$66777cF$4$4$6$66777cF$4$4$6$66777*"("5"5a"8"8$$S6+;+;+=+=%=>>>do':;; 	8!..q11LcF$4$4$6$66777!'!4!4Q!7!7##C&*:*:*<*<$<===$11!44O  v'7'7'9'9!9::: / 36H6L LQRR#q(((("4"D"DEU"V"VE"11/4HHEOO)=>> 	8!..q11LcF$4$4$6$66777!-223CT9UU!$4$88U=RUV=VW
 
	  	** 	 	JJJEL&&&#E$9::  
-88::
040D0D$j$1 1!*--
 *$($=$=*D% %E! r1   c                     |                                  }|                    |j        ||j        z  z             }|                    |||           |S r+   )rP   r   r   r   r  )r~   r   r  r   r  
transitionentryReaders          r/   r  zSTXHeader._readTransition/  sX    __&&
))Jj&;;;
 
 	[$===r1   c                     t          |j                  }||j        z
  dz  }|                    |                    |                    S r1  )r  r  r   rV  r  )r~   r   r   limitnumLigatureGlyphss        r/   r  zSTXHeader._readLigatures7  sF    FK  "VZ/A5$$V%;%;<M%N%NOOOr1   c                    d}|j         D ]y}|j                                        D ]]}t          |t                    rF|j        dk    rt          ||j        dz             }|j        dk    rt          ||j        dz             }^z|S )Nr   rw  r   )r  r  rR   r,   r   	MarkIndexmaxCurrentIndex)r~   r  
numLookupsr   r.   s        r/   _countPerGlyphLookupszSTXHeader._countPerGlyphLookups<  s    
 
\ 	I 	IE&--// I Ia!677 I{f,,%(Q[1_%E%E
~//%(Q^a5G%H%H
I r1   c                 >   |j         }g }t          |                     |                    D ]p}|                    d          }|                    ||                                z              |                    | j                            ||i                      q|S r   )	r   r   r  r   r   r   rV   r  r   )r~   r  r   r   r   lookupsr  r  s           r/   r  zSTXHeader._readPerGlyphLookupsK  s    jt11%8899 	M 	MA!..q11LcF$4$4$6$66777NN4.33L$KKLLLLr1   Nc                    t                      }| j                            ||||j        d            t	          |                                d          }t          |j                                                  dz   }d}	| j        |	dz  }	|	| j	        j
        z  }	| j	                            ||j                  \  }
}|                     ||j        ||          \  }}|	t          |          z   }|t          |          z   }|t          |          z   }t	          |                     ||          d          }|
|t          |          z   }nd }d\  }}|                     ||          }|                     ||          }|9t          |          dk    sJ |t          |
          z   }|t          |          z   }|                    |           |                    |	           |                    |           |                    |           | j        |                    |           ||                    |           |*|                    |           |                    |           |                    |           |                    |           |                    |           |                    |           |
|                    |
           ||                    |           ||                    |           d S d S )N)r   r  r   r  r   )NNr   )r   r  r   r  r   r  r  rR   r  rP   actionHeaderSizecompileActionsr  _compileStatesr  _compilePerGlyphLookups_compileLigComponents_compileLigaturesr   r  )r~   r   r   r   r   r   glyphClassWriterglyphClassDataglyphClassCountglyphClassTableOffset
actionDataactionIndexstateArrayDataentryTableDatastateArrayOffsetentryTableOffsetperGlyphOffsetperGlyphDataactionOffsetligaturesOffsetligComponentsOffsetligComponentsDataligaturesDatas                          r/   r   zSTXHeader.writeT  s=   (??dIu/At 	 	
 	
 	
 -88::A>>e07799::Q> "*!Q&!!AA"&/"@"@u|"T"T
K)-)<)<%,*
 *
& 13~3F3FF+c..A.AA)C,?,??477tDDaHH!+c..A.AALLL/9,, 66udCC..ud;;(|$$))))".Z"@1C8I4J4JJO/***/000*+++*+++*n---#l+++*1222o...(((((((((&&&!Z((((.///$]+++++ %$r1   c           	         t                      }g i }}|D ]}t          |          D ]}	|j        |	         }
t                      }|
                    |||           |                                }t          |          |
j        k    s/J dt          |
          |
j        t          |          fz              |                    |          }|)t          |          }|||<   |	                    |           |
                    |           t          |                                d          }t          t          |          d          }||fS )Nz1%s has staticSize %d, but actually wrote %d bytesr   )r   r   r  ry   r  r  r   r  rQ   rV   r  r   r   )r~   r   statesr  r  stateArrayWriterentriesentryIDsr   r  r  entryWriter	entryDatar  r  r  s                   r/   r  zSTXHeader._compileStates  s`   (?? 	9 	9E#O44 9 9
".z:
+oo"";kBBB'2244		NNj&;;;;I$$)	NNM  <;; &\\)44
%!$WJ*4HY'NN9--- ,,Z8888#9$ -88::A>>Yw//33~--r1   c                    | j         dS |                     |          }t          |j                  |k    s!J dt          |j                  |fz              t	                      }|j        D ]K}|                                }| j                             ||i |d            |                    |d           L|                                S )Nr1   zVlen(AATStateTable.PerGlyphLookups) is %d, but the actions inside the table refer to %dr   r  )	r  r  r  r  r   r  r   r  r  )r~   r  r   r  r   r  r  s          r/   r  z!STXHeader._compilePerGlyphLookups  s    &3//66
5())Z777;5()):67 877
 + 	= 	=F!..00L%%lD"fdKKK  ! <<<<  """r1   c                     t          |d          sd S t                      }|j        D ]}|                    |           |                                S )Nr  )r   r   r  r  r  )r~   r  r   r   	components        r/   r  zSTXHeader._compileLigComponents  s]    uo.. 	4, 	* 	*Iy))))  """r1   c                     t          |d          sd S t                      }|j        D ]*}|                    |                    |                     +|                                S )Nr  )r   r   r  r  r_  r  )r~   r  r   r   	glyphNames        r/   r  zSTXHeader._compileLigatures  sh    uk** 	4 	; 	;Ity99::::  """r1   c                 >   |                     ||           |                                 |                    d|j        z             |                                 t	          |j                                                  D ]1\  }}|                    d||           |                                 2t          |j	                  D ]\  }}	|                     d|           |                                 t	          |	j
                                                  D ] \  }
}|                    ||d|
id           !|                    d           |                                 t          |j                  D ]\  }}|                     d	|           |                                 t	          |                                          D ]1\  }}|                    d
||           |                                 2|                    d	           |                                 t          |d          r|                     d           |                                 t          t          |d                    D ]1\  }}|                    d||           |                                 2|                    d           |                                 |                     |||||           |                    |           |                                 d S )NzGlyphClassCount=%s
GlyphClassrI  r   State)indexonGlyphClass
Transition)r   r   r\   r  r  r  LigComponent)r9  r   )r  r   rE  r  rM  r  r  r   r   r  r  r  r  r  r   r  _xmlWriteLigatures)r~   r   r   r   r\   r   gklassr  r   r  transr   r  rI  rJ  s                   r/   r   zSTXHeader.xmlWrite  sE   4'''.1FFGGGu17799:: 	  	 HAuAUCCC!*5<!8!8 	  	 Jwj999%+E,=,C,C,E,E%F%F  !
E):6%	      W%%%"5#899 	  	 IAv/q999$V\\^^44 $ $
s##HE#EEE!!####-...5/** 	 ///#GE?$C$CDD $ $3##N!3#GGG!!####_---	4eDDDr1   c                 l   t          |d          sd S |                    d           |                                 t          t	          |d                    D ]1\  }}|                    d||           |                                 2|                    d           |                                 d S )Nr  Ligature)r9  rI  )r   r  r   r   r  r   r  )r~   r   r   r   r\   r   r   r>  s           r/   r=  zSTXHeader._xmlWriteLigatures  s    uk** 	F;'''ge[99:: 	  	 DAq
!1===%%%r1   c                    t                      }t          t          |          D ]\  }}}|dk    r(|d         }|d         }	t          |	          |j        |<   4|dk    r2|                     |||          }
|j                            |
           l|dk    r7| j        	                    |||          }|j
                            |           |dk    r|                     |||          |_        |dk    r|                     |||          |_        t          |j                                                  dz   |_        |S )	Nr6  rI  r   r8  r  r  r  r   )r   rN  r  r   r  _xmlReadStater  rV   r  r   r  _xmlReadLigComponentsr  _xmlReadLigaturesr  r  rR   r  )r~   r   r   r   r  r  r  r  rI  r   r   r  s               r/   r   zSTXHeader.xmlRead  sZ   -3GW-E-E 	U 	U)GXz,&& ) ),4UOO"5))G##**8ZFF##E****,,,,44Xz4PP%,,V4444O++&*&@&@j$' '## K''"&"8"8:t"T"T #E$6$=$=$?$? @ @1 Dr1   c                     t                      }t          t          |          D ]W\  }}}|dk    rKt          |d                   }|                                 }	|	                    ||||           |	|j        |<   X|S )Nr;  r:  )r   rN  r  r   rP   r  r  )
r~   r   r   r   r   r  r  r  r  r  s
             r/   rD  zSTXHeader._xmlReadState  s    

-3GW-E-E 	; 	;)GXz,&&%h~&>??
!__..
""7Hj$GGG0:!*-r1   c                     g }t          t          |          D ]4\  }}}|dk    r(|                    t          |d                              5|S )Nr<  r   )rN  r  rV   r   )r~   r   r   r   ligComponentsr  r  _eltContents           r/   rE  zSTXHeader._xmlReadLigComponents  s\    .4Wg.F.F 	B 	B*GX{.(($$Xhw.?%@%@AAAr1   c                     g }t          t          |          D ]'\  }}}|dk    r|                    |d                    (|S )NrB  rI  )rN  r  rV   )r~   r   r   r   ligsr  r  rJ  s           r/   rF  zSTXHeader._xmlReadLigatures  sO    .4Wg.F.F 	/ 	/*GX{*$$HW-...r1   r+   )rT   r   r   r   r   r  r  r  r  r   r  r  r  r  r   r=  r   rD  rE  rF  r   r1   r/   r  r    s+       EG 	' 	' 	' 	' 	'- - -^  P P P
    5, 5, 5, 5,n. . .4# # # # # ## # #& & &P	 	 	  ,        r1   r  c                   (    e Zd Zd ZddZd Zd ZdS )CIDGlyphMapc                     |                                 }i }t          |                    |                    D ]#\  }}|dk    r|                    |          ||<   $|S Nrw  )r  r   r  rY  )r~   r   r   r   numCIDsr  cidrt  s           r/   r   zCIDGlyphMap.read(  si    ##%%%f&<&<W&E&EFF 	9 	9LC&  "//88sr1   Nc                    fd|                                 D             }|rt          |          dz   nd}|                    |           t          |          D ]+}|                    |                    |d                     ,d S )Nc                 B    i | ]\  }}|                     |          S r   rH  )r   rR  rI  r   s      r/   r  z%CIDGlyphMap.write.<locals>.<dictcomp>1  s+    MMMedooe,,MMMr1   r   r   rw  r  r  r  r   rQ   )	r~   r   r   r   r   r   r  r   rR  s	     `      r/   r   zCIDGlyphMap.write0  s    MMMMu{{}}MMM"'.E

QQ5!!!<< 	7 	7Cuyyf556666	7 	7r1   c                     i }t          t          |          D ]<\  }}}|dk    r0|d                                         |t          |d                   <   =|S )NCIDrI  rR  )rN  r  stripr   r~   r   r   r   r  eNameeAttrs	_eContents           r/   r   zCIDGlyphMap.xmlRead7  s^    (.w(@(@ 	J 	J$E69~~28/2G2G2I2Ixu../r1   c                 b   |                     ||           |                                 t          |                                          D ]9\  }}|2|dk    r,|                    d||           |                                 :|                    |           |                                 d S )Nrw  rW  )rR  rI  r  r   rM  r  r   r  )r~   r   r   r   r\   r   rR  rI  s           r/   r   zCIDGlyphMap.xmlWrite>  s    4''' // 	$ 	$JC Uf__##Es%#@@@!!###r1   r+   r  r   r1   r/   rN  rN  '  sU          7 7 7 7      r1   rN  c                   (    e Zd Zd ZddZd Zd ZdS )GlyphCIDMapc                    |                                 }|                                }|                    |          }|t          |          k    r,t                              d|t          |          fz             i }t          t          t          |          t          |                              D ]}||         }	|	dk    r|	|||         <   |S )NzOGlyphCIDMap has %d elements, but the font has only %d glyphs; ignoring the restrw  )rf  r  r  r  rh  ri  r   min)
r~   r   r   r   
glyphOrderr   cidsr  rt  rR  s
             r/   r   zGlyphCIDMap.readJ  s    ''))
!!##%%e,,3z??""KK$',c*oo&>?  
 STC
OO<<== 	2 	2Gw-Cf}}.1z'*+r1   Nc                    fd|                                 D             }|rt          |          dz   nd}|                    |           t          |          D ]+}|                    |                    |d                     ,d S )Nc                 R    i | ]#\  }}||dk                         |          |$S rP  rH  )r   r>  rR  r   s      r/   r  z%GlyphCIDMap.write.<locals>.<dictcomp>\  s@     
 
 
33&== OOA#0==r1   r   r   rw  rU  )	r~   r   r   r   r   r   r  r   rt  s	     `      r/   r   zGlyphCIDMap.write[  s    
 
 
 
++--
 
 

 #(.E

QQ5!!!U|| 	; 	;Guyy&99::::	; 	;r1   c                     i }t          t          |          D ]*\  }}}|dk    rt          |d                   ||d         <   +|S )NrW  r   rI  )rN  r  r   rY  s           r/   r   zGlyphCIDMap.xmlReadf  sR    (.w(@(@ 	D 	D$E69~~*26'?*C*Cvg'r1   c                 b   |                     ||           |                                 t          |                                          D ]9\  }}|2|dk    r,|                    d||           |                                 :|                    |           |                                 d S )Nrw  rW  r7  r^  )r~   r   r   r   r\   r   rI  rR  s           r/   r   zGlyphCIDMap.xmlWritem  s    4''' // 	$ 	$JE33&==##Ec#BBB!!###r1   r+   r  r   r1   r/   r`  r`  I  sU          "	; 	; 	; 	;      r1   r`  c                   (    e Zd Zd ZddZd Zd ZdS )
DeltaValuec                 X   |d         }|d         }|d         }|dv s
J d            ||z
  dz   }d|z  }d|z  }	d|z  dz
  }
d|dz
  z  }g }d\  }}t          |          D ]J}|dk    r|                                d	}}||z
  }||z	  |
z  }||z  r||	z
  }|                    |           K|S )
N	StartSizeEndSizeDeltaFormatr   r  r9  illegal DeltaFormatr   )r   r   r   r  )r   r  rV   )r~   r   r   r   rl  rm  rn  nItemsnBitsminusOffsetmasksignMaskrj  tmpshiftr   r   s                    r/   r   zDeltaValue.ready  s   k*	I&.i''')>'''9$q([ 5jU
a#

Uv 	% 	%Azz#..00"UEMEE\T)Ex ,+e$$$$r1   Nc                 X   |d         }|d         }|d         }|}	|dv s
J d            ||z
  dz   }
d|z  }t          |	          |
k    sJ d|z  dz
  }d\  }}|	D ]2}||z
  }|||z  |z  z  }|dk    r|                    |           d\  }}3|d	k    r|                    |           d S d S )
Nrl  rm  rn  ro  rp  r   )r   r  r   r  )r  r  )r~   r   r   r   r   r   rl  rm  rn  rj  rq  rr  rt  rv  rw  s                  r/   r   zDeltaValue.write  s   k*	I&.
i''')>'''9$q([ :&((((U
a
U 	# 	#EEME%$,501Czz""3'''"
UB;;s##### ;r1   c                 f    |                     ||d|fgz              |                                 d S r   r   r   r   s         r/   r   zDeltaValue.xmlWrite  =    D%GU+;*<"<===r1   c                 ,    t          |d                   S r   r   r   s       r/   r   zDeltaValue.xmlRead      g'''r1   r+   rT   r   r   r   r   r   r   r   r1   r/   rj  rj  x  sU          .$ $ $ $*  ( ( ( ( (r1   rj  c                       e Zd Zd ZddZdS )VarIdxMapValuec                    	
 |d         }|d         }d|dz  z   }d|z  dz
  	d	z
  
d|z
  d|dz  dz	  z   }|j         |j        |j        |j        d	|         }	
fd
 ||          D             S )NEntryFormatrq   r   r  l    r  0   r   r   r  r9  r   c                 ,    g | ]}|z  z  |z  z  S r   r   )r   raw	innerMask	outerMask
outerShifts     r/   rK  z'VarIdxMapValue.read.<locals>.<listcomp>  s;     
 
 
 Y:-#	/B
 
 
r1   r2  r  readUInt24Arrayr   )r~   r   r   r   fmtrq  	innerBits	entrySizer   r  r  r  s            @@@r/   r   zVarIdxMapValue.read  s    &>*v&	)^q(	*	)^
#,1,-	$%%$	
 

 	
 
 
 
 
 
 y((
 
 
 	
r1   Nc                     |d         }|}|d                              t          |                     d|dz  z   }d|z  dz
  d|z
  d|dz  dz	  z   }	|j        |j        |j        |j        d|	         }
 |
fd	|D                        d S )
Nr  rq   r   r  r  r  r   r  c                 ,    g | ]}|d z  z	  |z  z  S )l      r   )r   idxr  r  s     r/   rK  z(VarIdxMapValue.write.<locals>.<listcomp>  s<        #
2sYG  r1   )setValuer  r6  r"  writeUInt24Arrayr  )r~   r   r   r   r   r   r  r  r  r  r   r  r  s              @@r/   r   zVarIdxMapValue.write  s    &~''G555v&	)^q(	)^
#,1,-	%&&%	
 

 
 	
    "  	
 	
 	
 	
 	
r1   r+   r  r   r1   r/   r  r    s7        
 
 
,
 
 
 
 
 
r1   r  c                   (    e Zd Zd ZddZd Zd ZdS )VarDataValuec                 j   g }|d         }|d         }t          |dz            }|dz  }|r|j        |j        }	}n|j        |j        }	}t	          ||          t          ||          }}
|                     ||
                     |                     |	||
z
                       ||k    r||d = |S )Nrp   	NumShorts     )boolr   r  r(  rb  r  extend)r~   r   r   r   rR   regionCount	wordCount	longWordsreadBigArrayreadSmallArrayn1n2s               r/   r   zVarDataValue.read  s     01k*	 V+,,	&	 	W+1+?AV.LL+1+@&BV.L[),,c+y.I.IBll2&&'''nnR"W--...{||$r1   Nc                 t   |d         }|d         }t          |dz            }|dz  }|j        |j        f|j        |j        fd|         \  }	}
t	          ||          t          ||          }} |	|d |                     |
|||                    ||k    r|                    dg||z
  z             d S d S )Nrp   r  r  r  r  r   )r  r  r,  r   rb  r  writeSmallArray)r~   r   r   r   rR   r   r  r  r  writeBigArrayr  r  r  s                r/   r   zVarDataValue.write  s     01k*	 V+,,	&	 *F,AB(&*@A,
 ,
 ,(
 [),,c+y.I.IBfSbSk"""r+~.///""A3"{*:#;<<<<< r1   c                 f    |                     ||d|fgz              |                                 d S r   rz  r   s         r/   r   zVarDataValue.xmlWrite  r{  r1   c                 ,    t          |d                   S r   r}  r   s       r/   r   zVarDataValue.xmlRead  r~  r1   r+   r  r   r1   r/   r  r    sU          .= = = =&  ( ( ( ( (r1   r  c                   (    e Zd Zd ZddZd Zd ZdS )TupleValuesc                 8    t          j        d |          d         S r   )r	   decompileDeltas_)r~   r  r   s      r/   r   zTupleValues.read  s    .tT::1==r1   Nc                 D    t          t          j        |                    S r+   )bytesr	   compileDeltaValues_)r~   r   r   r   rR   r   s         r/   r   zTupleValues.write  s    ^7??@@@r1   c                 ,    t          |d                   S r   r}  r   s       r/   r   zTupleValues.xmlRead  r~  r1   c                 f    |                     ||d|fgz              |                                 d S r   rz  r   s         r/   r   zTupleValues.xmlWrite  r{  r1   r+   r  r   r1   r/   r  r    sY        > > >A A A A( ( (    r1   r  c                   <    e Zd Z	 d	dddddZd Zd	dZd Zd ZdS )
	CFF2IndexNrg   )	itemClassitemConverterClassrB   c                z    t                               | |||||           || _        |
 |            nd | _        d S r  )rf   r   
_itemClass
_converter)r~   r\   r]   r^   rP   r  r  rB   s           r/   r   zCFF2Index.__init__   sY     	$Z[ 	 	
 	
 	
 $$6$B    	r1   c                                                      dk    rg S                                 d            }j        duodk    }|s |dz             }g }|                    d          }                    |dz
             |D ]}	||	k    sJ                     |	|z
            }
 j        3                                 }|                    |
j                   |}
n" j         j        	                    |
          }
|
                    |
           |	}|S  fd} |            }t          |gz            }|S )Nr   c                 D    | j         | j        | j        | j        d|         S )Nr  r  )r   offSizes     r/   getReadArrayz$CFF2Index.read.<locals>.getReadArray9  s3    ())(	 
  r1   Fr   r   c                      	                                 	j        dz   z  z   dz
             
fd} | S )Nr   c                    	                     | z  z               d          }	                     |d         z              	                    |d         |d         z
            }
j        3
                                }|                    |	j                   |}n"
j        
j                            |          }|S )Nr  r   r   )r   r  r  r  
localStater  r   )r   r  r  objdata_posr   r  
offset_posr   r   r~   s       r/   r   z8CFF2Index.read.<locals>.get_read_item.<locals>.read_item`  s    $$Z!g+%=>>>'illG$$X
%:;;;&//
WQZ0GHHD2"oo//dD+2HIII"4#33D$??Kr1   r   )r   r  r  r   r   r   r   r  r  r   r~   s    @@@@r/   r   z%CFF2Index.read.<locals>.get_read_itemZ  s    $kkmm#Z
%g(==A(Lg>>	                      ! r1   )r   r0  r   popr  r  r  r  r  r   rV   r   )r~   r   r   r   r   r   r  r  
lastOffsetr  r  r  r   r   r   r   r  r  s   ```            @@@r/   r   zCFF2Index.read3  s     ""A::I""$$	 	 	 !L11	y%3%!) 1	i	**GE QJOOJN+++! $ $!V++++v
':;;?.//++CMM$f.?@@@DD_0?//d;;DT"""#

L! ! ! ! ! ! ! ! ! !, &I)u,--A Hr1   c                 <    |}                     t          |                     t          |          sd S  j        fd|D             }n% j         fdt	          |          D             }d |D             }t          t          |d                    }|d         }|dk     rdn|dk     rd	n	|d
k     rdnd}	                    |	           j        j	        j
        j        d|	         }
 |
|           |D ]}                    |           d S )Nc                 :    g | ]}|                               S r   r  )r   r  r   s     r/   rK  z#CFF2Index.write.<locals>.<listcomp>  s%    :::DT\\$'':::r1   c           	      R    g | ]#\  }}j                             ||          $S r   )r  r   )r   r   r  r   r~   r   r   s      r/   rK  z#CFF2Index.write.<locals>.<listcomp>  sE       At %%fdItQGG  r1   c                 ,    g | ]}t          |          S r   )r  )r   r  s     r/   rK  z#CFF2Index.write.<locals>.<listcomp>  s    ///3t99///r1   r   )initialr&     i   r  i   r9  r   r  )r   r  r  r  r   rL  r&   r4  r6  r"  r  r  r  )r~   r   r   r   rR   r   r  r  r  r  r   r  s   ````        r/   r   zCFF2Index.writew  s   #e**%%%5zz 	F?&::::E:::EE_(      (//  E
 0////z'155566R[
 E!! A 7**Z)5K5KQR 	
 	'""" %&&%	
 

 
 	
7 	# 	#DT""""	# 	#r1   c                     | j         .|                                  }|                    d |||           |S | j        | j                            |||          S t	                      r+   )r  r  r  r   r   )r~   r   r   r   r  s        r/   r   zCFF2Index.xmlRead  sd    ?&//##CKKeWd333J_(?**5'4@@@%'''r1   c           
         | j         2t          |          D ] \  }}|                    ||d|fg|           !d S | j        ;t          |          D ])\  }}| j                            |||||d|fgz              *d S t                      )Nr9  )r  r   r  r  r   r   )r~   r   r   r   r\   r   r   r  s           r/   r   zCFF2Index.xmlWrite  s    ?&$U++ B B4

9dgq\NDAAAAB B_($U++  4((tT47A,1G    
 &'''r1   r+   )rT   r   r   r   r   r   r   r   r   r1   r/   r  r    s         
 
 
 
 
 
&B B BH## ## ## ##J( ( (
( 
( 
( 
( 
(r1   r  c                       e Zd Zd ZdS )
LookupFlagc                    |                     ||d|fgz              g }|dz  r|                    d           |dz  r|                    d           |dz  r|                    d           |dz  r|                    d	           |d
z  r|                    d           |dz  r|                    d|dz	  z             |r(|                    d                    |                     |                                 d S )Nr   r   rightToLeftr  ignoreBaseGlyphsr   ignoreLigaturesr   ignoreMarksr  useMarkFilteringSeti   zmarkAttachmentType[%i]rp  )r   rV   rE  rq  r   rr  s          r/   r   zLookupFlag.xmlWrite  s*   D%GU+;*<"<===4< 	(LL'''4< 	-LL+,,,4< 	,LL*+++4< 	(LL'''4< 	0LL.///6> 	BLL1UaZ@AAA 	/chhuoo...r1   NrF  r   r1   r/   r  r    s#            r1   r  c                   N     e Zd ZeZ fdZed             Zed             Z xZ	S )
_UInt8Enumc                 p    |                      t                                          |||                    S r+   )	enumClassr  r   )r~   r   r   r   r  s       r/   r   z_UInt8Enum.read  s)    ~~eggll64CCDDDr1   c                 P    t          | j        |                                          S r+   )r  r  upperr  s     r/   r   z_UInt8Enum.fromString  s    s}ekkmm444r1   c                 Z    |                      |          j                                        S r+   )r  r\   lowerr  s     r/   r   z_UInt8Enum.toString  s#    }}U##(..000r1   )
rT   r   r   r   r  r   r  r   r   r  r  s   @r/   r  r    sx        IE E E E E 5 5 [5 1 1 [1 1 1 1 1r1   r  c                       e Zd ZeZdS )r"   N)rT   r   r   _ExtendModer  r   r1   r/   r"   r"     s        IIIr1   r"   c                       e Zd ZeZdS )r#   N)rT   r   r   _CompositeModer  r   r1   r/   r#   r#     s        IIIr1   r#   int8int16int32r8   r4   uint24r9   char64r  OffsetLOffsetOffset24	TupleList)r  VarCompositeGlyphList)r  c                 .    t          t          |           S N)rP   )r'   r:  Cs    r/   r0   r0         79;;; r1   c                 .    t          t          |           S r  )r'   r  r  s    r/   r0   r0     s    1HUV)W)W)W r1   c                 .    t          t          |           S r  )r'   r  r  s    r/   r0   r0     r  r1   c                 .    t          t          |           S r  )r'   rS   r  s    r/   r0   r0     s    '%A666 r1   c                 .    t          t          |           S r  )r'   r  r  s    r/   r0   r0     s    76a888 r1   c                 .    t          t          |           S r  )r'   r  r  s    r/   r0   r0     s    WW;;; r1   )rN  r`  rC   rD   rE   r!   r:  r  r  OffsetTo	LOffsetToLOffset24To){fontTools.misc.fixedToolsr   r  r   r  r   r  r   r  r   r  r   r  %fontTools.ttLib.tables.TupleVariationr	   fontTools.misc.roundToolsr
   r   fontTools.misc.textToolsr   r   r   r   r   fontTools.misc.lazyToolsr   fontTools.ttLibr   r8  r   r   r   r   r   otTablesr   r   r   r   r   r   r   r    r!   r"   r  r#   r  r$   	itertoolsr%   r&   	functoolsr'   typesr(   r   r  typingr)   logging	getLoggerrT   rh  r  rd   objectrf   r   r   r   r   r   r  r	  r  r  r$  r.  r8  rB  rI   rJ   rK   rM  rS  ra  rd  rl  ru  rz  r  r  r  r  r  r  r  rN   rL   rS   r  r  r<   r:   r;   r=   r3   r/  r:  r  r  r  rN  r`  rj  r  r  r  r  r  r  rM   r   r1   r/   <module>r     s                  A @ @ @ @ @ J J J J J J J J M M M M M M M M M M M M M M - - - - - - * * * * * *                                         . - - - - - - -       ! ! ! ! ! ! 				         g!!
(
(=( =( =(@e e e e eF e e eP/ / / / /- / / /"    K       {   & & & & &8 & & & ' ' ' ' 'H ' ' '          e      ! ! ! ! !}e ! ! !' ' ' ' 'H ' ' ' ( ( ( ( (X ( ( ( & & & & &8 & & & ' ' ' ' 'H ' ' ' " " " " "X " " "         (      	 	 	 	 	K 	 	 		 	 	 	 	[& 	 	 		 	 	 	 	K 	 	 	    +   A A A A Ak A A A&       
    V                  . . . . . . . .0 0 0 0 0Z 0 0 0:    N            n      > > > > >G > > >0    %       k   0    [   >D4 D4 D4 D4 D4] D4 D4 D4N> > > > >v > > >6+ + + + +F + + +D    U       e   M M M M M M M ML L L L Lu L L LG G G G G&( G G GL L L L LE L L L8 8 8 8 8( 8 8 8&    +   0t t t t t t t t|8= 8= 8= 8= 8=m 8= 8= 8=v|> |> |> |> |>M |> |> |>Bp p p p p p p pf	    -   D, , , , ,- , , ,^2( 2( 2( 2( 2( 2( 2( 2(j-
 -
 -
 -
 -
] -
 -
 -
`0( 0( 0( 0( 0(= 0( 0( 0(f       Q( Q( Q( Q( Q( Q( Q( Q(h       *1 1 1 1 1 1 1 1           J   2
D2 U2 T	2
 U2 f2 f2 e2 f2 w2 2 w2 
32 w2 2  f!2" *#2$ U%2 2& w'2( U)2* ;+2, f-2. e/20 v122 324 ;526 *728 n92: L;2< *=2> *?2@ ]A2B C2D {CCCE2F WWY:KLLLG2 2J !$!);;WW;;6688;;c2 2 2   r1   