U
    wh                     @   sr  d dl mZ d dlmZ d dlmZmZ ddlmZ ddlm	Z	 d dl
m
Z
 d dlmZ d d	lZd d	lZd d	l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edd eeD Zdd Z e!dZ"dd Z#dd Z$d d! Z%d"Z&d#Z'd$Z(d%Z)d&Z*d'Z+d(d) Z,d*d+ Z-d,d- Z.d;d/d0Z/G d1d2 d2Z0G d3d4 d4ejZ1G d5d6 d6e2Z3G d7d8 d8e2Z4G d9d: d:e2Z5d	S )<    )sstruct)floatToFixedToStr)byteordsafeEval   )DefaultTable)grUtils)array)reduceNz&
    >
    version:            16.16F
z
    >
    version:            16.16F
    compilerVersion:    L
    numSilf:            H
                        x
                        x
zZ
    >
    ruleVersion:        16.16F
    passOffset:         H
    pseudosOffset:      H
a  
    >
    maxGlyphID:         H
    extraAscent:        h
    extraDescent:       h
    numPasses:          B
    iSubst:             B
    iPos:               B
    iJust:              B
    iBidi:              B
    flags:              B
    maxPreContext:      B
    maxPostContext:     B
    attrPseudo:         B
    attrBreakWeight:    B
    attrDirectionality: B
    attrMirroring:      B
    attrSkipPasses:     B
    numJLevels:         B
z
    >
    attrStretch:        B
    attrShrink:         B
    attrStep:           B
    attrWeight:         B
    runto:              B
                        x
                        x
                        x
z
    >
    numLigComp:         H
    numUserDefn:        B
    maxCompPerLig:      B
    direction:          B
    attCollisions:      B
                        x
                        x
                        x
    numCritFeatures:    B
z;
    >
    unicode:            L
    nPseudo:            H
z;
    >
    unicode:            H
    nPseudo:            H
z;
    >
    numClass:           H
    numLinear:          H
zo
    >
    numIDs:             H
    searchRange:        H
    entrySelector:      H
    rangeShift:         H
z;
    >
    glyphId:            H
    index:              H
as  
    >
    flags:              B
    maxRuleLoop:        B
    maxRuleContext:     B
    maxBackup:          B
    numRules:           H
    fsmOffset:          H
    pcCode:             L
    rcCode:             L
    aCode:              L
    oDebug:             L
    numRows:            H
    numTransitional:    H
    numSuccess:         H
    numColumns:         H
)C)NOPr   )Z	PUSH_BYTEb)ZPUSH_BYTE_UB)Z
PUSH_SHORTz>h)ZPUSH_SHORT_U>H)Z	PUSH_LONG>L)ZADDr   )ZSUBr   )ZMULr   )ZDIVr   )ZMINr   )MAXr   )ZNEGr   )ZTRUNC8r   )ZTRUNC16r   )ZCONDr   )ANDr   )ORr   )ZNOTr   )EQUALr   )ZNOT_EQr   )LESSr   )ZGTRr   )ZLESS_EQr   )ZGTR_EQr   )ZNEXTr   )ZNEXT_Nr   )Z	COPY_NEXTr   )ZPUT_GLYPH_8BIT_OBSr   )ZPUT_SUBS_8BIT_OBSZbBB)ZPUT_COPYr   )ZINSERTr   )DELETEr   )ZASSOC)Z
CNTXT_ITEMZbB)ZATTR_SETr   )ZATTR_ADDr   )ZATTR_SUBr   )ZATTR_SET_SLOTr   )ZIATTR_SET_SLOTBB)ZPUSH_SLOT_ATTRBb)ZPUSH_GLYPH_ATTR_OBSr   )ZPUSH_GLYPH_METRICBbb)Z	PUSH_FEATr   )ZPUSH_ATT_TO_GATTR_OBSr   )ZPUSH_ATT_TO_GLYPH_METRICr   )ZPUSH_ISLOT_ATTRr   )ZPUSH_IGLYPH_ATTRr   )ZPOP_RETr   )ZRET_ZEROr   )ZRET_TRUEr   )Z	IATTR_SETr   )Z	IATTR_ADDr   )Z	IATTR_SUBr   )ZPUSH_PROC_STATEr   )ZPUSH_VERSIONr   )ZPUT_SUBSz>bHH)Z	PUT_SUBS2r   )Z	PUT_SUBS3r   )Z	PUT_GLYPHr   )ZPUSH_GLYPH_ATTR>Hb)ZPUSH_ATT_TO_GLYPH_ATTRr   )ZBITORr   )ZBITANDr   )ZBITNOTr   )ZBITSET>HH)ZSET_FEATr   c                 C   s$   g | ]\}}|d  ||d ffqS r   r    ).0ixr   r   C/tmp/pip-unpacked-wheel-cdq4c5o5/fontTools/ttLib/tables/S__i_l_f.py
<listcomp>   s     r"   c           	      C   s  t | }d}g }||k rt| ||d  }|t tkrDtd }nt| }|d7 }|d dkrl||krl|S |d dkrt| | }d| }|d7 }n|d dkrd}n|d }|dkr||d  qt|| |d  }||d d dtt| d  |t	|7 }q|S )	Nr   r   r   %dB (z, ))
lenr   
aCode_infoappendstructunpack_fromjoinmapstrcalcsize)	aCodeZcodelenZpcresopcodeinstrcountfmtparmsr   r   r!   disassemble   s2    


&r7   z^\s*([^(]+)\s*(?:\(([^)]+)\))?c                 C   s   d}| D ]}t |}|r|dtkr*qt|d \}}|td|7 }|dr|dkr`qdd td|dD }|d	krt|}|tjd
|d  |f| 7 }q|tj|f| 7 }q|S )N    r   r      r   c                 S   s   g | ]}t |qS r   intr   r    r   r   r!   r"      s     zassemble.<locals>.<listcomp>z,\s*r   r#   )	instrematchgroup	aCode_mapr*   packresplitr'   )instrsr1   instmr2   Zparmfmtr6   lr   r   r!   assemble   s     

 rH   c                 C   sH   | |  |  t|D ]}|| |  q||  |  d S N)begintagnewliner7   writeendtag)tagwriterrD   rG   r   r   r!   	writecode   s    



rP   c                 C   s<   g }t | dD ] }| }t|s(q|| qt|S )N
)content_stringrC   stripr'   r)   rH   )contentr1   er   r   r!   readcode  s    rV   )	flagsZextraAscentZextraDescentZ
maxGlyphIDZ
numLigCompZnumUserDefnZmaxCompPerLig	directionlbGID)ZiSubstZiPosZiJustZiBidi)ZmaxPreContextZmaxPostContext)Z
attrPseudoZattrBreakWeightZattrDirectionalityZattrMirroringZattrSkipPassesZattCollisions)rW   ZmaxRuleLoopZmaxRuleContextZ	maxBackupminRulePreContextmaxRulePreContextcollisionThreshold)numRowsnumTransitional
numSuccess
numColumnsc                    s0   t  fdd|D }|j| f| |  d S )Nc                    s   g | ]}|t  |fqS r   getattrr   kselfr   r!   r"   4  s     zwritesimple.<locals>.<listcomp>)dict	simpletagrK   )rN   rf   rO   Zattrkeysattrsr   re   r!   writesimple3  s    rj   c                 G   s.   |D ]$}||krt | |tt||  qd S rI   )setattrr;   r   )rf   ri   	attr_listrd   r   r   r!   	getSimple9  s    rm   c                 C   s*   d}| D ]}t |trq||7 }q| S )Nr$   )
isinstancetuplerS   )contentsr1   elementr   r   r!   rR   ?  s    

rR   P   c                 C   sj   d}|D ]:}t ||kr6| |d d  |   d}||d 7 }qt |rf| |d d  |   d S )Nr$   r    )r'   rL   rK   )rO   ZdatlengthZcurrlinedr   r   r!   wraplineH  s    rv   c                   @   s   e Zd ZdS )_ObjectN)__name__
__module____qualname__r   r   r   r!   rw   U  s   rw   c                   @   s:   e Zd ZdZdddZdd Zdd Zd	d
 Zdd ZdS )table_S__i_l_fzhGraphite Rules table

    See also https://graphite.sil.org/graphite_techAbout#graphite-font-tables
    Nc                 C   s   t j | | g | _d S rI   )r   __init__silfs)rf   rN   r   r   r!   r|   _  s    ztable_S__i_l_f.__init__c                 C   s   t t||  tt| jdd| _| jdkrVt|\}| _t t	||  t 
t	}nP| jdk rtd|dd | _d| _d| _d	}nd| _t t	||  t 
t	}td
| j ||d  }|D ].}t }| j| |||d  || j qd S )N   ZprecisionBits      @      @r         r      >%dL)r   unpack2Silf_hdr_formatfloatr   versionr   
decompressschemeSilf_hdr_format_3r/   r*   unpacknumSilfcompilerVersionr+   Silfr}   r)   	decompile)rf   datattFontbaseZsilfoffsetsoffsetsr   r   r!   r   c  s&    


ztable_S__i_l_f.decompilec                 C   s   t | j| _| jdk r8tt| }|td| jd7 }ntt| }t |d| j  }d}| jD ]6}|td|7 }|	|| j}|t |7 }||7 }q`| jdkrt
| j|| S || S )Nr   r   r   r   r8   r   r   )r'   r}   r   r   r   rA   r   r*   r   compiler   compressr   )rf   r   hdrr   r   r   Zsubdatar   r   r!   r   z  s    



ztable_S__i_l_f.compilec                 C   sv   | d |  |jd| j| j| jd |  | jD ]8}|d |  |||| j |	d |  q8d S )Nz/Attributes starting with _ are informative onlyr   )r   r   compressionSchemesilf)
commentrK   rh   r   r   r   r}   rJ   toXMLrM   )rf   rO   r   r   r   r   r!   r     s    



ztable_S__i_l_f.toXMLc           	      C   s   |dkrBt t|d | _tt|d | _t t|d | _d S |dkrt }| j| |D ].}t	|t
spq`|\}}}|||||| j q`d S )Nr   r   r   r   )r;   r   r   r   r   r   r   r}   r)   rn   ro   fromXML)	rf   nameri   rT   r   r   rq   rN   
subcontentr   r   r!   r     s    

ztable_S__i_l_f.fromXML)N	rx   ry   rz   __doc__r|   r   r   r   r   r   r   r   r!   r{   Y  s   
r{   c                   @   s@   e Zd ZdZdd ZdddZdddZdd	d
ZdddZdS )r   zA particular Silf subtablec                 C   s"   g | _ g | _g | _g | _i | _d S rI   )passes
scriptTagscritFeaturesjLevelspMapre   r   r   r!   r|     s
    zSilf.__init__       @c              	      s  |dkr.t t | \} tt| jdd| _t t | \} t| jD ]$}t t	 t
 \} | j| qJt t | \} | jrtd| j  | _ | jd d d   td \}|r fdd	tddd
|  d
D | _ dd
|  d   td d d \| _| jrFtd| jd   ddd
| j   | _ dd
| j  d   td d d \}t|D ]v}	|dkrt t dd|	  dd|	   t
 }
n(t t dd
|	  dd
|	   t
 }
||
j| j|
j< qz dd|  d   t tt t	| j  t t d| j  d d d
|  d d
| j  d d|  }|dkrv|t t7 }t | _| j  || t| jD ]F}	t! }| j"| |  | j|	 | | j|	d  |  || qd S )Nr   r~   r   >%dHr9   r   r   c              	      s.   g | ]&}t d  ||d  d dqS )4sr   r   ascii)r*   r   decoder<   r   r   r!   r"     s   z"Silf.decompile.<locals>.<listcomp>r   r   r   r   r         )#r   r   Silf_part1_format_v3r   r   ruleVersionSilf_part1_formatrange
numJLevelsSilf_justify_formatrw   r   r)   Silf_part2_formatnumCritFeaturesr*   r+   r   r   r   rY   	numPassesZoPassesSilf_pseudomap_formatSilf_pseudomap_format_hgetGlyphNameZnPseudor   unicoder/   Classesclassesr   Passr   )rf   r   r   r   _ZjleveljZnumScriptTag	numPseudor   pseudocurrpospr   r   r!   r     s     
 
    	

"zSilf.decompilec              	   C   s*  t | j| _t | j| _t | j| _t | j}d}|dkrFt	t
}nd}|tt| 7 }| jD ]}|tt|7 }q`|tt| 7 }| jr|tjd| j f| j 7 }|tddt | j7 }t | jrdd | jD }|d|7 }|td| j7 }t || _t|d	}|t | d
| jd   }	|	t | | _t| j D ]0\}
}|t|dkrbdnd|
||7 }qF|| j||7 }|	t |7 }	d}d}t| jD ]8\}}|	t | }|td|7 }|||||7 }q|td|	t | 7 }|dkrtt
| }nd}|| | | | S )Nr8   r   r   r   r   c                 S   s   g | ]}t d |dqS )r   r   )r*   rA   encoder<   r   r   r!   r"     s     z Silf.compile.<locals>.<listcomp>r   r   r   r   z>LHr   r   )r'   r   r   r   r   r   r   r   r   r/   r   rA   r   r   r   r*   ZnumCritFeatursr   r,   rY   Z
passOffsetr   bininfoZpseudosOffsetsorteditems
getGlyphIDr   r   	enumerate)rf   r   r   r   r   Z	hdroffsetr   ZtdataZdata1r   ur   Zdata2Zdataor   r   Zdata3r   r   r!   r     sT    



  

zSilf.compilec                    sp  |dkr |j d| jd |  td| |ft  td| |ft  td| |ft  td| |ft  t| j	r|
d |  tt\}}}t| j	D ]2\} t fd	d
|D }|j d| |  q|d |  t| jr4|
d |  |dtt| j |  |d |  t| jr~|
d |  |d| j |  |d |  | jr|
d |  t| j D ]&\}	}
|j dt|	|
d |  q|d |  | j||| t| jrl|
d |  t| jD ]@\}}|j
d|d |  |||| |d |  q|d |  d S )Nr   r   )r   infopassindexescontexts
attributesjustificationsc                    s   g | ]}|t  |fqS r   ra   rc   r   r   r!   r"   5  s     zSilf.toXML.<locals>.<listcomp>justifyr   rs   r   	pseudoMapr   )r   r   r   pass_index)r   )rh   r   rK   rj   
attrs_infoattrs_passindexesattrs_contextsattrs_attributesr'   r   rJ   r   Z	getformatr   r   rg   rM   r   rL   r,   r-   r.   r   r   r   r   hexr   r   r   )rf   rO   r   r   ZjformatZjnamesZjfixesr   ri   rd   vr   r   r   r!   r   (  sf    












z
Silf.toXMLc              	   C   s  |dkrt t|dd| _|dkr:t| |ft  n\|dkrVt| |ft  n@|dkrrt| |ft  n$|dkrt| |ft  n|dkr|D ]V}t	|t
sq|\}}}|d	krt }	| D ]\}
}t|	|
t| q| j|	 qn|d
kr(g | _t|}| jtt|  nn|dkr`g | _t|}| D ]}| j| qHn6|dkri | _|D ]J}t	|t
sqt|\}}}|dkrt|d d}
|d }|| j|
< qtn|dkrt | _|D ]4}t	|t
sq|\}}}| j||||| qn|dkr|D ]v}t	|t
s2q|\}}}|dkrt }|D ]4}t	|t
sdqP||d |d |d || qP| j| qd S )Nr   r   0r   r   r   r   r   r   r   r   r   r   r   r~   r   r   r   r   r   r9   )r   r   getr   rm   r   r   r   r   rn   ro   rw   r   rk   r;   r   r)   r   rR   extendr-   rC   r   r   r   r   r   r   r   )rf   r   ri   rT   r   r   rq   rN   r   r   rd   r   nr   rU   r   r   r!   r   ]  st    











"zSilf.fromXMLN)r   )r   )r   )r   r   r   r   r   r!   r     s   
C
.
5r   c                   @   s<   e Zd Zdd ZdddZdddZddd	Zdd
dZdS )r   c                 C   s   g | _ g | _d S rI   )linear	nonLinearre   r   r   r!   r|     s    zClasses.__init__r   c           	   
      sB  t t |  |dkr@td| jd   ddd| j   }n(td| jd   ddd| j   }t|d | j |d| jd  D ]>\}}| j	fd	d
td|| d   || D  qt|| j| j || jd | jd  D ]H\}} fddt
|d |dD }tfdd|D }| j	| qd S )N      @r   r   r   r   r   r   r9   c                 3   s   | ]}  |V  qd S rI   r   r<   r   r   r!   	<genexpr>  s   z$Classes.decompile.<locals>.<genexpr>c              	      s$   g | ]}t d  ||d  qS )r   r   )r*   r   r<   r   r   r!   r"     s    z%Classes.decompile.<locals>.<listcomp>c                    s"   g | ]}  |d  |d fqS r   r   r<   r   r   r!   r"     s     )r   r   Silf_classmap_formatr*   r   numClasszip	numLinearr   r)   r   rg   r   )	rf   r   r   r   oClassesr   rU   Z	nonLinidsZnonLinr   )r   r   r!   r     s.      *

zClasses.decompilec                    sZ  d}g }|dkr.ddt | jt | j   }nddt | jt | j   }| jD ]D}|t ||   fdd|D }|tjd	t | f| 7 }qP| jD ]Z}|t ||   fd
d| D }|tt |7 }|d	dd t
|D 7 }q|t ||  t |d | _t | j| _tt| tj|dkr@dnd	t | f|  | S )Nr8   r   r   r   r   r9   c                    s   g | ]}  |qS r   r   r<   r   r   r!   r"     s     z#Classes.compile.<locals>.<listcomp>r   c                    s"   g | ]}  |d  |d fqS r   r   r<   r   r   r!   r"     s     c                 S   s   g | ]}t jd| qS )r   )r   r*   rA   r<   r   r   r!   r"     s     r   r   )r'   r   r   r)   r*   rA   r   r   r   r,   r   r   r   r   r   )rf   r   r   r   r   r   rG   Zgsr   r   r!   r     s6    


zClasses.compilec                 C   s"  | d |  | d |  t| jD ]:\}}|j d|d |  t|| |d |  q.|d |  | d |  t| jD ]`\}}|j d|| j d |  | D ] \}}|j	d||d |  q|d |  q|d |  |d |  d S )	Nr   linearClassesr   r   nonLinearClassesr   r-   )glyphindex)
rJ   rK   r   r   rv   rM   r   r   r   rh   )rf   rO   r   r   r   rG   inpindr   r   r!   r     s4    











zClasses.toXMLc                 C   s   |dkrJ|D ]:}t |tsq|\}}}|dkrt| }	| j|	 qn|dkr|D ]r}t |tsfqV|\}}}|dkrVi }	|D ]:}
t |
tsq|
\}}}|dkrtt|d |	|d < q| j|	 qVd S )Nr   r   r   r   r-   r   r   )	rn   ro   rR   rC   r   r)   r;   r   r   )rf   r   ri   rT   r   r   rq   rN   r   rG   rU   Zsubsubcontentr   r   r!   r     s,    





zClasses.fromXMLN)r   )r   )r   )r   rx   ry   rz   r|   r   r   r   r   r   r   r   r!   r     s
   


r   c                   @   s<   e Zd Zdd ZdddZdddZddd	Zdd
dZdS )r   c                 C   s:   i | _ g | _g | _g | _g | _d| _g | _g | _g | _d S )Nr8   )	colMaprulesrulePreContextsruleSortKeysruleConstraintspassConstraintsactions
stateTransstartStatesre   r   r   r!   r|   	  s    zPass.__init__r   c              	      s  t t | \} td d d \}}}} dd   t|D ]N}td d| d| d  \}}}	t||d D ]}
|	| j||
< qzqB d| d   td| j	d   } dd| j	  d   td|d   fd	d
t
||dd  D | _ d|d  d   td d d \| _| _| j| j d }td|  dd|d   | _ d|d  d   td| j  d d| j  | _ d| j d   td| j  d | j | _ | jd   td d d \| _}ttd| jd   dd| jd   } d| jd  d   ttd| jd   d d| jd   } d| j d d   t| jD ]P}td || j d |d | j d  }tjdkr|  | j| q | j| j d d d    d | | _ |d   tt|d ddD ]$}|| dkr||d  ||< q fdd
t
||dd  D | _ |d d    fdd
t
||dd  D | _ |d d   d S )Nz>4Hr   >3Hr   r   r   r9   r   c                    s   g | ]\}} || qS r   r   r   r   rU   )r   r   r!   r"      s     z"Pass.decompile.<locals>.<listcomp>r   r#   >BH      Hbigr   c                    s,   g | ]$\}}|| d kr$ || ndqS )r   r8   r   r   r   r   r!   r"   H  s   c                    s,   g | ]$\}}|| d kr$ || ndqS )r   r$   r   r   r   r   r!   r"   M  s    ) r   r   Silf_pass_formatr*   r   r   r   r   r+   r_   r   r   rZ   r[   r   numRulesr   r   r\   listr^   r	   r`   sys	byteorderbyteswapr   r)   r   r'   r   r   )rf   r   r   r   r   ZnumRanger   firstlastcolgoRuleMapZnumStartStatesZpConstraintoConstraintsoActionsar   )r   r   r!   r     s    &"    & "

zPass.decompilec                    sV  t dd | jdg dg fd }t dd | jdg dg fd }dd| j }g }| jD ]6}tjdkrp|  ||	  tjdkrZ|  qZt
|sdg| _t d	d | jg g dg fd }	g }
t fd
d| j D }tj|ddD ]8}|d r|
|d |d |d  d |d d f qt
| j| _ttd t
|
d  t
|	d  d|	d   d dt
| j  d| j  d d| j  d | _| jd| j | j  d | | _| jt
| j | _| jt
| | _d| _tt| }|tt
|
d7 }|ddd |
D 7 }|t jdt
|	 f|	 7 }t dd | jg }|t jd|	d  f| 7 }|t d| j!| j"7 }|t jdt
| j f| j 7 }|t jd| j f| j# 7 }|t jd| j f| j$ 7 }|t d| j%t
| j7 }|t jd| jd  f| 7 }|t jd| jd  f| 7 }|d| t dd | j | d| j S )Nc                 S   s"   | d t | | d | d g fS Nr   r   r'   r  r    r   r   r!   <lambda>V  r8   zPass.compile.<locals>.<lambda>r8   r   r   c                 S   s"   | d t | | d | d g fS r  r  r  r   r   r!   r  Y  r8       r  c                 S   s"   | d t | | d | d g fS r  r  r  r   r   r!   r  h  r8   c                    s"   g | ]}  |d  |d fqS r   r   r<   r   r   r!   r"   k  s     z Pass.compile.<locals>.<listcomp>T)Zsamevalr9   r   r   r   r  r   c                 s   s   | ]}t jd| V  qdS )r   N)r   r   )r   r   r   r   r!   r     s     zPass.compile.<locals>.<genexpr>r   c                 S   s   | | S rI   r   r  r   r   r!   r    r8   r   r#   r  r   )&r
   r   r   r,   r   r	  r
  r  r)   tobytesr'   r   r   rg   r   r   r   entriesr  r   r/   r  Z	fsmOffsetr^   r`   ZpcCoder   ZrcCoder0   ZoDebugrA   r   r*   rZ   r[   r   r   r\   )rf   r   r   r   r  r  ZconstraintCodeZtransestr  Z
passRangesZ	gidcolmaprU   r   Z	flatrulesr   r   r!   r   S  s     
 




 
 .


	
 

zPass.compilec              	      sL  t d| |ft  t d| |ft  |d |  t|dd t| j  fdddD  |	d |  |d	 |  t
| jD ]8\}}|jd
| j| j | dtt|d |  q|	d	 |  |d |  tt| jD ]p}|jd|| j| | j| d |  t| j| rFtd|| j|  td|| j|  |	d |  q|	d |  t| jrtd|| j t| jrH|d |  |d |dtt| j |	d |  t
| jD ]@\}}|jd|d |dtt| |	d |  q|	d |  d S )Nr   fsminfocolmapc                 S   s   g | ]}d j | qS )z{}={})formatr<   r   r   r!   r"     s   zPass.toXML.<locals>.<listcomp>c                    s     | d S )Nr   r   )r    r   r   r!   r    r8   zPass.toXML.<locals>.<lambda>)keystaterulemapstaters   )numberr   r   rule)r   
precontextsortkey
constraintactionpassConstraintfsmstartsrow)Z_i)rj   pass_attrs_infopass_attrs_fsmrJ   rK   rv   r   r   r   rM   r   r   rh   r]   r_   r,   r-   r.   r   r'   r   r   r   r   rP   r   r   rL   r   )rf   rO   r   r   r   rr   r   r   r!   r     sv    
 
	












z
Pass.toXMLc                 C   s~  |dkrt | |ft  n^|dkr8t | |ft  nB|dkrt|}| D ]J}|d}t|dksP|d dksP|d dkrqPt|d | j|d < qPn|d	kr|D ]B}t|t	sq|\}	}
}|	d
kr| j
dd |
d dD  qn|dkr|D ]}t|t	sq|\}	}
}|	dkr.q| jt|
d  | jt|
d  d}d}|D ]F}t|t	svqb|\}	}
}|	dkrt|}n|	dkrbt|}qb| j| | j| qn|dkrt|| _n|dkrz|D ]}t|t	s q|\}	}
}|	dkrFtd}t|}|tt|  | j| n0|	dkrg }t|}|tt|  || _qd S )Nr   r  r  =r9   r   r$   r   r   r!  c                 S   s   g | ]}t |qS r   r:   r<   r   r   r!   r"     s     z Pass.fromXML.<locals>.<listcomp>r   rs   r#  r$  r%  r8   r&  r'  r(  r)  r+  r  r*  )rm   r,  r-  rR   rC   r'   r;   r   rn   ro   r   r)   r   r   rV   r   r   r   r	   r   r-   r   r   )rf   r   ri   rT   r   r   rU   wr    rN   r  crq   conZactZsubcr   r   r   r!   r     sp    
$

&











zPass.fromXMLN)r   )r   )r   )r   r   r   r   r   r!   r     s
   
?
G
>r   )rr   )6ZfontTools.miscr   ZfontTools.misc.fixedToolsr   ZfontTools.misc.textToolsr   r   r$   r   r   r	   	functoolsr
   r*   rB   r	  r   r   r   r   r   r   r   r   r   ZSilf_lookupclass_formatZSilf_lookuppair_formatr  r(   rg   r   r@   r7   r   r=   rH   rP   rV   r   r   r   r   r,  r-  rj   rm   rR   rv   rw   r{   objectr   r   r   r   r   r   r!   <module>   sT   	E


		
T nn