
    +g!                    T   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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/Z0m1Z1 d d
l2m3Z3m4Z4 d dl5m6Z6 d dl7m8Z8 d dl9Z9d dl:Z:d dl;m<Z< d dl=Z= e=j|                  e?      Z@d ZAd ZB G d deC      ZD G d deD      ZE G d deE      ZF G d deE      ZG G d deG      ZH G d deG      ZI G d deI      ZJ G d d eFeI      ZK G d! d"eG      ZL G d# d$eG      ZM G d% d&eG      ZN G d' d(eG      ZO G d) d*eG      ZP G d+ d,eG      ZQ G d- d.eQeO      ZR G d/ d0eQeM      ZS G d1 d2eQeI      ZT G d3 d4eE      ZU G d5 d6eE      ZV G d7 d8eV      ZW G d9 d:eM      ZX G d; d<eM      ZY G d= d>eE      ZZ G d? d@eZ      Z[ G dA dBeZ      Z\ G dC dDe\      Z] G dE dFe\      Z^ G dG dHe^      Z_ G dI dJe_      Z` G dK dLeE      Za G dM dNeE      Zb G dO dPeD      Zc G dQ dRec      Zd G dS dTec      Ze G dU dVee      Zf G dW dXee      Zg G dY dZec      Zh G d[ d\ee      Zi G d] d^efei      Zj G d_ d`ee      Zk G da dbeG      Zl G dc ddel      Zm G de dfeD      Zn G dg dheD      Zo G di djeD      Zp G dk dleD      Zq G dm dneD      Zr G do dpeD      Zs G dq dreD      Zt G ds dteD      Zu G du dveD      Zv G dw dx      Zw G dy dzeD      Zx G d{ d|eM      Zy G d} d~eO      Zz G d dez      Z- G d dez      Z/i deNdeLdeHdeOdeMdePdeIdebdeJd eKdLead4eUd6eVd8eWd:eXd@e[dDe]i dFe^dHe_dJe`decdeedefdegddemdretdteudvevd|eyde-de/d<eYd e6exew      d e6exe%      eresedededepd d d d d d dZ{y)    )fixedToFloatfloatToFixedfloatToFixedToStrstrToFixedToFloatensureVersionIsLongversionToFixed)TupleVariation)nearestMultipleShortestReprotRound)	bytesjointobytestostrpadsafeEval)LazyList)OPTIMIZE_FONT_SPEED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    {/home/viktor/gitlab-persoonlijk/factuur-applicatie/venv/lib/python3.12/site-packages/fontTools/ttLib/tables/otConverters.py<lambda>r1   -   s    Jq%(     c           	         g }i }| D ]  \  }}}}}|}	|j                  d      r|dk(  sJ t        }
n|j                  d      s|dv rt        t        t
        d|   }
na|dk(  rt        }
nU|dk(  rt        }
nI|dk(  rt        }
n=|d	k(  rt        }
n1|d
v rt        }
n&|t        vrd|vr	|}	t        }
nt        ||t              }
 |
||||      }|j                  r|j                  }n'|dv r|j                  |      }n|j                  |	      }|j                  s||_        |dv rY|d   |_        |j                   j#                         D ]2  }|j#                         D ]  }t%        ||||      ||j&                  <    4 |d	k(  rN|d   |_        |d	   |_        |j(                  j#                         D ]  }t%        ||||      ||j&                  <    |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)uint8r5   uint32SubTableExtSubTable	SubStructFeatureParams)CIDGlyphMappingGlyphCIDMapping(description)	MortChainMortSubtable	MorxChain)r;   r<   r=   r   featureParamTypes)
startswithr4   endswithComputedUInt8ComputedUShortComputedULongr;   r<   r=   r>   StructWithLengthconverterMappingStructeval
tableClassgetr   valuesTable__name__rG   defaultFeatureParamsappend)	tableSpectableNamespace
convertersconvertersByNametpnamerepeatauxdescr	tableNameconverterClassconvrQ   r/   clss                  r0   buildConvertersre   0   s?    J(1 6&$D&#u	??=)>!>(N]]7#t/L'L&(' 	N
 Z%N]"(N[ &N_$*N;;-N))cm	!'!%b.:J!KdFCUC??J=='++B/J'++I6J(DO;;-m<D%%,,. S88: SC5:4c5R$S\\2SS ?"%34G%HD"(6(GD%--446 O16tVS#1N .O$++1T1+!%m6&n '''r2   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y)BaseConverterz\Base class for converter objects. Apart from the constructor, this
    is an abstract class.N rB   c                6   || _         || _        || _        | j                  r(| j                  st        | j                  dd      | _        || _        |j                  d      xs |dv | _        |j                  d      xs |dk(  | _        |dv | _        || _	        y )Nz<string>rP   r6   )DesignAxisRecordSizeValueRecordSize
LookupTyper8   )
ClassCountClass2Count
FeatureTagSettingsCountVarRegionCountMappingCountRegionAxisCountDesignAxisCountrj   AxisValueCountrk   	AxisCountBaseGlyphRecordCountLayerRecordCountAxisIndicesList)
r]   r^   r_   compilerQ   rI   isCountisLookupTypeisPropagatedrC   selfr]   r^   r_   rQ   rC   s         r0   __init__zBaseConverter.__init__t   s    	88DKKtxxV<DH$}}W- 
 :
 2
 !MM,7N4;;N  %
 
" 'r2   c                 `   	
 j                   xr |dkD  }|r j                        

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

64E1=> 	VVqd]AF	s   (+ 	AA

Ac                     t        |       )zWrite a value to the writer.r   r   r   r   r   r   repeatIndexs         r0   r   zBaseConverter.write   r   r2   c                     t        |       )zRead a value from XML.r   r   attrscontentr   s       r0   xmlReadzBaseConverter.xmlRead   r   r2   c                     t        |       )zWrite a value to XML.r   r   	xmlWriterr   r   r]   r   s         r0   xmlWritezBaseConverter.xmlWrite   r   r2   zVarIndexBase\s*\+\s*(\d+)returnc                     | j                   j                  | j                        }|syt        |j	                  d            S )zJIf description has `VarIndexBase + {offset}`, return the offset else None.Nr   )varIndexBasePlusOffsetREsearchrC   intgroup)r   ms     r0   getVarIndexOffsetzBaseConverter.getVarIndexOffset   s6    ))001A1AB1771:r2   r,   )rU   
__module____qualname____doc__r   r   r   r   r   r   r   r   rerz   r   r*   r   r   r   r2   r0   rg   rg   p   sZ    '" '><
((((  *rzz*FG8C= r2   rg   c                   8    e Zd Zed        Zed        Zd Zd Zy)SimpleValuec                     | S r,   r   r   s    r0   toStringzSimpleValue.toString       r2   c                     | S r,   r   r   s    r0   
fromStringzSimpleValue.fromString   r   r2   c                 r    |j                  ||d| j                  |      fgz          |j                          y Nr   )	simpletagr   newliner   s         r0   r   zSimpleValue.xmlWrite   s4    D%GT]]55I+J*K"KLr2   c                 *    | j                  |d         S r   )r   r   s       r0   r   zSimpleValue.xmlRead   s    uW~..r2   N)rU   r   r   staticmethodr   r   r   r   r   r2   r0   r   r      s2       /r2   r   c                       e Zd ZdZd Zd Zy)OptionalValueNc                     || j                   k7  r"|j                  d| j                  |      f       |j                  ||       |j	                          y r   )DEFAULTrW   r   r   r   r   s         r0   r   zOptionalValue.xmlWrite   sD    DLL LL'4==#789D%(r2   c                 J    d|v r| j                  |d         S | j                  S r   )r   r   r   s       r0   r   zOptionalValue.xmlRead   s'    e??5>22||r2   )rU   r   r   r   r   r   r   r2   r0   r   r      s    Gr2   r   c                       e Zd Zed        Zy)IntValuec                     t        | d      S Nr   )r   r   s    r0   r   zIntValue.fromString   s    5!}r2   NrU   r   r   r   r   r   r2   r0   r   r      s     r2   r   c                   *    e Zd ZdZd Zd ZddZd Zy)Long   c                 "    |j                         S r,   readLongr   s       r0   r   z	Long.read        r2   c                 $    |j                  |      S r,   )readLongArrayr   r   r   r   r   s        r0   r   zLong.readArray      ##E**r2   Nc                 &    |j                  |       y r,   )	writeLongr   s         r0   r   z
Long.write      r2   c                 &    |j                  |       y r,   )writeLongArrayr   r   r   r   rS   s        r0   r   zLong.writeArray
      f%r2   r,   rU   r   r   r   r   r   r   r   r   r2   r0   r   r          J!+ &r2   r   c                   *    e Zd ZdZd Zd ZddZd Zy)ULongr   c                 "    |j                         S r,   	readULongr   s       r0   r   z
ULong.read      !!r2   c                 $    |j                  |      S r,   )readULongArrayr   s        r0   r   zULong.readArray      $$U++r2   Nc                 &    |j                  |       y r,   
writeULongr   s         r0   r   zULong.write      % r2   c                 &    |j                  |       y r,   )writeULongArrayr   s        r0   r   zULong.writeArray      v&r2   r,   r   r   r2   r0   r   r         J",!'r2   r   c                       e Zd Zed        Zy)Flags32c                     d| z  S )Nz0x%08Xr   r   s    r0   r   zFlags32.toString      %r2   N)rU   r   r   r   r   r   r2   r0   r  r    s       r2   r  c                       e Zd ZeZy)VarIndexN)rU   r   r   r%   r   r   r2   r0   r
  r
  $  s     Gr2   r
  c                   *    e Zd ZdZd Zd ZddZd Zy)Short   c                 "    |j                         S r,   )	readShortr   s       r0   r   z
Short.read+  r   r2   c                 $    |j                  |      S r,   )readShortArrayr   s        r0   r   zShort.readArray.  r   r2   Nc                 &    |j                  |       y r,   )
writeShortr   s         r0   r   zShort.write1  r   r2   c                 &    |j                  |       y r,   )writeShortArrayr   s        r0   r   zShort.writeArray4  r  r2   r,   r   r   r2   r0   r  r  (  r  r2   r  c                   *    e Zd ZdZd Zd ZddZd Zy)UShortr  c                 "    |j                         S r,   
readUShortr   s       r0   r   zUShort.read;        ""r2   c                 $    |j                  |      S r,   )readUShortArrayr   s        r0   r   zUShort.readArray>  s    %%e,,r2   Nc                 &    |j                  |       y r,   writeUShortr   s         r0   r   zUShort.writeA      5!r2   c                 &    |j                  |       y r,   )writeUShortArrayr   s        r0   r   zUShort.writeArrayD  s    'r2   r,   r   r   r2   r0   r  r  8  s    J#-"(r2   r  c                   *    e Zd ZdZd Zd ZddZd Zy)Int8r   c                 "    |j                         S r,   )readInt8r   s       r0   r   z	Int8.readK  r   r2   c                 $    |j                  |      S r,   )readInt8Arrayr   s        r0   r   zInt8.readArrayN  r   r2   Nc                 &    |j                  |       y r,   )	writeInt8r   s         r0   r   z
Int8.writeQ  r   r2   c                 &    |j                  |       y r,   )writeInt8Arrayr   s        r0   r   zInt8.writeArrayT  r   r2   r,   r   r   r2   r0   r%  r%  H  r   r2   r%  c                   *    e Zd ZdZd Zd ZddZd Zy)UInt8r   c                 "    |j                         S r,   )	readUInt8r   s       r0   r   z
UInt8.read[  r   r2   c                 $    |j                  |      S r,   )readUInt8Arrayr   s        r0   r   zUInt8.readArray^  r   r2   Nc                 &    |j                  |       y r,   )
writeUInt8r   s         r0   r   zUInt8.writea  r   r2   c                 &    |j                  |       y r,   )writeUInt8Arrayr   s        r0   r   zUInt8.writeArrayd  r  r2   r,   r   r   r2   r0   r/  r/  X  r  r2   r/  c                       e Zd ZdZd ZddZy)UInt24   c                 "    |j                         S r,   
readUInt24r   s       r0   r   zUInt24.readk  r  r2   Nc                 &    |j                  |       y r,   writeUInt24r   s         r0   r   zUInt24.writen  r!  r2   r,   rU   r   r   r   r   r   r   r2   r0   r9  r9  h  s    J#"r2   r9  c                       e Zd Zd Zy)ComputedIntc                 V    |'|j                  |d|       |j                          y y )N=)commentr   r   s         r0   r   zComputedInt.xmlWrites  s,    u56 r2   NrU   r   r   r   r   r2   r0   rC  rC  r  s     r2   rC  c                       e Zd Zy)rJ   NrU   r   r   r   r2   r0   rJ   rJ   y      r2   rJ   c                       e Zd Zy)rK   NrI  r   r2   r0   rK   rK   }  rJ  r2   rK   c                       e Zd Zy)rL   NrI  r   r2   r0   rL   rL     rJ  r2   rL   c                       e Zd ZdZd ZddZy)Tagr   c                 "    |j                         S r,   )readTagr   s       r0   r   zTag.read  s    ~~r2   Nc                 &    |j                  |       y r,   )writeTagr   s         r0   r   z	Tag.write  s    r2   r,   rA  r   r2   r0   rN  rN    s    J r2   rN  c                   .    e Zd ZdZdZd Zd Zd ZddZy)	GlyphIDr  Hc                 n    |j                  |j                  | j                  | j                  |            S r,   )getGlyphNameManyr   typecoder   r   s        r0   r   zGlyphID.readArray  s/    $$T]]DOOUC
 	
r2   c                 l    |j                  |j                  | j                  | j                              S r,   )getGlyphName	readValuerX  r   r   s       r0   r   zGlyphID.read  s(      !1!1$--!QRRr2   c                 Z    |j                  | j                  |j                  |             y r,   )r   rX  getGlyphIDManyr   s        r0   r   zGlyphID.writeArray  s!    $--)<)<V)DEr2   Nc                 Z    |j                  | j                  |j                  |             y r,   )
writeValuerX  
getGlyphIDr   s         r0   r   zGlyphID.write  s    $--)?@r2   r,   )	rU   r   r   r   rX  r   r   r   r   r   r2   r0   rT  rT    s#    JH

SFAr2   rT  c                       e Zd ZdZdZy)	GlyphID32r   LN)rU   r   r   r   rX  r   r2   r0   rb  rb    s    JHr2   rb  c                       e Zd Zd Zy)NameIDc                 @   |j                  ||d|fgz          |rt|rr|j                  d      }|r_|j                  |      }|j                  d       |r|j	                  |       n)|j	                  d       t
        j                  d|z         |j                          y )Nr   r]     zmissing from name tablez"name id %d missing from name table)r   rR   getDebugNamer   rF  logwarningr   )r   r   r   r   r]   r   	nameTables          r0   r   zNameID.xmlWrite  s    D%GU+;*<"<=E(I --e4%%%d+%%&?@KK Du LMr2   NrG  r   r2   r0   re  re    s    r2   re  c                       e Zd Zd Zy)	STATFlagsc                    |j                  ||d|fgz          g }|dz  r|j                  d       |dz  r|j                  d       |r1|j                  d       |j                  dj	                  |             |j                          y )Nr   r   OlderSiblingFontAttributer  ElidableAxisValueNamerg   )r   rW   r   rF  joinr   r   r   r   r   r]   r   flagss          r0   r   zSTATFlags.xmlWrite  s}    D%GU+;*<"<=4<LL454<LL01OOD!chhuo.r2   NrG  r   r2   r0   rm  rm    s    
r2   rm  c                       e Zd Zed        Zy)
FloatValuec                     t        |       S r,   )floatr   s    r0   r   zFloatValue.fromString      U|r2   Nr   r   r2   r0   rv  rv    s     r2   rv  c                       e Zd ZdZd ZddZy)
DeciPointsr  c                 (    |j                         dz  S N
   r  r   s       r0   r   zDeciPoints.read  s      "R''r2   Nc                 >    |j                  t        |dz               y r}  )r   roundr   s         r0   r   zDeciPoints.write  s    5,-r2   r,   rA  r   r2   r0   r{  r{    s    J(.r2   r{  c                   j    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y)	BaseFixedValuec                 V    | j                   t        || j                                     S r,   )fromIntgetattrreaderMethodr   s       r0   r   zBaseFixedValue.read  s$    ||>GFD,=,=>@AAr2   Nc                 Z     t        || j                        | j                  |             y r,   )r  writerMethodtoIntr   s         r0   r   zBaseFixedValue.write  s"    *))*4::e+<=r2   c                 .    t        || j                        S r,   )fi2flprecisionBitsrd   r   s     r0   r  zBaseFixedValue.fromInt      UC--..r2   c                 .    t        || j                        S r,   )fl2fir  r  s     r0   r  zBaseFixedValue.toInt  r  r2   c                 .    t        || j                        S r,   )str2flr  r  s     r0   r   zBaseFixedValue.fromString      eS..//r2   c                 .    t        || j                        S r,   )fl2strr  r  s     r0   r   zBaseFixedValue.toString  r  r2   r,   )rU   r   r   r   r   r  r  r  r   r   classmethodr  r  r   r   r   r2   r0   r  r    sq    J"M!L!LB> / / / / 0 0 0 0r2   r  c                       e Zd ZdZdZdZdZy)Fixedr      r   r   NrU   r   r   r   r  r  r  r   r2   r0   r  r    s    JMLLr2   r  c                       e Zd ZdZdZdZdZy)F2Dot14r     r  r  Nr  r   r2   r0   r  r    s    JMLLr2   r  c                   d     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                 B    t         |   |      | j                  z   dz  S N   )superr  biasrd   r   	__class__s     r0   r  zAngle.fromInt  s     &1S88r2   c                 B    t         |   |dz  | j                  z
        S r  )r  r  r  r  s     r0   r  zAngle.toInt
  s    w}eckSXX566r2   c                 ^    t        t        |      | j                  z        | j                  z  S r,   )r   rx  factorr  s     r0   r   zAngle.fromString  s%     uU|cjj01CJJ>>r2   c                 .    t        || j                        S r,   )r
   r  r  s     r0   r   zAngle.toString  s    *5#**==r2   )rU   r   r   r  r  r  r  r  r   r   __classcell__r  s   @r0   r  r     s]     D"F9 9 7 7 ? ? > >r2   r  c                       e Zd ZdZy)BiasedAngleg      ?N)rU   r   r   r  r   r2   r0   r  r    s	     Dr2   r  c                   N    e Zd ZdZd ZddZed        Zed        Zed        Z	y)	Versionr   c                 &    |j                         }|S r,   r   )r   r   r   r   r   s        r0   r   zVersion.read!  s    !r2   Nc                 <    t        |      }|j                  |       y r,   )fi2ver   r   s         r0   r   zVersion.write%  s    er2   c                     t        |       S r,   )ve2fir   s    r0   r   zVersion.fromString)  ry  r2   c                     d| z  S )N0x%08xr   r   s    r0   r   zVersion.toString-  r  r2   c                     t        | d      S )Nr  )r  )vs    r0   	fromFloatzVersion.fromFloat1  s    Q|r2   r,   )
rU   r   r   r   r   r   r   r   r   r  r   r2   r0   r  r    sM    J         r2   r  c                   "    e Zd ZdZdZd ZddZy)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                  | j                        }|j                  d      }|dk\  r|d | }t        |dd      }|t        |dd      k7  rt        j                  d|z         |S )N    r   asciireplaceencodingerrorsignorez%replaced non-ASCII characters in "%s")readDatar   findr   ri  rj  )r   r   r   r   datazeroPosss          r0   r   zChar64.read?  sj    t/))E"a<>D$;dWX>>KK?!CDr2   Nc                 J   t        |dd      }|t        |dd      k7  rt        j                  d|z         t        |      | j                  kD  r$t        j                  d|| j                  fz         |d| j                  z  z   d | j                   }|j                  |       y )Nr  r  r  r  z&replacing non-ASCII characters in "%s"z$truncating overlong "%s" to %d bytesr  )r   ri  rj  lenr   	writeData)r   r   r   r   r   r   r  s          r0   r   zChar64.writeI  s    uwyA7578DDKK@5HIt9t&KK6%9QQ ut..0A$//Br2   r,   )rU   r   r   r   r   r   r   r   r2   r0   r  r  6  s     J	r2   r  c                   2    e Zd Zd Zd ZddZd Zd Zd Zy)	rO   c                 T    | j                   xr | j                   j                  |      S r,   )rQ   r   r   s     r0   r   zStruct.getRecordSizeV  s     H4??#@#@#HHr2   c                 J    | j                         }|j                  ||       |S r,   )rQ   	decompile)r   r   r   r   tables        r0   r   zStruct.readY  s!    !%r2   Nc                 (    |j                  ||       y r,   )rz   r   s         r0   r   zStruct.write^  s    fd#r2   c                     |*|r'|j                  ||dgz          |j                          y y |j                  ||||       y )N)emptyr   )r]   )r   r   toXMLr   s         r0   r   zStruct.xmlWritea  sF    = ##D%<.*@A!!#KK	4TK:r2   c                 *   d|v rt        |d         ry | j                         }|j                  d      }|t        |      |_        t        |d       }|rd}|j                         D ]  }|j                  sd}t        |d      si |_        |j                  }	|j                  |	vsJ |j                  |	f       t        ||j                  d        t        |j                  |j                        |	|j                  <    |D ]-  }
t        |
t              r|
\  }}}|j                  ||||       ./ |j!                  t#        |dd              |rBr@|j                         D ]-  }|j                  s|j                  }	|	|j                  = |	r,|`/ |S )Nr  FormatpostReadFT_propagator)
propagator)r   rQ   rR   r   r  r   getConvertersr}   r  r]   setattrr   __dict__r-   r.   fromXMLpopulateDefaultsr  )r   r   r   r   r  r  
noPostReadcleanPropagationrc   r  elementr]   s               r0   r   zStruct.xmlReadn  s   ew 8!8$v;EL 
33
$++- V$$'+$"47+-(!%!1!1J99J6OJ8OO6E499d3,:5>>499,UJtyy)V  	G'5)'.$eWdE7D9	 	'$t*LM!//1 1D((%)%5%5
&tyy1) $ 01 r2   c                 2    dt        | j                        z   S )Nz
Struct of )reprrQ   )r   s    r0   __repr__zStruct.__repr__  s    d4??333r2   r,   )	rU   r   r   r   r   r   r   r   r  r   r2   r0   rO   rO   U  s"    I
$;(T4r2   rO   c                       e Zd Zd ZddZy)rM   c                     |j                   }| j                         }|j                  ||       |j                  ||j                  z          |S r,   )r   rQ   r  r   r7   )r   r   r   r   r   r  s         r0   r   zStructWithLength.read  sA    jj!%C%,,,-r2   Nc                 $   t        |j                               D ]  \  }}|j                  dk(  s n t        |j                        z   }t        |t              r|dz  }ddddj                     }	|j                         }
|	|_	        |j                  ||       |j                         |
z
  }|j                         }|j                  ||||       |j                  |   dd |j                   k(  sJ |j                         |j                  |<   y )Nr7   r      i     >[= )r   r  r      ޭ)r   r  r]   r  itemsr-   r   r   getDataLengthr7   rz   getSubWriterr   
getAllData)r   r   r   r   r   r   	convIndexrc   lengthIndexdeadbeefbeforelengthlengthWriters                r0   r   zStructWithLength.write  s   ()<)<)>? 	OItyyN*	 &,,')3e561K:6tG%%'%fd#%%'&0**,

<y&9||K(,?@Q$//,RRRR$0$;$;$=[!r2   r,   rU   r   r   r   r   r   r2   r0   rM   rM     s    >r2   rM   c                   *    e Zd ZdZd Zd Zd ZddZy)rT   r  c                 "    |j                         S r,   r  r   s     r0   
readOffsetzTable.readOffset  r  r2   c                 &    |j                  d       y r   r  r   r   s     r0   writeNullOffsetzTable.writeNullOffset      1r2   c                     | j                  |      }|dk(  ry | j                         }|j                  |      }|j                  r||_        ||_        |S |j                  ||       |S r   )r  rQ   getSubReaderr   r   r   r  )r   r   r   r   offsetr  s         r0   r   z
Table.read  sg    (Q;!$$V,99!ELEJ  OOFD)r2   Nc                     || j                  |       y |j                         }| j                  |_        |||_        |j	                  || j
                         |j                  ||       y )N
offsetSize)r  r  r]   r   writeSubTabler   rz   )r   r   r   r   r   r   	subWriters          r0   r   zTable.write  sa    =  (++-I!YYIN&(3	%  t GMM)T*r2   r,   )rU   r   r   r   r  r  r   r   r   r2   r0   rT   rT     s    J#	+r2   rT   c                       e Zd ZdZd Zd Zy)LTabler   c                 "    |j                         S r,   r   r   s     r0   r  zLTable.readOffset  r   r2   c                 &    |j                  d       y r   r   r  s     r0   r  zLTable.writeNullOffset  s    !r2   NrU   r   r   r   r  r  r   r2   r0   r  r    s    J"r2   r  c                       e Zd ZdZd Zd Zy)Table24r:  c                 "    |j                         S r,   r<  r   s     r0   r  zTable24.readOffset  r  r2   c                 &    |j                  d       y r   r?  r  s     r0   r  zTable24.writeNullOffset  r  r2   Nr  r   r2   r0   r  r    s    J#r2   r  c                   $     e Zd Zd Z fdZ xZS )r=   c                     | j                   |   |   }| j                  | j                  | j                  | j                  |      S r,   r   r  r]   r^   r_   r   	tableType
lookupTyperQ   s       r0   getConverterzSubStruct.getConverter  8    %%i0<
~~diidhh
KKr2   c                 4    t         t        |   |||d |       y r,   )r  r=   r   r   r   r   r   r]   r   r  s         r0   r   zSubStruct.xmlWrite  s    i'	4eLr2   rU   r   r   r  r   r  r  s   @r0   r=   r=     s    LM Mr2   r=   c                   $     e Zd Zd Z fdZ xZS )r;   c                     | j                   |   |   }| j                  | j                  | j                  | j                  |      S r,   r  r  s       r0   r  zSubTable.getConverter  r  r2   c                 4    t         t        |   |||d |       y r,   )r  r;   r   r  s         r0   r   zSubTable.xmlWrite  s    h&y$tUKr2   r  r  s   @r0   r;   r;     s    LL Lr2   r;   c                       e Zd ZddZy)r<   Nc                 F    d|_         t        j                  | |||||       y )NT)	ExtensionrT   r   r   s         r0   r   zExtSubTable.write  s     D&$	5+Fr2   r,   )rU   r   r   r   r   r2   r0   r<   r<     s    Gr2   r<   c                       e Zd Zd Zy)r>   c                     | j                   j                  || j                        }| j                  | j                  | j
                  | j                  |      S r,   )rG   rR   rV   r  r]   r^   r_   )r   
featureTagrQ   s      r0   r  zFeatureParams.getConverter
  sA    ++//
D<U<UV
~~diidhh
KKr2   N)rU   r   r   r  r   r2   r0   r>   r>   	  s    Lr2   r>   c                   ,    e Zd ZdZddddZd ZddZy)	r4   r  Nrh   rB   c                r    t         j                  | |||||       d|d   dk(  r
dz   | _        y dz   | _        y )NrB   r4   21)rg   r   whichr~   s         r0   r   zValueFormat.__init__  sC    $Z[ 	 	
 #T"X_cF
#F
r2   c                 V    |j                         }t        |      || j                  <   |S r,   )r  r   r)  r   r   r   r   formats        r0   r   zValueFormat.read  s(    ""$/7tzzr2   c                 V    |j                  |       t        |      || j                  <   y r,   )r   r   r)  )r   r   r   r   r,  r   s         r0   r   zValueFormat.write  s#    6"/7tzzr2   r,   )rU   r   r   r   r   r   r   r   r2   r0   r4   r4     s    JG" G
8r2   r4   c                   ,    e Zd Zd Zd ZddZd Zd Zy)ValueRecordc                 8    dt        || j                           z  S Nr  )r  r)  r   s     r0   r   zValueRecord.getRecordSize#  s    3vdjj)***r2   c                 @    || j                      j                  ||      S r,   )r)  readValueRecordr   s       r0   r   zValueRecord.read&  s    djj!11&$??r2   Nc                 D    || j                      j                  |||       y r,   )r)  writeValueRecordr   s         r0   r   zValueRecord.write)  s    tzz++FD%@r2   c                 F    |y |j                  ||| j                  |       y r,   )r  r]   r   s         r0   r   zValueRecord.xmlWrite,  s     =KK	4E:r2   c                 H    ddl m}  |       }|j                  d |||       |S )Nr   )r/  )otBaser/  r  )r   r   r   r   r/  r   s         r0   r   zValueRecord.xmlRead2  s#    'dE7D1r2   r,   )rU   r   r   r   r   r   r   r   r   r2   r0   r/  r/  "  s    +@A;r2   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y)	AATLookupr~  rh   rB   c                    t         j                  | |||||       t        | j                  t              r| j                  dd d       | _        y t        dd d | j                        | _        y )NrB   Value)r]   r^   r_   )r]   r^   r_   rQ   )rg   r   
issubclassrQ   r   	converterrT   r~   s         r0   r   zAATLookup.__init__=  sa    $Z[ 	 	
 doo{3!__'$D_QDN"TtDNr2   c                    |j                         }|dk(  r| j                  ||      S |dk(  r| j                  ||      S |dk(  r| j                  ||      S |dk(  r| j	                  ||      S |dk(  r| j                  ||      S J d|z         )Nr   r  r      r   zunsupported lookup format: %d)r  readFormat0readFormat2readFormat4readFormat6readFormat8r+  s        r0   r   zAATLookup.readH  s    ""$Q;##FD11q[##FD11q[##FD11q[##FD11q[##FD11B9FBB5r2   Nc                    t        t        |j                         D cg c]  \  }}|j                  |      |f c}}            }t        t        t	        d | j                  |||      | j                  |||      | j                  |||      | j                  |||      g                  }	|	d   \  }
}}|j                         } |        |j                         |z
  }||
k(  sJ d||
|fz         y c c}}w )Nr   z;AATLookup format %d claimed to write %d bytes, but wrote %d)
listsortedr  r`  filterbuildFormat0buildFormat2buildFormat6buildFormat8r  )r   r   r   r   r   r   glyphvalrS   formatsdataSizelookupFormatwriteMethodr   
actualSizes                  r0   r   zAATLookup.writeW  s   EKKMRjeST__U+S1RS
 ))&$?))&$?))&$?))&$?	

 /6aj+,""$))+c1
("	
HL
 
	
"/ Ss   C3c                     | j                  |       | j                  |       t        ||      \  }}}| j                  |       | j                  |       | j                  |       y )N)nitemSize)r   r   )r   numUnitsunitSizesearchRangeentrySelector
rangeShifts         r0   writeBinSearchHeaderzAATLookup.writeBinSearchHeaderw  s`    8$8$1?2
.]J 	;'=):&r2   c                      t        j                               }t              |k7  ry  j                  j                  }d||z  z   d fdfS )Nr  r   c                  *    j                         S r,   )writeFormat0r   r   rS   r   s   r0   r1   z(AATLookup.buildFormat0.<locals>.<lambda>      D%%fdF; r2   )r  getGlyphOrderr>  r   )r   r   r   rS   	numGlyphs	valueSizes   ````  r0   rJ  zAATLookup.buildFormat0  sQ    **,-	v;)#NN--		I%%;
 	
r2   c                 z    |j                  d       |D ]%  \  }}| j                  j                  ||d |d        ' y )Nr   r   r   r   )r   r>  r   )r   r   r   rS   glyphID_r   s         r0   r`  zAATLookup.writeFormat0  sE    1% 	OHeNN  Et ! 	r2   c                 F    |d   \  }}|}g |dd  D ]/  \  }}||dz   k7  s||k7  rj                  |||f       |x}}|}.|}1 j                  |||f        j                  j                  }	t              dz   |	dz   }}
d j                  z   |
|z  z   d fdfS )Nr   r   r   r  c                  *    j                         S r,   )writeFormat2)r   segmentsr   r   s   r0   r1   z(AATLookup.buildFormat2.<locals>.<lambda>  s    D%%fdH= r2   )rW   r>  r   r  BIN_SEARCH_HEADER_SIZE)r   r   r   rS   segStartsegValuesegEndglyphIDcurValuere  rX  rY  rl  s   ```         @r0   rK  zAATLookup.buildFormat2  s    #AY(!' 	!GX&1*$H(<68 <=$++6# 	! 	6845NN--	 ]Q.	A(+++h.AA=
 	
r2   c                    |j                  d       | j                  j                  }t        |      |dz   }}| j	                  |||       |D ]H  \  }}}	|j                  |       |j                  |       | j                  j                  ||d |	d        J |j                  d       |j                  d       |j                  d|z         y )Nr  r   rg    r  r   r>  r   r  r]  r   r  )
r   r   r   rl  re  rX  rY  
firstGlyph	lastGlyphr   s
             r0   rk  zAATLookup.writeFormat2  s    1NN--	 ]IM(!!&(H=,4 	(J	5y)z*NN  Et ! 	 	6"6"9,-r2   c                       j                   j                  }t              |dz   }}d j                  z   |dz   |z  z   d fdfS )Nr  r   r@  c                  *    j                         S r,   )writeFormat6ra  s   r0   r1   z(AATLookup.buildFormat6.<locals>.<lambda>  rb  r2   )r>  r   r  rm  )r   r   r   rS   re  rX  rY  s   ````   r0   rL  zAATLookup.buildFormat6  sO    NN--	 [)a-(+++x!|x.GG;
 	
r2   c                 X   |j                  d       | j                  j                  }t        |      |dz   }}| j	                  |||       |D ]6  \  }}|j                  |       | j                  j                  ||d |d        8 |j                  d       |j                  d|z         y )Nr@  r  rg  rt  r  ru  )	r   r   r   rS   re  rX  rY  rq  r   s	            r0   rz  zAATLookup.writeFormat6  s    1NN--	 [)a-(!!&(H=$ 	NGUw'NN  Et ! 	
 	6"9,-r2   c                      d   d   d   d   }}t              ||z
  dz   k7  ry  j                  j                  }dt              |z  z   d fdfS )Nr   r&  r   r@  r   c                  *    j                         S r,   )writeFormat8ra  s   r0   r1   z(AATLookup.buildFormat8.<locals>.<lambda>  rb  r2   )r  r>  r   )r   r   r   rS   
minGlyphID
maxGlyphIDre  s   ````   r0   rM  zAATLookup.buildFormat8  se    !'1vbz!}J
v;*z1A55NN--	Fi'';
 	
r2   c                     |d   d   }|j                  d       |j                  |       |j                  t        |             |D ]%  \  }}| j                  j                  ||d |d        ' y )Nr   r   rg  )r   r  r>  r   )r   r   r   rS   firstGlyphID_r   s          r0   r~  zAATLookup.writeFormat8  sr    ay|1<(3v;' 	HAuNN  Et ! 	r2   c                     t        |j                               }| j                  j                  ||d |      }t	        |      D ci c]  \  }}|j                  |      | c}}S c c}}w Nr   r   )r  rc  r>  r   r   rZ  )r   r   r   rd  r  kr   s          r0   rA  zAATLookup.readFormat0  s^    **,-	~~''I'V<EdOL5!!!$e+LLLs   A'c                    i }|j                   dz
  }|j                         |j                         }}|d| j                  j                  z   k\  sJ |       t	        |      D ]  }|j                  |||z  z   dz          |j                         }|j                         }	| j                  j                  ||d       }
|dk7  sat	        |	|dz         D ]  }|
||j                  |      <     |S )Nr  r      r   rt  r   r   r  r>  r   r   r   r   rZ  )r   r   r   mappingr   rY  rX  r   lastfirstr   r  s               r0   rB  zAATLookup.readFormat2  s    jj1n#..0&2C2C2E(1t~~8888B(B8x 	:AKKa(l*R/0$$&D%%'ENN'''EEv~udQh/ :A49GD--a01:	: r2   c                 $   i }|j                   dz
  }|j                         }|dk\  sJ |       t        |j                               D ]  }|j                  |||z  z   dz          |j                         }|j                         }|j                         }	|dk7  sS|j	                  d      }
|
j                  ||	z          | j
                  j                  |
|d ||z
  dz         }t        |      D ]  \  }}|||j                  ||z         <     |S )Nr  r@  r  rt  r   r   r  )	r   r  r   r   r   r>  r   r   rZ  )r   r   r   r  r   rY  r   r  r  r  
dataReaderr  r  r  s                 r0   rC  zAATLookup.readFormat4  s   jj1n$$&1}&h&}v((*+ 	>AKKa(l*R/0$$&D%%'E&&(Fv~#003
f-~~//D5L1<L 0  &dO >DAq<=GD--eai89>	> r2   c                    i }|j                   dz
  }|j                         }|d| j                  j                  z   k\  sJ |       t	        |j                               D ]d  }|j                  |||z  z   dz          |j                         }| j                  j                  ||d       }|dk7  sQ|||j                  |      <   f |S )Nr  r  r  rt  r  )	r   r   r   r  r   rY  r   rq  r   s	            r0   rD  zAATLookup.readFormat6
  s    jj1n$$&1t~~8888B(B8v((*+ 	<AKKa(l*R/0'')GNN'''EE& 6;))'23	< r2   c                     |j                         }|j                         }| j                  j                  ||d |      }t        |      D ci c]  \  }}|j	                  ||z         | c}}S c c}}w r  )r  r>  r   r   rZ  )r   r   r   r  r   r  r  r   s           r0   rE  zAATLookup.readFormat8  sl    !!#!!#~~''E'RFOPToV
E!!%!),e3VVVs   A1c                     i }|D ]B  }t        |t              s|\  }}}|dk(  s | j                  j                  |||      ||d   <   D |S )NLookuprN  )r-   r.   r>  r   )	r   r   r   r   r   r  r]   a
eltContents	            r0   r   zAATLookup.xmlRead  s^     	TG'5)&-#a8#(,(>(>q*d(SE!G*%		T
 r2   c           	         |j                  ||       |j                          t        |j                               D ](  \  }}| j                  j                  |||dd|fg       * |j                  |       |j                          y )Nr  rN  )r   r]   r   )begintagr   rH  r  r>  r   endtag)r   r   r   r   r]   r   rN  s          r0   r   zAATLookup.xmlWrite&  s    4'"5;;=1 	LE5NN##4u8WeDTCU $ 	 	r2   r,   )rU   r   r   rm  r   r   r   r   r]  rJ  r`  rK  rk  rL  rz  rM  r~  rA  rB  rC  rD  rE  r   r   r   r2   r0   r:  r:  :  s}    EG 	C
@ ' '	

(.
.	
M
(Wr2   r:  c                   &    e Zd Zd ZddZd Zd Zy)AATLookupWithDataOffsetc                 \   |j                         }|j                         }|j                  |      }t        dd d t              }|j	                  |||      }i }	|j                         D ]@  \  }
}|j                  ||z         }| j                         }|j                  ||       ||	|
<   B |	S NDataOffsets)r   r   r:  r  r   r  rQ   r  )r   r   r   r   lookupOffset
dataOffsetlookupReaderlookupoffsetsresultrN  r  r  items                 r0   r   zAATLookupWithDataOffset.read9  s    '')%%'
**<8=$f=++lD)<$]]_ 	!ME6,,Vj-@AJ??$DNN:t, F5M		!
 r2   Nc                 8   i i d}}}g }	t        ||j                        D ]s  }
t               }||
   j                  ||       |j	                         }|j                  |d       }|d k(  r&|}|t        |      z   }|||<   |	j                  |       |||
<   u |j                         }t        dd d t              }|j                  ||||d        |j                         }|j                  |d       |j                  |d       |	D ]  }|j                  |        y )Nr   )keyr  r   r  )rH  r`  r   rz   r  rR   r  rW   r  r:  r  r   r  r  )r   r   r   r   r   r   offsetByGlyphoffsetByDatadataLencompiledDatarN  r  r  r  lookupWriterr  
dataWriterds                     r0   r   zAATLookupWithDataOffset.writeG  s,    022qW|Et7 
	*E%I%L  D1'')D!%%dD1F~ !CI-%+T"##D)#)M% 
	* **,=$f=\4M4H((*
\a8ZA6 	$A  #	$r2   c                 X    t        dd d | j                        }|j                  |||      S r  )r:  rQ   r   )r   r   r   r   r  s        r0   r   zAATLookupWithDataOffset.xmlReadj  s)    =$dooF~~eWd33r2   c                 ^    t        dd d | j                        }|j                  |||||       y r  )r:  rQ   r   )r   r   r   r   r]   r   r  s          r0   r   z AATLookupWithDataOffset.xmlWriten  s*    =$dooF	4e<r2   r,   rU   r   r   r   r   r   r   r   r2   r0   r  r  8  s    !$F4=r2   r  c                       e Zd ZdddddZej	                         D  ci c]  \  }}||
 c}}} Zdddd	Zd
 Zd Zd Z	d Z
ddZyc c}}} w )MorxSubtableConverterLayoutOrderReversedLayoutOrderLogicalOrderReversedLogicalOrder))FF)TFFT)TTNrh   rB   c                :    t         j                  | |||||       y NrB   )rg   r   r~   s         r0   r   zMorxSubtableConverter.__init__~  s"    $Z[ 	 	
r2   c                 R    |dz  dk7  rd|_         y |dz  dk7  rd|_         y d|_         y )N    r   Any   Vertical
Horizontal)TextDirection)r   rt  subtables      r0   "_setTextDirectionFromCoverageFlagsz8MorxSubtableConverter._setTextDirectionFromCoverageFlags  s2    DLQ%*H"dlq %/H"%1H"r2   c                    |j                   }t               }|j                         |_        |j	                         }|dz  dk7  |dz  dk7  f}| j
                  |   |_        | j                  ||       |j                         |_	        |xj                  |dz  dz  z  c_	        |j	                         |_
        |j                         |_        t        d   j                  |j                        }|J d|j                  z         |j                   |z
  }	|j                  |j                   |j                   |j                  z   |	z
   }
t        |
      |j                  |	z
  k(  sJ t!        |
|j"                        } |       |_        |j$                  j'                  ||       |j)                  ||j                  z          |S )Nr  r   r     morxz!unsupported 'morx' lookup type %s)r  tableTag)r   r"   r   r7   r1  _PROCESSING_ORDERSProcessingOrderr  r  Reservedr8   SubFeatureFlagsr   rR   r  r  r   r  r=   r  r   )r   r   r   r   r   r   rt  orderKeyrQ   headerLengthr  	subReaders               r0   r   zMorxSubtableConverter.read  s   jjN))+  "T\a'%$,1)<= 33H=//q9&&(
	

us{r))
&&(",,. (,,Q[[9
K=KK5 zzC'{{6::

Q^^(Cl(RS4yANN\9999!tfooF	 l	i.C!..()r2   c                    |j                  ||       |j                          |j                  d|j                  z         |j                          |j	                  d|j
                         |j                          |j	                  d|j                         |j                          |j                  dk7  r0|j	                  dd|j                  z         |j                          |j                  d|j                  z         |j                          |j	                  d	d
|j                  z         |j                          |j                  j                  ||       |j                  |       |j                          y )NzStructLength=%dr  r   r  r   r  z0x%04xzMorphType=%dr  r  )r  r   rF  r7   r   r  r  r  r8   r  r=   r  r  r   s         r0   r   zMorxSubtableConverter.xmlWrite  s?   4'+e.@.@@AO53F3FG-U5J5JK>>Q
(U^^2KL.5??:;-X@U@U5UVi.r2   c                    t               }d}d|_        t        t        |      D ]  \  }}}|dk(  rEt	        |d         }|dz  dk7  |dz  dk7  f}	| j
                  |	   |_        | j                  ||       R|dk(  r7|d   |_        |j                  | j                  v rzJ d|j                  z         |dk(  r-|d   |_	        |j                  d	v rJ d
|j                  z         |dk(  rt	        |d         |_        |dk(  rt	        |d         |_
        |j                  d      r|j                  ||||       J |        |dz  dz  |j                  z  |_        |S )Nr   CoverageFlagsr   r  r  r  zunknown ProcessingOrder: %sr  >   r  r  r  zunknown TextDirection %sr  r  Morphr  )r"   r  rI  istupler   r  r  r  _PROCESSING_ORDERS_REVERSEDr  r  rI   r  )
r   r   r   r   r   covFlagseltNameeltAttrsr  r  s
             r0   r   zMorxSubtableConverter.xmlRead  s   N
-3GW-E 	&)GXz/)#HW$56%_2X_4JK$($;$;H$E!77!D--$,W$5!((D,L,LL 1A4E4EEL O+"*7"3*KK .@K J&%hw&78
--$,Xg->$?!!!'*		'8Z>%g%u1	&2 n+ajj8
r2   c                 H   |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                        }	|j                         }
d	|_        |j                   }|j                   d
z  |_         |j                  ||       ||_         |j                  |	   dk(  sJ |j                         |
z
  }t        j                  d|      |j                  |	<   y )Ni   r  r  r  r   r  r  r  r  rt  r  z>L)r  r  r  r  r  r  r  r  r7   rz   structpack)r   r   r   r   r   r   r  reverseOrderlogicalOrderr  r  origReservedr  s                r0   r   zMorxSubtableConverter.write  s#   NNZ/B6%)%E%E!!&
"l 	E//:=D1DLDa/E//58Da?LDa/&&,,'%%'' ~~&0fd#%||K(,????%%'&0$*KKf$=[!r2   r,   )rU   r   r   r  r  r  r   r  r   r   r   r   )r   r  rO  s   000r0   r  r  s  sm     &,%, =O<T<T<V"W"WS38"W
" 

26(@>} #Xs   A
r  c                   z    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y	)	STXHeaderrh   rB   c                   t         j                  | |||||       t        | j                  t              sJ t        dd d t              | _        t        | j                  t              rt        dd d t              | _
        y d | _
        y )NrB   GlyphClassesPerGlyphLookup)rg   r   r=  rQ   r   r:  r  classLookupr   rT  perGlyphLookupr~   s         r0   r   zSTXHeader.__init__  sv    $Z[ 	 	
 $//9555$^T4Hdoo'<="+,<dD'"RD"&Dr2   c                    t               }|j                  }|j                  d      }|j                  d      }|j                  d      }d }	d }
|j                         |_        |j                  ||j                         z          |j                  ||j                         z          |j                  ||j                         z          | j                  3|j                  d      }|j                  ||j                         z          t        | j                  t              r|j                  d      }	|	j                  ||j                         z          |j                  d      }|j                  ||j                         z          |j                  d      }
|
j                  ||j                         z          |
j                  |j                  z
  dz  }|dk\  sJ |j                  |      |_        | j                  |
|      |_        nMt        | j                  t              r3|j                  d      }	|	j                  ||j                         z          | j                  j!                  |||      |_        t%        |j                  |j                  z
  |j                  dz  z        }t'        |      D ]r  }t)               }|j*                  j-                  |       t'        |j                        D ]3  }|j/                         }| j1                  ||||	      |j2                  |<   5 t | j                  | j5                  ||      |_        |S )Nr   r  )r   r   r   r   GlyphClassCountr   r  r=  rQ   r    r  LigComponents_readLigatures	Ligaturesr!   r  r   r  r   r   r   StatesrW   r  _readTransitionTransitions_readPerGlyphLookupsPerGlyphLookups)r   r   r   r   r  r   classTableReaderstateArrayReaderentryTableReaderactionReaderligaturesReaderperGlyphTableReaderligComponentReadernumLigComponents	numStates
stateIndexstate
glyphClass
entryIndexs                      r0   r   zSTXHeader.read   s	   jj!..q1!..q1!..q1 & 0 0 2cF$4$4$667cF$4$4$667cF$4$4$667*"("5"5a"8$$S6+;+;+=%=>doo':;!..q1LcF$4$4$667!'!4!4Q!7##C&*:*:*<$<=$11!4O  v'7'7'9!9: / 3 36H6L6L LQRR#q((("4"D"DEU"VE"11/4HEO)=>!..q1LcF$4$4$667!--223CT9U!!$4$8$88U=R=RUV=VW
	  	* 	JJELL&#E$9$9: 
-88:
040D0D$j$1!!*-	 *$($=$=*D%E! r2   c                     | j                         }|j                  |j                  ||j                  z  z         }|j	                  |||       |S r,   )rQ   r   r   r   r  )r   r   r  r   r  
transitionentryReaders          r0   r  zSTXHeader._readTransition/  sO    __&
))JJj&;&;;;
 	[$=r2   c                     t        |j                        }||j                  z
  dz  }|j                  |j	                  |            S r1  )r  r  r   rW  r  )r   r   r   limitnumLigatureGlyphss        r0   r  zSTXHeader._readLigatures7  sA    FKK "VZZ/A5$$V%;%;<M%NOOr2   c                 .   d}|j                   D ]  }|j                  j                         D ]d  }t        |t              s|j
                  dk7  rt        ||j
                  dz         }|j                  dk7  sLt        ||j                  dz         }f  |S )Nr   rt  r   )r  r  rS   r-   r   	MarkIndexmaxCurrentIndex)r   r  
numLookupsr  r/   s        r0   _countPerGlyphLookupszSTXHeader._countPerGlyphLookups<  s    
 
\\ 	IE&&--/ Ia!67{{f,%(Q[[1_%E
~~/%(Q^^a5G%H
I	I r2   c                    |j                   }g }t        | j                  |            D ]a  }|j                  d      }|j	                  ||j                         z          |j                  | j                  j                  ||i              c |S r   )	r   r   r  r   r   r   rW   r  r   )r   r  r   r   r   lookupsr  r  s           r0   r  zSTXHeader._readPerGlyphLookupsK  s    jjt11%89 	MA!..q1LcF$4$4$667NN4..33L$KL	M r2   Nc                 d   t               }| j                  j                  ||||j                  d        t	        |j                         d      }t        |j                  j                               dz   }d}	| j                  |	dz  }	|	| j                  j                  z  }	| j                  j                  ||j                        \  }
}| j                  ||j                  ||      \  }}|	t        |      z   }|t        |      z   }|t        |      z   }t	        | j                  ||      d      }|
|t        |      z   }nd }d\  }}| j!                  ||      }| j#                  ||      }|,t        |      dk(  sJ |t        |
      z   }|t        |      z   }|j%                  |       |j%                  |	       |j%                  |       |j%                  |       | j                  |j%                  |       ||j%                  |       |"|j%                  |       |j%                  |       |j'                  |       |j'                  |       |j'                  |       |j'                  |       |
|j'                  |
       ||j'                  |       ||j'                  |       y y )N)r   r  r   r  r   )NNr   )r   r  r   r  r   r  r  rS   r  rQ   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                          r0   r   zSTXHeader.writeT  s   (?dIu/A/At 	 	
 -88:A>e00779:Q> "*!Q&!!A!AA"&//"@"@u||"T
K)-)<)<%,,*
& 13~3FF+c..AA)C,??477tDaH!+c..AALL/9,, 66udC..ud;(|$)))".Z"@1C8I4JJO/*/0*+*+*n-#l+*12o.(((&!Z((./$]+ %r2   c           	      6   t               }g i }}|D ]  }t        |      D ]  }	|j                  |	   }
t               }|
j                  |||       |j	                         }t        |      |
j                  k(  s)J dt        |
      |
j                  t        |      fz         |j                  |      }|!t        |      }|||<   |j                  |       |j                  |         t        |j	                         d      }t        t        |      d      }||fS )Nz1%s has staticSize %d, but actually wrote %d bytesr   )r   r   r  rz   r  r  r   r  rR   rW   r   r   r   )r   r   statesr  r  stateArrayWriterentriesentryIDsr  r  r  entryWriter	entryDatar  r  r  s                   r0   r  zSTXHeader._compileStates  s)   (? 	9E#O4 9
"..z:
+o"";kB'224		Nj&;&;;I$))	NM ; &\\)4
%!$WJ*4HY'NN9- ,,Z8#9	9& -88:A>Yw/3~--r2   c                    | j                   y| j                  |      }t        |j                        |k(  sJ dt        |j                        |fz         t	               }|j                  D ]D  }|j                         }| j                   j                  ||i |d        |j                  |d       F |j                         S )Nr2   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          r0   r  z!STXHeader._compilePerGlyphLookups  s    &//6
5(()Z7 	
;5(():67	
7
 ++ 	=F!..0L%%lD"fdK  ! <	=   ""r2   c                     t        |d      sy t               }|j                  D ]  }|j                  |        |j	                         S )Nr  )r   r   r  r   r  )r   r  r   r   	components        r0   r  zSTXHeader._compileLigComponents  sH    uo.,, 	*Iy)	*  ""r2   c                     t        |d      sy t               }|j                  D ]"  }|j                  |j	                  |             $ |j                         S )Nr  )r   r   r  r   r`  r  )r   r  r   r   	glyphNames        r0   r  zSTXHeader._compileLigatures  sO    uk* 	;Ity9:	;  ""r2   c                 ^   |j                  ||       |j                          |j                  d|j                  z         |j                          t	        |j
                  j                               D ])  \  }}|j                  d||       |j                          + t        |j                        D ]  \  }}	|j                  d|       |j                          t	        |	j                  j                               D ]  \  }
}|j                  ||d|
id        |j                  d       |j                           t        |j                        D ]  \  }}|j                  d	|       |j                          t	        |j                               D ])  \  }}|j                  d
||       |j                          + |j                  d	       |j                           t        |d      r|j                  d       |j                          t        t        |d            D ])  \  }}|j                  d||       |j                          + |j                  d       |j                          | j!                  |||||       |j                  |       |j                          y )NzGlyphClassCount=%s
GlyphClassrN  r   State)indexonGlyphClass
Transition)r   r   r]   r  r  r  LigComponent)r2  r   )r  r   rF  r  rH  r  r  r   r   r  r  r  r  r  r   r  _xmlWriteLigatures)r   r   r   r   r]   r   gklassr  r  r  transr   r  rN  rO  s                   r0   r   zSTXHeader.xmlWrite  s~   4'.1F1FFGu11779: 	 HAuAUC	  "+5<<!8 	 Jwj9%+E,=,=,C,C,E%F !
E):6%	   W%	  #5#8#89 	 IAv/q9$V\\^4 $
s##HE#E!!#$ -.	  5/*/#GE?$CD $3##N!3#G!!#$ _-	4eDr2   c                 $   t        |d      sy |j                  d       |j                          t        t	        |d            D ])  \  }}|j                  d||       |j                          + |j                  d       |j                          y )Nr  Ligature)r2  rN  )r   r  r   r   r  r   r  )r   r   r   r   r]   r   r   r7  s           r0   r6  zSTXHeader._xmlWriteLigatures  s    uk*;'ge[9: 	 DAq
!1=	  	%r2   c                 N   t               }t        t        |      D ]  \  }}}|dk(  r#|d   }|d   }	t        |	      |j                  |<   /|dk(  r/| j                  |||      }
|j                  j                  |
       c|dk(  r9| j                  j                  |||      }|j                  j                  |       |dk(  r| j                  |||      |_        |dk(  s| j                  |||      |_         t        |j                  j!                               dz   |_        |S )	Nr/  rN  r   r1  r  r  r  r   )r   rI  r  r   r  _xmlReadStater  rW   r  r   r  _xmlReadLigComponentsr  _xmlReadLigaturesr  r  rS   r  )r   r   r   r   r  r  r  r  rN  r   r  r  s               r0   r   zSTXHeader.xmlRead  s'   -3GW-E 	U)GXz,& ) ),4UO""5)G#**8ZF##E*,,,,44Xz4P%%,,V4O+&*&@&@j$'# K'"&"8"8:t"T!	U" !$E$6$6$=$=$? @1 Dr2   c                     t               }t        t        |      D ]M  \  }}}|dk(  st        |d         }| j	                         }	|	j                  ||||       |	|j                  |<   O |S )Nr4  r3  )r   rI  r  r   rQ   r  r  )
r   r   r   r   r  r  r  r  r  r  s
             r0   r=  zSTXHeader._xmlReadState  st    
-3GW-E 	;)GXz,&%h~&>?
!__.
""7Hj$G0:!!*-	; r2   c                     g }t        t        |      D ])  \  }}}|dk(  s|j                  t        |d                + |S )Nr5  r   )rI  r  rW   r   )r   r   r   r   ligComponentsr  r  _eltContents           r0   r>  zSTXHeader._xmlReadLigComponents  sN    .4Wg.F 	B*GX{.($$Xhw.?%@A	B r2   c                 p    g }t        t        |      D ]   \  }}}|dk(  s|j                  |d          " |S )Nr;  rN  )rI  r  rW   )r   r   r   r   ligsr  r  rC  s           r0   r?  zSTXHeader._xmlReadLigatures  sD    .4Wg.F 	/*GX{*$HW-.	/ r2   r,   )rU   r   r   r   r   r  r  r  r  r   r  r  r  r  r   r6  r   r=  r>  r?  r   r2   r0   r  r    s^    EG 	'-^P
5,n.4# ##&P	,r2   r  c                   &    e Zd Zd ZddZd Zd Zy)CIDGlyphMapc                     |j                         }i }t        |j                  |            D ]  \  }}|dk7  s|j                  |      ||<   ! |S )Nrt  )r  r   r  rZ  )r   r   r   r   numCIDsr  cidrq  s           r0   r   zCIDGlyphMap.read(  s[    ##%%f&<&<W&EF 	9LC& "//8s	9 r2   Nc                    |j                         D ci c]  \  }}||j                  |       }}}|rt        |      dz   nd}	|j                  |	       t	        |	      D ]#  }|j                  |j                  |d             % y c c}}w )Nr   r   rt  r  r`  r  r   r   rR   )
r   r   r   r   r   r   rJ  rN  r  r   s
             r0   r   zCIDGlyphMap.write0  s~    ?D{{}Medooe,,MM"'E
QQ5!< 	7Cuyyf56	7 Ns   Bc                     i }t        t        |      D ].  \  }}}|dk(  s|d   j                         |t        |d         <   0 |S )NCIDrN  rJ  )rI  r  stripr   r   r   r   r   r  eNameeAttrs	_eContents           r0   r   zCIDGlyphMap.xmlRead7  sT    (.w(@ 	J$E69~28/2G2G2Ixu./	J r2   c                 &   |j                  ||       |j                          t        |j                               D ]2  \  }}|	|dk7  s|j	                  d||       |j                          4 |j                  |       |j                          y )Nrt  rN  )rJ  rN  r  r   rH  r  r   r  )r   r   r   r   r]   r   rJ  rN  s           r0   r   zCIDGlyphMap.xmlWrite>  s    4' / 	$JC Uf_##Es%#@!!#	$ 	r2   r,   r  r   r2   r0   rG  rG  '  s    7r2   rG  c                   &    e Zd Zd ZddZd Zd Zy)GlyphCIDMapc                 L   |j                         }|j                         }|j                  |      }|t        |      kD  r#t        j                  d|t        |      fz         i }t        t        t        |      t        |                  D ]  }||   }	|	dk7  s|	|||   <    |S )NzOGlyphCIDMap has %d elements, but the font has only %d glyphs; ignoring the restrt  )rc  r  r  r  ri  rj  r   min)
r   r   r   r   
glyphOrderr   cidsr  rq  rJ  s
             r0   r   zGlyphCIDMap.readJ  s    '')
!!#%%e,3z?"KK$',c*o&>?
 STC
O<= 	2Gw-Cf}.1z'*+	2 r2   Nc                 *   |j                         D ci c]  \  }}||dk7  r|j                  |      |  }}}|rt        |      dz   nd}	|j                  |	       t	        |	      D ]#  }
|j                  |j                  |
d             % y c c}}w )Nrt  r   r   rL  )r   r   r   r   r   r   r7  rJ  r  r   rq  s              r0   r   zGlyphCIDMap.write[  s      ++-
33&= OOA#
 

 #(E
QQ5!U| 	;Guyy&9:	;
s   #Bc                 p    i }t        t        |      D ]   \  }}}|dk(  st        |d         ||d   <   " |S )NrN  r   rN  )rI  r  r   rP  s           r0   r   zGlyphCIDMap.xmlReadf  sK    (.w(@ 	D$E69~*26'?*Cvg'	D r2   c                 &   |j                  ||       |j                          t        |j                               D ]2  \  }}|	|dk7  s|j	                  d||       |j                          4 |j                  |       |j                          y )Nrt  rN  r0  rU  )r   r   r   r   r]   r   rN  rJ  s           r0   r   zGlyphCIDMap.xmlWritem  s    4' / 	$JE33&=##Ec#B!!#	$ 	r2   r,   r  r   r2   r0   rW  rW  I  s    "	;r2   rW  c                   &    e Zd Zd ZddZd Zd Zy)
DeltaValuec                 *   |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 ]A  }|dk(  r|j                         d	}}||z
  }||z	  |
z  }||z  r||	z
  }|j                  |       C |S )
N	StartSizeEndSizeDeltaFormatr   r  r:  illegal DeltaFormatr   )r   r   r   r  )r   r  rW   )r   r   r   r   rb  rc  rd  nItemsnBitsminusOffsetmasksignMaskr`  tmpshiftr   r   s                    r0   r   zDeltaValue.ready  s    k*	I&.i'>)>>'9$q([ 5jU
a#

Uv 	%Az#..0"UEMEE\T)Ex+e$	% r2   Nc                 $   |d   }|d   }|d   }|}	|dv sJ d       ||z
  dz   }
d|z  }t        |	      |
k(  sJ d|z  dz
  }d\  }}|	D ].  }||z
  }|||z  |z  z  }|dk(  s|j                  |       d\  }}0 |d	k7  r|j                  |       y y )
Nrb  rc  rd  re  rf  r   )r   r  r   r  )r  r   )r   r   r   r   r   r   rb  rc  rd  r`  rg  rh  rj  rl  rm  s                  r0   r   zDeltaValue.write  s    k*	I&.
i'>)>>'9$q([ :&(((U
a
U 	#EEME%$,501Cz""3'"
U	# B;s# r2   c                 T    |j                  ||d|fgz          |j                          y r   r   r   r   s         r0   r   zDeltaValue.xmlWrite  +    D%GU+;*<"<=r2   c                     t        |d         S r   r   r   s       r0   r   zDeltaValue.xmlRead      g''r2   r,   rU   r   r   r   r   r   r   r   r2   r0   r`  r`  x  s    .$*(r2   r`  c                       e Zd Zd ZddZy)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	|
   } ||      D cg c]  }||z  |	z  ||z  z   c}S c c}w )
NEntryFormatrr   r   r  l    r  0   r   r   r  r:  r   r3  r  readUInt24Arrayr   )r   r   r   r   fmtrg  	innerBits	innerMask	outerMask
outerShift	entrySizer   raws                r0   r   zVarIdxMapValue.read  s    &>*v&	)^q(	*	)^
#,1,-	$$%%%%$$	

 	 !(
 Y:-#	/B
 	
 
s   ,BNc                 >   |d   }|}|d   j                  t        |             d|dz  z   }d|z  dz
  }	d|z
  }
d|dz  dz	  z   }|j                  |j                  |j                  |j
                  d|   } ||D cg c]  }|d	z  |
z	  ||	z  z   c}       y c c}w )
Nry  rr   r   r  r  rz  r   r{  l      )setValuer  r7  r#  writeUInt24Arrayr  )r   r   r   r   r   r   r~  r  r  r  r  r  r   idxs                 r0   r   zVarIdxMapValue.write  s    &~''G5v&	)^q(	)^
#,1,-	%%&&&&%%	

 
 	 # #
2sYG	
s   =Br,   r  r   r2   r0   rw  rw    s    
,
r2   rw  c                   &    e Zd Zd ZddZd Zd Zy)VarDataValuec                 P   g }|d   }|d   }t        |dz        }|dz  }|r|j                  |j                  }	}n|j                  |j                  }	}t	        ||      t        ||      }}
|j                   ||
             |j                   |	||
z
               ||kD  r||d = |S )Nrq   	NumShorts     )boolr   r  r)  rY  r  extend)r   r   r   r   rS   regionCount	wordCount	longWordsreadBigArrayreadSmallArrayn1n2s               r0   r   zVarDataValue.read  s     01k*	 V+,	&	+1+?+?AVAV.L+1+@+@&BVBV.L[),c+y.IBl2&'nR"W-.{|$r2   Nc                 D   |d   }|d   }t        |dz        }|dz  }|j                  |j                  f|j                  |j                  fd|   \  }	}
t	        ||      t        ||      }} |	|d |         |
|||        ||kD  r|j                  dg||z
  z         y y )Nrq   r  r  r  r  r   )r  r  r-  r   rY  r  writeSmallArray)r   r   r   r   rS   r   r  r  r  writeBigArrayr  r  r  s                r0   r   zVarDataValue.write  s     01k*	 V+,	&	 **F,A,AB((&*@*@A,
 ,(
 [),c+y.IBfSbk"r+./""A3"{*:#;< r2   c                 T    |j                  ||d|fgz          |j                          y r   rp  r   s         r0   r   zVarDataValue.xmlWrite  rq  r2   c                     t        |d         S r   rs  r   s       r0   r   zVarDataValue.xmlRead  rt  r2   r,   ru  r   r2   r0   r  r    s    .=&(r2   r  c                   &    e Zd Zd ZddZd Zd Zy)TupleValuesc                 4    t        j                  d |      d   S r   )r	   decompileDeltas_)r   r  r   s      r0   r   zTupleValues.read  s    ..tT:1==r2   Nc                 j    |j                   t           }t        t        j                  ||             S )N)optimizeSize)cfgr   bytesr	   compileDeltaValues_)r   r   r   r   rS   r   optimizeSpeeds          r0   r   zTupleValues.write  s1    !45..vDUV
 	
r2   c                     t        |d         S r   rs  r   s       r0   r   zTupleValues.xmlRead  rt  r2   c                 T    |j                  ||d|fgz          |j                          y r   rp  r   s         r0   r   zTupleValues.xmlWrite  rq  r2   r,   r  r   r2   r0   r  r    s    >
(r2   r  c                   :    e Zd Z	 d	dddddZd Zd	dZd Zd Zy)
	CFF2IndexNrh   )	itemClassitemConverterClassrC   c                t    t         j                  | |||||       || _        | |       | _        y d | _        y r  )rg   r   
_itemClass
_converter)r   r]   r^   r_   rQ   r  r  rC   s           r0   r   zCFF2Index.__init__#  sJ     	$Z[ 	 	
 $$6$B  	HL 	r2   c                     j                         dk(  rg S j                         d        }j                  duxr dkD  }|s |dz         }g }|j                  d      }j	                  |dz
         |D ]  }	||	k  sJ j	                  |	|z
        }
 j
                  0 j                         }|j                  |
j                         |}
n( j                   j                  j                  |
      }
|j                  |
       |	} |S  fd} |       }t        |gz        }|S )Nr   c                 f    | j                   | j                  | j                  | j                  d|   S )Nr{  r|  )r   offSizes     r0   getReadArrayz$CFF2Index.read.<locals>.getReadArray<  s:    (())))((	
  r2   Fr   r   c                      	j                         	j                  dz   z  z   dz
         
fd} | S )Nr   c                 r   	j                  | z  z           d      }	j                  |d   z          	j                  |d   |d   z
        }
j                  1
j                         }|j                  |	j                         |}|S 
j
                  
j
                  j                  |      }|S )Nr  r   r   )r   r  r  r  
localStater  r   )r   r  r  objdata_posr   r  
offset_posr   r   r   s       r0   r   z8CFF2Index.read.<locals>.get_read_item.<locals>.read_itemc  s    $$Z!g+%=>'lG$$X
%:;&//
WQZ0GHD2"oo/dD+2H2HI"  K 4#33D$?Kr2   r   )r   r  r  r   r   r   r   r  r  r   r   s    @@@@r0   r   z%CFF2Index.read.<locals>.get_read_item]  sM    $kkm#ZZ
%g(==A(g>	    ! r2   )r   r1  r   popr  r  r  r  r  r   rW   r   )r   r   r   r   r   r   r  r  
lastOffsetr  r  r  r   r   r   r   r  r  s   ```            @@@r0   r   zCFF2Index.read6  sL     "A:I""$	 !1	yy%3%!)	*GE QJOOJN+! $!V+++v
':;??.//+CMM$f.?.?@D__0??//d;DT"#
$ L! !, &I)u,-A Hr2   c                    |}|j                  t        |             t        |      sy | j                  |D cg c]  }|j                  |       }}nF| j                  :t        |      D cg c]$  \  }}| j                  j                  |||||      & }}}|D cg c]  }t        |       }	}t        t        |	d            }	|	d   }
|
dk  rdn|
dk  rdn|
dk  rdnd	}|j                  |       |j                  |j                  |j                  |j                  d
|   } ||	       |D ]  }|j                  |        y c c}w c c}}w c c}w )Nr   )initialr&     i   r  i   r:  r   r{  )r   r  r  rz   r  r   r   rG  r'   r5  r7  r#  r  r  r  )r   r   r   r   rS   r   r  r  r   r  r  r  r   s                r0   r   zCFF2Index.writez  sl   #e*%5z??&49:DT\\$':E:__(  )/At %%fdItQGE 
 *//3t9//z'156R[
 E!  7*Z)5KQR 	
 	'" %%&&&&%%	

 
 	7 	#DT"	#5 ;
 0s   E.)EEc                     | j                   &| j                         }|j                  d |||       |S | j                  | j                  j                  |||      S t	               r,   )r  r  r  r   r   )r   r   r   r   r  s        r0   r   zCFF2Index.xmlRead  s[    ??&//#CKKeWd3J__(??**5'4@@%''r2   c           
         | j                   +t        |      D ]  \  }}|j                  ||d|fg|        y | j                  9t        |      D ]*  \  }}| j                  j	                  |||||d|fgz          , y t               )Nr2  )r  r   r  r  r   r   )r   r   r   r   r]   r   r   r  s           r0   r   zCFF2Index.xmlWrite  s    ??&$U+ B4

9dgq\NDAB__($U+ 4((tT47A,1G
 &''r2   r,   )rU   r   r   r   r   r   r   r   r   r2   r0   r  r  "  s3     
 
&BH##J(
(r2   r  c                       e Zd Zd Zy)
LookupFlagc                    |j                  ||d|fgz          g }|dz  r|j                  d       |dz  r|j                  d       |dz  r|j                  d       |dz  r|j                  d	       |d
z  r|j                  d       |dz  r|j                  d|dz	  z         |r |j                  dj                  |             |j	                          y )Nr   r   rightToLeftr  ignoreBaseGlyphsr   ignoreLigaturesr   ignoreMarksr  useMarkFilteringSeti   zmarkAttachmentType[%i]rq  )r   rW   rF  rr  r   rs  s          r0   r   zLookupFlag.xmlWrite  s    D%GU+;*<"<=4<LL'4<LL+,4<LL*+4<LL'4<LL./6>LL1UaZ@Achhuo.r2   NrG  r   r2   r0   r  r    s    r2   r  c                   B     e Zd ZeZ fdZed        Zed        Z xZ	S )
_UInt8Enumc                 D    | j                  t        | 	  |||            S r,   )	enumClassr  r   )r   r   r   r   r  s       r0   r   z_UInt8Enum.read  s    ~~egl64CDDr2   c                 J    t        | j                  |j                               S r,   )r  r  upperr  s     r0   r   z_UInt8Enum.fromString  s    s}}ekkm44r2   c                 T    | j                  |      j                  j                         S r,   )r  r]   lowerr  s     r0   r   z_UInt8Enum.toString  s     }}U#((..00r2   )
rU   r   r   r   r  r   r  r   r   r  r  s   @r0   r  r    s6    IE 5 5 1 1r2   r  c                       e Zd ZeZy)r#   N)rU   r   r   _ExtendModer  r   r2   r0   r#   r#     s    Ir2   r#   c                       e Zd ZeZy)r$   N)rU   r   r   _CompositeModer  r   r2   r0   r$   r$     s    Ir2   r$   int8int16int32r9   r5   uint24r:   char64r  OffsetLOffsetOffset24	TupleList)r  VarCompositeGlyphList)r  c                 $    t        t        |       S N)rQ   )r(   r:  Cs    r0   r1   r1         79; r2   c                 $    t        t        |       S r  )r(   r  r  s    r0   r1   r1     s    1HUV)W r2   c                 $    t        t        |       S r  )r(   r  r  s    r0   r1   r1     r  r2   c                 $    t        t        |       S r  )r(   rT   r  s    r0   r1   r1     s    '%A6 r2   c                 $    t        t        |       S r  )r(   r  r  s    r0   r1   r1     s    76a8 r2   c                 $    t        t        |       S r  )r(   r  r  s    r0   r1   r1     s    WW; r2   )rG  rW  rD   rE   rF   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   r   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	getLoggerrU   ri  r  re   objectrg   r   r   r   r   r   r  r
  r  r  r%  r/  r9  rC  rJ   rK   rL   rN  rT  rb  re  rm  rv  r{  r  r  r  r  r  r  r  rO   rM   rT   r  r  r=   r;   r<   r>   r4   r/  r:  r  r  r  rG  rW  r`  rw  r  r  r  r  r  rN   r   r2   r0   <module>r     s1    A J M M - ?     .  ! 	    g!
(=(@eF eP/- /"K { &8 & 'H '  e  !}e !'H ' (X ( &8 & 'H ' "X " (  	K 		[& 		K 	+ Ak A& 
V    . .0Z 0:N  n  >G >0% k 0[ >D4] D4N>v >6+F +DU e M MLu LG&( GLE L8( 8&+ 0t t|8=m 8=v|>M |>Bp pf	- D,- ,^2( 2(j-
] -
`0(= 0(f $Q( Q(h *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& 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 {CE2F WY:KLG2J !$!);W;68;c2 r2   