
    +g~W                     V   d Z g dZddlmZ ddlmZ d Zd Zdd	Zdd
Z	d Z
ddZddddZddZ G d de      Zd ZddZedk(  r`ddlZddlZ eej,                        dkD  r ej.                   e               ej.                   ej0                         j2                         yy)z%Variation fonts interpolation models.)normalizeValuenormalizeLocationsupportScalarpiecewiseLinearMapVariationModel    )noRound   )VariationModelErrorc                 2    | D cg c]  }||	 c}S c c}w N )lstls     o/home/viktor/gitlab-persoonlijk/factuur-applicatie/venv/lib/python3.12/site-packages/fontTools/varLib/models.pynonNoner      s    ,!amA,,,s   c                 &    t        d | D              S )Nc              3   $   K   | ]  }|d u  
 y wr   r   .0r   s     r   	<genexpr>zallNone.<locals>.<genexpr>   s     &QqDy&   all)r   s    r   allNoner      s    &#&&&    Nc                 n     t         fd|D              S         t        fd|D              S )Nc              3   (   K   | ]	  }|k(    y wr   r   )r   itemrefs     r   r   zallEqualTo.<locals>.<genexpr>   s     /43$;/s   c              3   4   K   | ]  } |      k(    y wr   r   )r   r   mappedmappers     r   r   zallEqualTo.<locals>.<genexpr>   s     6$v%6   r   )r   r   r"   r!   s   ` `@r   
allEqualTor$      s3    ~/3///C[F6#666r   c                 p    | syt        |       }	 t        |      }t        |||      S # t        $ r Y yw xY w)NT)r"   )iternextStopIterationr$   )r   r"   itfirsts       r   allEqualr+      sD    	cBR eR//  s   ) 	55c                     t        |       t        |      k(  sJ t        ||       D cg c]
  \  }}|s	| c}}S c c}}w r   lenzip)truthr   r   ts       r   subListr2   *   s8    u:S!!!c5//$!QQA///s   
<<Fc           
      @   |\  }}}||cxk  r|k  sn t        d|dd|dd|d      |st        t        | |      |      } | |k(  s||k(  ry| |k  r||k7  s
| |kD  r||k(  r| |z
  ||z
  z  S | |kD  r||k7  s| |k  r||k(  sJ d|  d| d| d| d	       | |z
  ||z
  z  S )zNormalizes value based on a min/default/max triple.

    >>> normalizeValue(400, (100, 400, 900))
    0.0
    >>> normalizeValue(100, (100, 400, 900))
    -1.0
    >>> normalizeValue(650, (100, 400, 900))
    0.5
    z8Invalid axis values, must be minimum, default, maximum: z3.3fz,         zOoops... v=z
, triple=())
ValueErrormaxmin)vtripleextrapolatelowerdefaultuppers         r   r   r   /   s     #E7EW%%FTl"WTN"U4L:
 	
 Auu%G|u~	G(a'kew>NG%00G 0KEW,	C:eWBwir%B	C 
 G00r   )validatec                `   |rkt        | j                               t        |j                               k  s8J t        | j                               t        |j                               z
         i }|j                         D ]+  \  }}| j                  ||d         }t	        |||      ||<   - |S )a  Normalizes location based on axis min/default/max values from axes.

    >>> axes = {"wght": (100, 400, 900)}
    >>> normalizeLocation({"wght": 400}, axes)
    {'wght': 0.0}
    >>> normalizeLocation({"wght": 100}, axes)
    {'wght': -1.0}
    >>> normalizeLocation({"wght": 900}, axes)
    {'wght': 1.0}
    >>> normalizeLocation({"wght": 650}, axes)
    {'wght': 0.5}
    >>> normalizeLocation({"wght": 1000}, axes)
    {'wght': 1.0}
    >>> normalizeLocation({"wght": 0}, axes)
    {'wght': -1.0}
    >>> axes = {"wght": (0, 0, 1000)}
    >>> normalizeLocation({"wght": 0}, axes)
    {'wght': 0.0}
    >>> normalizeLocation({"wght": -1}, axes)
    {'wght': 0.0}
    >>> normalizeLocation({"wght": 1000}, axes)
    {'wght': 1.0}
    >>> normalizeLocation({"wght": 500}, axes)
    {'wght': 0.5}
    >>> normalizeLocation({"wght": 1001}, axes)
    {'wght': 1.0}
    >>> axes = {"wght": (0, 1000, 1000)}
    >>> normalizeLocation({"wght": 0}, axes)
    {'wght': -1.0}
    >>> normalizeLocation({"wght": -1}, axes)
    {'wght': -1.0}
    >>> normalizeLocation({"wght": 500}, axes)
    {'wght': -0.5}
    >>> normalizeLocation({"wght": 1000}, axes)
    {'wght': 0.0}
    >>> normalizeLocation({"wght": 1001}, axes)
    {'wght': 0.0}
    r	   )r;   )setkeysitemsgetr   )locationaxesr;   r?   outtagr:   r9   s           r   r   r   N   s    N 8==?#s499;'77 	
X]]_9MPSIIKQ
 :
 	
7 Czz| FVLLfQi(!!VECF Jr   c                 6   |r|t        d      d}|j                         D ]  \  }\  }}}	|r/|dk(  r||kD  s||	kD  r|dk  r|	dkD  r(| j                  |d      }
n|| v sJ | |   }
|
|k(  rL|rv||   \  }}|
|k  r2||k  r-||k  r||	k  r||
|	z
  ||	z
  z  z  }y||k  rF||
|z
  ||z
  z  z  }||
k  r2||	k  r-||k  r||k  r||
|z
  ||z
  z  z  }||k  r||
|	z
  ||	z
  z  z  }|
|k  s|	|
k  rd} |S |
|k  r||
|z
  ||z
  z  z  }||
|	z
  ||	z
  z  z  } |S )a  Returns the scalar multiplier at location, for a master
    with support.  If ot is True, then a peak value of zero
    for support of an axis means "axis does not participate".  That
    is how OpenType Variation Font technology works.

    If extrapolate is True, axisRanges must be a dict that maps axis
    names to (axisMin, axisMax) tuples.

      >>> supportScalar({}, {})
      1.0
      >>> supportScalar({'wght':.2}, {})
      1.0
      >>> supportScalar({'wght':.2}, {'wght':(0,2,3)})
      0.1
      >>> supportScalar({'wght':2.5}, {'wght':(0,2,4)})
      0.75
      >>> supportScalar({'wght':2.5, 'wdth':0}, {'wght':(0,2,4), 'wdth':(-1,0,+1)})
      0.75
      >>> supportScalar({'wght':2.5, 'wdth':.5}, {'wght':(0,2,4), 'wdth':(-1,0,+1)}, ot=False)
      0.375
      >>> supportScalar({'wght':2.5, 'wdth':0}, {'wght':(0,2,4), 'wdth':(-1,0,+1)})
      0.75
      >>> supportScalar({'wght':2.5, 'wdth':.5}, {'wght':(0,2,4), 'wdth':(-1,0,+1)})
      0.75
      >>> supportScalar({'wght':3}, {'wght':(0,1,2)}, extrapolate=True, axisRanges={'wght':(0, 2)})
      -1.0
      >>> supportScalar({'wght':-1}, {'wght':(0,1,2)}, extrapolate=True, axisRanges={'wght':(0, 2)})
      -1.0
      >>> supportScalar({'wght':3}, {'wght':(0,2,2)}, extrapolate=True, axisRanges={'wght':(0, 2)})
      1.5
      >>> supportScalar({'wght':-1}, {'wght':(0,2,2)}, extrapolate=True, axisRanges={'wght':(0, 2)})
      -0.5
    z2axisRanges must be passed when extrapolate is Trueg      ?r4   )	TypeErrorrC   rD   )rE   supportotr;   
axisRangesscalaraxisr<   peakr>   r9   axisMinaxisMaxs                r   r   r      s   D z)LMMF&-mmo (3""udEs{t|te|s{us{T3'A8###A9)$/GW7{u/7?te|q5yTE\::Ft^q5yTE\::F1E!1d?ut|q5yTE\::FG^q5yTE\::F:!F M	 t8q5yTE\22Fq5yTE\22FQ(3R Mr   c                       e Zd ZdZ	 ddddZd Zed        Zeg fd       Zd Z	d	 Z
d
 Zd ZeddZeddZd Zd Zed        Zed        Zd ZeddZeddZy)r   a5  Locations must have the base master at the origin (ie. 0).

    If axis-ranges are not provided, values are assumed to be normalized to
    the range [-1, 1].

    If the extrapolate argument is set to True, then values are extrapolated
    outside the axis range.

      >>> from pprint import pprint
      >>> axisRanges = {'wght': (-180, +180), 'wdth': (-1, +1)}
      >>> locations = [       {'wght':100},       {'wght':-100},       {'wght':-180},       {'wdth':+.3},       {'wght':+120,'wdth':.3},       {'wght':+120,'wdth':.2},       {},       {'wght':+180,'wdth':.3},       {'wght':+180},       ]
      >>> model = VariationModel(locations, axisOrder=['wght'], axisRanges=axisRanges)
      >>> pprint(model.locations)
      [{},
       {'wght': -100},
       {'wght': -180},
       {'wght': 100},
       {'wght': 180},
       {'wdth': 0.3},
       {'wdth': 0.3, 'wght': 180},
       {'wdth': 0.3, 'wght': 120},
       {'wdth': 0.2, 'wght': 120}]
      >>> pprint(model.deltaWeights)
      [{},
       {0: 1.0},
       {0: 1.0},
       {0: 1.0},
       {0: 1.0},
       {0: 1.0},
       {0: 1.0, 4: 1.0, 5: 1.0},
       {0: 1.0, 3: 0.75, 4: 0.25, 5: 1.0, 6: 0.6666666666666666},
       {0: 1.0,
        3: 0.75,
        4: 0.25,
        5: 0.6666666666666667,
        6: 0.4444444444444445,
        7: 0.6666666666666667}]
    N)rM   c                >   t        t        d |D                    t        |      k7  rt        d      || _        ||ng | _        || _        |J|r| j                  |      }n6|D ch c]  }|j                         D ]  }|  }}}|D ci c]  }|d }}|| _        |D 	cg c],  }|j                         D 	ci c]  \  }}	|	dk7  s||	 c}	}. }}}}	| j                  || j                        }
t        ||
      | _        |D cg c]  }| j                  j                  |       c}| _        | j                  D cg c]  }|j                  |       c}| _        | j!                          i | _        y c c}}w c c}w c c}	}w c c}	}}w c c}w c c}w )Nc              3   `   K   | ]&  }t        t        |j                                      ( y wr   )tuplesortedrC   r   s     r   r   z*VariationModel.__init__.<locals>.<genexpr>  s      ?5	*+?s   ,.zLocations must be unique.)r	   r4   )	axisOrder)key)r.   rA   r
   origLocationsrY   r;   computeAxisRangesrB   rM   rC   getMasterLocationsSortKeyFuncrW   	locationsindexmappingreverseMapping_computeMasterSupports
_subModels)selfr^   rY   r;   rM   locrO   allAxeskr9   keyFuncr   s               r   __init__zVariationModel.__init__  s{    s?Y??@C	NR%&ABB&&/&;&!33I>
+4LCL4L4LL8?@dGm@
@$KTUUCsyy{?tq!a3had?U	U44 5 
  	w7 :CCA,,Q/C;?>>Jayq1J##% M@ @U DJs6   'E=
F%F=FFF"FFFc                     d|vr| |fS t        d |D              }| j                  j                  |      }|9t        t	        || j
                        | j                        }|| j                  |<   |t	        ||      fS )zReturn a sub-model and the items that are not None.

        The sub-model is necessary for working with the subset
        of items when some are None.

        The sub-model is cached.Nc              3   $   K   | ]  }|d u 
 y wr   r   r   r9   s     r   r   z-VariationModel.getSubModel.<locals>.<genexpr>*  s     1aATM1r   )rV   rc   rD   r   r2   r[   rY   )rd   rC   rZ   subModels       r   getSubModelzVariationModel.getSubModel!  s}     u;1511??&&s+%gc43E3E&FWH#+DOOC e,,,r   c                    i }| D ch c]  }|j                         D ]  }|  }}}| D ]M  }|D ]F  }|j                  |d      }|j                  |||f      \  }}t        ||      t        ||      f||<   H O |S c c}}w )Nr   )rB   rD   r8   r7   )r^   rM   re   rO   rf   valuerQ   rR   s           r   r\   z VariationModel.computeAxisRanges1  s    
#,DCD4D4DD 	LC La(#->>$#G #&ug#6E78K#K
4 L	L
  Es   A=c                    i | vrt        d      i }| D ]_  }t        |      dk7  rt        t        |            }||   }||vrdh||<   |||   vsJ d|d|d|       ||   j	                  |       a d } |||      }|S )NzBase master not found.r	   r4   zValue "z" in axisPoints["z"] -->  c                       d  fd}|S )Nc                 "    | dk  rdS | dkD  rdS dS )Nr   rX   r	   r   )r9   s    r   signzJVariationModel.getMasterLocationsSortKeyFunc.<locals>.getKey.<locals>.signN  s    Ur:a!e::r   c           	          t               } j                         D cg c]  \  }}|v r	||   v r| }}}D cg c]	  }| v s| }}|j                  t         j	                               D cg c]	  }|vs| c}       |t        |       t        fd|D              t        |      t         fd|D              t         fd|D              fS c c}}w c c}w c c}w )Nc              3   L   K   | ]  }|v rj                  |      nd   yw)i   N)r_   )r   rO   rY   s     r   r   z\VariationModel.getMasterLocationsSortKeyFunc.<locals>.getKey.<locals>.key.<locals>.<genexpr>_  s.        261B	-Os   !$c              3   4   K   | ]  } |           y wr   r   )r   rO   re   rt   s     r   r   z\VariationModel.getMasterLocationsSortKeyFunc.<locals>.getKey.<locals>.key.<locals>.<genexpr>d  s      ,0SYr#   c              3   :   K   | ]  }t        |           y wr   )abs)r   rO   re   s     r   r   z\VariationModel.getMasterLocationsSortKeyFunc.<locals>.getKey.<locals>.key.<locals>.<genexpr>g  s      +/CIs   )r.   rC   extendrW   rB   rV   )	re   rankrO   rp   onPointAxesorderedAxesrY   
axisPointsrt   s	   `     r   rZ   zIVariationModel.getMasterLocationsSortKeyFunc.<locals>.getKey.<locals>.keyQ  s   3x (+yy{#ez)ez$7G.G  
 1:ITS[tII""&,SXXZ&8RdD	<QTR %% $/  +& 4?   3>  
 JRs   C	C"	C"5	C'?C'r   )r~   rY   rZ   rt   s   `` @r   getKeyz<VariationModel.getMasterLocationsSortKeyFunc.<locals>.getKeyM  s    ;6 Jr   )r
   r.   r'   r&   add)r^   rY   r~   re   rO   rp   r   rets           r   r]   z,VariationModel.getMasterLocationsSortKeyFunc<  s    Y%&>??
 
	(C3x1}S	?DIE:%$'5
4 Z--T;@$
ST-t  '
	(	B Z+
r   c                     |D cg c]  }||   	 }}|D cg c]  }| j                   |    c}| _         | j                   D cg c],  }|j                         D ci c]  \  }}|dk7  s|| c}}. }}}}|D 	cg c]  }	| j                  j                  |	       c}	| _        | j                  D 	cg c]  }	|j                  |	       c}	| _        i | _        |S c c}w c c}w c c}}w c c}}}w c c}	w c c}	w )Nr4   )r[   rC   r^   r_   r`   ra   rc   )
rd   master_listr`   idxnew_listre   rg   r9   r^   r   s
             r   reorderMasterszVariationModel.reorderMastersq  s     188K$88AHI#d005IBFBTBT
 
;>ciik6daQ#XQT6
	 
 :CCA,,Q/C;?>>Jayq1J 9I6
 DJs4   CC$C/C)+C)0C/>"C66C;)C/c                    g | _         | j                         }t        |      D ]4  \  }}t        |j	                               }|d | D ]  }t        |j	                               |k7  r d}|j                         D ],  \  }\  }}	}
||   d   |	k(  r|||   d   cxk  r|
k  r(n d} n |sdi }d}|j	                         D ][  }||   d   }||v sJ ||   \  }}}
||
}}||k  r|}||z
  ||z
  z  }n||k  r|}||z
  |
|z
  z  }nE||kD  ri }|}||k(  sT|||f||<   ] |j                         D ]
  \  }}|||<     | j                   j                  |       7 | j                          y )NTr	   FrX   )supports_locationsToRegions	enumeraterA   rB   rC   append_computeDeltaWeights)rd   regionsiregionlocAxesprev_regionrelevantrO   r<   rP   r>   bestAxes	bestRatiovallocVnewLowernewUpperratior:   s                      r   rb   z%VariationModel._computeMasterSupports~  s   **,"7+ 2	)IAv&++-(G&r{ .*{'')*g528,,. .D.5$#D)!,4 ;t#4Q#7?%?#(   	',,. DD%d+A.C6>)>)/&E4).hHTz#&!$t =#&!$t = !y(#%$)		)*2D()C%D( %-NN$4 *LD&#)F4L*[.*^ MM  (e2	)f 	!!#r   c                     | j                   }| j                  }g }|D ]O  }i }|j                         D ]'  \  }}|dkD  rd|||   d   f||<   ||   d   |df||<   ) |j                  |       Q |S )Nr   r	   )r^   rM   rC   r   )rd   r^   rM   r   re   r   rO   r   s           r   r   z"VariationModel._locationsToRegions  s    NN	__
 	#CF!iik B
d!8$%tZ-=a-@#AF4L$.t$4Q$7q#AF4L	B
 NN6"	# r   c                     g | _         t        | j                        D ]V  \  }}i }t        | j                  d |       D ]  \  }}t	        ||      }|s|||<    | j                   j                  |       X y r   )deltaWeightsr   r^   r   r   r   )rd   r   re   deltaWeightjrK   rN   s          r   r   z#VariationModel._computeDeltaWeights  s|    / 	2FAsK'bq(9: ,
7&sG4%+KN, $$[1	2r   roundc                   t        |      t        | j                        k(  s%J t        |      t        | j                        f       | j                  }g }t        | j                        D ]U  \  }}|||      }|j	                         D ]  \  }}	|	dk(  r	|||   z  }|||   |	z  z  }  |j                   ||             W |S )Nr	   )r.   r   ra   r   rC   r   )
rd   masterValuesr   r`   rG   r   weightsdeltar   weights
             r   	getDeltaszVariationModel.getDeltas  s    < C(9(9$:: 	
!!"=
 	
: %%#D$5$56 	%JAw ,E$]]_ -	6Q;SVOESVf_,E	-
 JJuU|$	% 
r   c                h    | j                  |      \  }}|j                  ||      |j                  fS )Nr   )rn   r   r   )rd   rC   r   models       r   getDeltasAndSupportsz#VariationModel.getDeltasAndSupports  s2    ''.uuE2ENNBBr   c           	          | j                   D cg c]%  }t        ||| j                  | j                        ' c}S c c}w )zReturn scalars for each delta, for the given location.
        If interpolating many master-values at the same location,
        this function allows speed up by fetching the scalars once
        and using them with interpolateFromMastersAndScalars().)r;   rM   )r   r   r;   rM   )rd   re   rK   s      r   
getScalarszVariationModel.getScalars  sB      ==	
  W$*:*:t
 	
 
s   *<c                 H   | j                  |      }t        t        t        | j                                    D ]0  \  }}|j                         D ]  \  }}||xx   ||   |z  z  cc<    2 t        t        |            D cg c]  }|| j                  |       }}|S c c}w )a  Return multipliers for each master, for the given location.
        If interpolating many master-values at the same location,
        this function allows speed up by fetching the scalars once
        and using them with interpolateFromValuesAndScalars().

        Note that the scalars used in interpolateFromMastersAndScalars(),
        are *not* the same as the ones returned here. They are the result
        of getScalars().)	r   reversedlistr   r   rC   ranger.   r`   )rd   targetLocationrG   r   r   r   r   s          r   getMasterScalarszVariationModel.getMasterScalars  s     oon-"4	$2C2C(D#EF 	*JAw$]]_ *	6A#a&6/)*	* .33s8_=s4<<?#==
 >s   Bc                     d}t        |       t        |      k(  sJ t        | |      D ]  \  }}|s	||z  }||}||z  } |S )aV  Interpolate from values and scalars coefficients.

        If the values are master-values, then the scalars should be
        fetched from getMasterScalars().

        If the values are deltas, then the scalars should be fetched
        from getScalars(); in which case this is the same as
        interpolateFromDeltasAndScalars().
        Nr-   )valuesscalarsr9   rp   rN   contributions         r   interpolateFromValuesAndScalarsz.VariationModel.interpolateFromValuesAndScalars  sc     6{c'l*** 1 	"ME6 6>Ly \!	" r   c                 .    t         j                  | |      S )z>Interpolate from deltas and scalars fetched from getScalars().)r   r   )deltasr   s     r   interpolateFromDeltasAndScalarsz.VariationModel.interpolateFromDeltasAndScalars  s     ==fgNNr   c                 H    | j                  |      }| j                  ||      S )z)Interpolate from deltas, at location loc.)r   r   )rd   re   r   r   s       r   interpolateFromDeltasz$VariationModel.interpolateFromDeltas  s#    //#&33FGDDr   c                H    | j                  |      }| j                  ||      S )z0Interpolate from master-values, at location loc.)r   r   )rd   re   r   r   r   s        r   interpolateFromMastersz%VariationModel.interpolateFromMasters#  s%    '',33L'JJr   c                L    | j                  ||      }| j                  ||      S )zInterpolate from master-values, and scalars fetched from
        getScalars(), which is useful when you want to interpolate
        multiple master-values with the same location.r   )r   r   )rd   r   r   r   r   s        r    interpolateFromMastersAndScalarsz/VariationModel.interpolateFromMastersAndScalars(  s)     E:33FGDDr   )NF)__name__
__module____qualname____doc__ri   rn   staticmethodr\   r]   r   rb   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r      s    /d 6;JN<-    ;= 2 2h6$p	2 07 " 4; C

"  , O OE
 BI K
 PW Er   r   c                 6    |j                         }|s S  |v r|    S t        |      } |k  r ||   z   |z
  S t        |      } |kD  r ||   z   |z
  S t         fd|D              }t         fd|D              }||   }||   }|||z
   |z
  z  ||z
  z  z   S )Nc              3   .   K   | ]  }|k  s	|  y wr   r   r   rg   r9   s     r   r   z%piecewiseLinearMap.<locals>.<genexpr>=       %!q1uA%   
c              3   .   K   | ]  }|kD  s	|  y wr   r   r   s     r   r   z%piecewiseLinearMap.<locals>.<genexpr>>  r   r   )rB   r8   r7   )r9   r`   rB   rg   abvavbs   `       r   r   r   0  s    <<>DDyqzD	A1u71:~!!D	A1u71:~!!%t%%A%t%%A	B	BbQU#q1u---r   c                 `   ddl m} ddl}|j                  dt        j
                        }|j                  dddd	
       |j                  d      }|j                  dddt               |j                  ddddd       |j                  |       }  || j                         ddlm} | j                  rddlm}  |       }|j                  | j                         |j                   D cg c]  }|j"                   }	}t%        d        ||	       |j'                          t%        d       |j                   D cg c]  }|j"                   }	} ||	       nyt)        t+        d      t+        d      dz         D 
cg c]  }
t-        |
       }}
| j.                  D cg c]-  }t1        t3        |d |j5                  d       D                    / }	}t7        |	      }t%        d!        ||j.                         t%        d"        ||j8                         yc c}w c c}w c c}
w c c}w )#z*Normalize locations on a given designspacer   )configLoggerNzfonttools varLib.models)descriptionz
--loglevelLEVELINFOz Logging level (defaults to INFO))metavarr=   helpT)requiredz-dz--designspaceDESIGNSPACE)r   typez-lz--locationsLOCATION+zFMaster locations as comma-separate coordinates. One must be all zeros.)r   nargsr   )level)pprint)DesignSpaceDocumentzOriginal locations:zNormalized locations:AZr	   c              3   2   K   | ]  }t        |        y wr   )floatrl   s     r   r   zmain.<locals>.<genexpr>r  s     ;E!H;s   ,zSorted locations:z	Supports:)	fontToolsr   argparseArgumentParsermainr   add_argumentadd_mutually_exclusive_groupstr
parse_argsloglevelr   designspacefontTools.designspaceLibr   readsourcesrE   print	normalizer   ordchrr^   dictr/   splitr   r   )argsr   r   parsergroupr   r   docslocscrF   r   s                r   r   r   D  s   &$$!LL % F /	   ///>E	t_m#N	U   T"Dt}}%@!#!!"$'KK0q

00#$t%&$'KK0q

00t %c#hC1 =>1A>>GK~~
BCDT;aggcl;<=
 
 4 E	

5??	+
5>># 1
 1 ?
s   .H?H! H&"2H+__main__r   )F)TFN)r   __all__fontTools.misc.roundToolsr   errorsr
   r   r   r$   r+   r2   r   r   r   objectr   r   r   r   doctestsysr.   argvexittestmodfailedr   r   r   <module>r	     s    + . '-'700
1>/U /dNb\EV \E~
.(5p z
388}qCHH_W__%%& r   