L idZddlddlmZddlmZddlmZmZm Z ddl m Z ddl m Z mZdd lmZdd lmZmZdd lmZdd lmZdd lmZddlmZddlmZddlmZddl m!Z!m"Z"m#Z#ddl$Z$ddl%Z%e$jLdZ'dZ(dZ)dZ*dZ+GddZ, d"de(e)e+dgddZ-ee-dZ.dZ/dZ0d#d Z1e2d!k(r*ddl3Z3e1Z4e3jje6e7e4yy)$z Tool to find wrong contour order between different masters, and other interpolatability (or lack thereof) issues. Call as: $ fonttools varLib.interpolatable font1 font2 ... )*)test_contour_order)test_starting_point) RecordingPenDecomposingRecordingPenlerpRecordings) TransformPen) StatisticsPenStatisticsControlPen)OpenContourError)piecewiseLinearMapnormalizeLocation)floatToFixedToStr) Transform) defaultdict)SimpleNamespace)wraps)pformat)sqrtatan2piNzfontTools.varLib.interpolatablegffffff?g?gMb`?ic*eZdZdZdZdZdZddZy)Glyph) recordings greenStats controlStats greenVectorscontrolVectors nodeTypes isomorphismspoints openContourscp||_|jD]}t||g|j|yN)nameITEMSsetattr _populate)self glyphnameglyphsetitems e/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/fontTools/varLib/interpolatable.py__init__zGlyph.__init__4s4 JJ $D D$ # $ x c|jD]6}tt|||k(st||jd8yr%)r'lengetattrappend)r*ixr-s r._fill_inzGlyph._fill_in:s>JJ 1D74&'2-d#**40 1r0cr||j}|du|_|jrytt|} |j |d|j |_~t|jD]\}}|j Dcgc]\}}| }}}|jj|t|} t|} |j| |j| |jjd|j"j| |j$j| |j&jt)| |j*jt)| |ddk(r|j!|/|ddk(sJ|dd vsJt-} t/| d} |j| |j0j| j g}|j2j|t5| j |dt5| j |dy#t $r|j |Y!wxYwcc}}w#t$r7} |jjd|j!|Yd} ~ ?d} ~ wwxYw) Nr,T)outputImpliedClosingLineFr addComponentmoveTo) closePathendPath)r& doesnt_existPerContourOrComponentPenrdraw TypeErrorvaluer enumerater r4r r replayr#r r6rrrcontour_vector_from_statsrSimpleRecordingPointPenSegmentToPointPenr"r!add_isomorphisms)r*r,glyph perContourPenr5contouropargr rrer" converterr!s r.r)zGlyph._populate?sQ#!TM    0Q  & JJ}tJ D(-- $T__5( ?KB+2==9C9I9 NN ! !) ,&9J/BL z*|,!!((/ OO " ": .    $ $\ 2    $ $%>z%J K    & &'@'N O|~- b!Q<8+ ++R=$<< <<,.F)&%8I NN9 % KK  v|| ,L    $ $\ 2 V\\< ? V\\< >Q( ?  & JJ} % & :$ !!((. b! s/I I0 =I6I-,I-6 J6?,J11J6Nc|#|jD]}|j|y|j|j|yr%)rrA)r*pen countor_idxrLs r.rAz Glyph.drawws@  ?? " S! " OOK ( - -c 2r0r%)__name__ __module__ __qualname__r'r/r6r)rAr0r.rr's E! 1 6?p3r0rF) locations tolerance kinkinessupemshow_all discrete_axesc#D\K|dk\r|dz}d|cxkrdksJJ|dk\r|dz}d|ksJ|xsD cgc] } t| c} }|&D chc]} | jD]} | }} } t|| \\} \fd} |D ]}tj d|D cgc]} t || }} t |Dcgc]}|d c}dkrStt||D]p\}\}} }|jr|s|tj||df1d }t|jD]#\}}|s d }|tj|||d f%|sqrdgt z}| D]}||}| |js| ||}|$||}| |js8|j}|j}t |t |k7r5|tj||||||t |t |d f||k7rtt||D]\}\}}||k(rt |t |k7r6|tj |||||||t |t |d f\tt||D]2\} \}!}"|!|"k7s|tj"|| |||||||!|"d f4t%||\}#}$|#|krC|tj&||||||t)t+t |$|$|#df|$||<|j,}%|j,}&|j.}'|j.}(|j0})|j0}*||}$|$8|&r6|$D+cgc]}+|&|+ }&}+|$D+cgc]}+|(|+ }(}+|$D+cgc]}+|*|+ }*}+g},t|)|*D]O\}-}. t3}/t)t5|-j6|.j6|/_|,j9|/Qtt|%|&D]\}\}0}1|0'|1%t |0dk(st |0t |1k7r4t=|||||$\}#}2}3|#|kr%|tj>|||||||d|2|3|#d f|,|}4|4sy|'|ddk|(|ddkk(stAd}5|4jC|5tE|5}6|'|}7|(|}8|7d|7dz}9|8d|8dz}:|6d|6dz};ttjFtjHfD]\}<}=|tM|9|:z}>tjOd|=|;|>|9|:||z|;dzkDs||z z|;ksY ||;z }#n|;|>z }#tjOd|#||=||||||||#df|jR}|jR}|||r||D+cgc]}+||+ }}+d}?|tTztVz|z }@tt||D]\}\}0}1|0'|1%t |0dk(st |0t |1k7r4t+t |0D]}}+|0|+}A|1|+}B|AdrBds|0|+dz }C|1|+dz }D|0|+dzt |0z}E|1|+dzt |1z}F|CdrDdr\CdrDdrgtYAd}AtYBd}BtYCd}CtYDd}DtYEd}EtYFd}F|A|Cz }G|E|Az }H|B|Dz }I|F|Bz }J|GjZ|Hj\z|Gj\|HjZzz }K|IjZ|Jj\z|Ij\|JjZzz }L Kt_Gt_Hzz}KLt_It_Jzz}Lt_K|?kDst_L|?kDrvGjZHjZz|Gj\|Hj\zz}MIjZJjZz|Ij\|Jj\zz}N|MdksNdkrt_Gt_|Gt_Hzz }Ot_It_|It_Jzz }Pt_|O|Pz }Qt_|Q|?krLABzdz }RCDzdz }SEFzdz }T|R|Sz }U|T|Rz }V|UjZ|Vj\z|Uj\|VjZzz }W Wt_Ut_Vzz}Wt_W||zz|?krWt_Uzt_Vz}Xt_|U|Vz}Yt_|X|Yz }Z|Z@krZYz }[|[|?kDr|?t_W|zz }#tjOdZ[|WQtjOd|#|tj`||||||||+|#df|s|tjb||||||df ycc} wcc} } wcc} wcc}wcc}+wcc}+wcc}+w#t:$r|,j9dYwxYw#tP$rd}#YwxYwcc}+w#tP$rYwxYw#tP$rY'wxYww)N g{Gz?rr)r]c^|y|}|y||||}| |||Sr%rW)ir+ glyphsetsparentss r. grand_parentztest_gen..grand_parents\ 9 AJ 9aj$1i)@)H Aaj$1i)@)Hr0zTesting glyph %s)typemaster master_idxFT)rerfrgrL)remaster_1master_2 master_1_idx master_2_idxvalue_1value_2)repathrhrirjrkrlrm) rernnoderhrirjrkrlrm)rerhrirjrkrlrmrY) rerLrhrirjrkrlrmreversedrYr8z;%s: actual size %g; threshold size %g, master sizes: %g, %ggh㈵>z tolerance %g)rerLrhrirjrkrYg?z=kink: deviation %g; deviation_ratio %g; sin_mid %g; r_diff %g)rerLrhrirjrkrCrY)rerhrirjrk)2reprkeysfind_parents_and_orderloginforr2rDzipr?InterpolatableProblemMISSINGr# OPEN_PATHr PATH_COUNT NODE_COUNTNODE_INCOMPATIBILITYr CONTOUR_ORDERlistranger!rrrr rCr4 ValueErrorrWRONG_START_POINTr rErF UNDERWEIGHT OVERWEIGHTmaxrdebugZeroDivisionErrorr"DEFAULT_KINKINESS_LENGTHDEFAULT_KINKINESScomplexrealimagabsKINKNOTHING)]rbglyphsnamesignore_missingrXrYrZr[r\r]gr,orderrd glyph_name allGlyphsrJrgr&has_openr5open matchingsm1idxglyph1m0idxglyph0m1m0pathIxnodes1nodes2nodeIxn1n2this_tolerancematchingm0Isomorphismsm1Isomorphisms m0Vectors m1Vectors recording0 recording1ra midRecordingc0c1rcontour0contour1proposed_pointreverserLmidStats midVectorm0Vecm1Vecsize0size1midSize overweight problem_type expectedSizetdeviation_thresholdpt0pt1pt0_prevpt1_prevpt0_nextpt1_nextd0_prevd0_nextd1_prevd1_nextsin0sin1dot0dot1r0r1r_diffmidmid_prevmid_nextmid_d0mid_d1sin_midcrossarc_len deviationdeviation_ratiorcs]` @r.test_genrst BT Q   BT >>  1y1!d1g1E ~%.Gx}}G!!G!GG+9MNGU^  #Z0AJKXU:x0K K y>eE,=> ?1 D 3<  9e ,4   /J/$!!%"$9$A$A&**4H%e&8&89 D 5 ? ?"&&0#%  = @FS^+ w Eu%F~V%5%5  3E}u%F~V%5%5 !!B!!B2w#b'! 5 @ @$)%L$)%L(-(-#&r7#&r7  Rx09#b"+0F"%,F,VV' 6{c&k1&(=(H(H(.,1%L,1%L0505+.v;+.v;   !,5c&&6I,J%(R8 *,A,V,V,2,205e 05e 4949/1/1 !" # %!%%"%P(:&&'I $NH ) 5 C C$)%L$)%L(-(-#'c(m(<#=#+%3   $, % $00N#00N++I++I**J**J!'H$=E!F."3!F!F3;jm> >Lj*5 .B.$A">"((BHH#EFAG ''*  .-6NN3-b ((Xx$'8})8}H 5:MFB 8;7"I-"$9$K$K')(-e (-e ,1,1'('5(/)7 .'r* " a 01 4)B-:JQ:NO,d;HNN8, 9( CI%bME%bME!!HuQx/E!!HuQx/E'lYq\9G4=1==1<<5+0 L &+.ue+L Y(#(!! !+|i/G'TX./X(TL94L-Lw-V3#-5AG5KN5<|5KN IInnE *,8/105e 05e 49491?!" # A+ob NBB+%.u%56be66A//2CCiO -6c"bk,B| ((Xx$'8})8}H 5 s8}-nA"1+C"1+Cq6Q 'AH'AH'Q#h-(?@H'Q#h-(?@H{x{ {x{ !3q6*C!3q6*C& 4H& 4H& 4H& 4H"HnG&nG!HnG&nG"<<',,6 9TTD"<<',,6 9TTD!G s7| ;;G s7| ;;4y1}D A  #<<',,6 9TTD"<<',,6 9TTDax4!8 WWG )DEBWWG )DEB b\F6{Q 9/C (8 3q8H (8 3q8H 8^F%^F$kkFKK7&++ :SSG!3v;V#<< 7|y9'<=B $c&k1CK?E!&6/2G #EGO 4I #66 &/'&9O&* %&#g,*B%CNIIW!' IInn="$9$>$>')(-e (-e ,1,1%&)7   En| D 5 = =$)%L$)%L(-(-   ] w O^+2 H$L>\"G<>". ''-.p$5312307t-! !@-! !s)4j h$ j h)2:j ,h/? j  h4 h4 Bj (Ej 1Cj  h9j  h>#j ) i5j  A iBj %j =Cj  j  i) Aj 5 i;Fj 4j E j j1C j =A j i& "j %i& &j ) i8 4j 7i8 8j  j j  j j  j j j j crtt}t|i|D]\}}||j||Sr%)rrrr4)argskwargsproblemsr+problems r.testrIsB4 H&77, 7""7+, Or0cx||vry||||<t||dgD]}t|j|||y)N components)r3recursivelyAddGlyph glyphName)r+r, ttGlyphSetglyf components r.rrQsNH$Y/HYT)_lB?M I//:tLMr0cvtjj|}|rtj|d|S)NT)exist_ok)osrndirnamemakedirs)rnrs r.ensure_parent_dirrZs*ggood#G Gd+ Kr0c (bcddl}ddl}|jdtj}|j ddd|j d d d |j d dt d tz|j ddt dtz|j dd d|j ddd|j ddd|j ddd|j dd d|j ddd|j dd d|j dd td!d"#|j d$d%td&d'(|j d)d*d d+|j d,d d-|j|}dd.l m }||jrd/nd01|jr |d21|jr|jj!nd}dd3lm}g}g}g} t'} t(} t+|j,} t/|j,d4k(rd} |j,dj1d5r[dd6lm}|j7|j,d} | j8Dcgc]}|j:c}|_| j8Dcgc]}|j<} }| j>Dchc]}tA|d7r|jB} }| j>Dcic]>}|jB| vr.|jB|jD|jF|jHf@}}| j>Dcic]}|jB|jJc}c|jMDcic]\}t+cfd8|D}}}nQ|j,dj1d9rgdd:l'm(}m)}||j,d}|jT} ||} | j8Dcgc]}|jV}}|Dcgc]1}|jXjZd;|jXj\3}}g|_| j8Dcgc]}|j<} }| j>Dcic]0}|jB|jD|jF|jHf2}}| j>Dcic]}|jB|jJc}c|jMDcic]\}t+cfd<|D}}}n|j,dj1d=s|j,dj1d>rdd?l/m0}||j,d}|d@jb} |dA}ib|j>D]3}|jd|jf|jhdBb|jj<5dC}dD|vr|dD}tm|jndEdrbDcic] }|dFdd4dB c}bdG}n_|jpjMD]B\} }!b| js}"|!jMD]\}#}$tu|#|"b| |$<Di}%twtx}&dH|vr|dH}'|dI}(|#t{|'j|j}|D]})|'j||)D]}*i}+g},t{|*j>jMD]#\}}-|-d4|+|<|,j||-d4f%t+|,}.|.|%vr|j|+dGdCJ|%|.<t|)|&|.|%|.|(ndK|vr|dAj>}/|dKjjd}0|0j}1|t{|1j}|D]j})|1|)}2|2j}3tm|3dLdh}4tm|3dLd}5d}6t|2jD]4}7|7dMk(r|4j|5n|7dLk(rt|6tsJ|6}5|7}66tA|3dNs|3jj}8|4D]}5|8j|5}9|9jD]}:|8jj|:};i}+g},t|;jD]8\}<}|/|<jj}|j}-|-|+|<|,j||-f:t+|,}.|.|%vr|j|+dGdCJ|%|.<|&|.}=|%|.|)|=|)<mdOg}|jg}ig} t{bjDcic]}|dB}}t{|&jdPQD]h}.dRdSjbfdT|.DzdRz}>|r|>dUz }>|j|>|j|&|.| jty|.jdG|_Ug|_| s|D?cgc]}?i} }?|j,D]}@|@j1dVrGddWlVmW}A|A@}t}B|j|B|Bjb} |j|n.dd?l/m0}|@}|d@jb} |j||j|@jdXd4dt/|dYkrtjdZyg}&|D]R}tA|d[r|j}=n|}=|&j|=jDcic]}||=| c}T|jBrmt'|jB}Ct||&D>=cgc] \}>}=|>Cvr|= }&}>}=t|| D>#cgc] \}>}#|>Cvr|# } }>}#|D>cgc] }>|>Cvs|> }}>|s9t{t'|&D=Dcgc]}=|=jD]}D|Dc}D}=}t'|}E|&D]/}=t'|=j}FE|Fz }G|Gs$GD]}Dd|=|D< 1| D,Hcgc]9},it|,|,jMDHcic] \}}H|| vs |Hc}H};} }},}H|jxst}I|j |jnt}J tjYd\t/|&tjYd]t| t|&||| | |jIJ|j| ^ }Ktwt}L|j |jntt|jd_}|js-|jr@ddlj}MKD]\})}NL|)j|NtMjL|`nd}OKD]\})}PL|)j|P|)Ok7rtda|)db|`|)}Od}QdcPvrPdcfn Pdd|Pdef}R|RQk7r5dfPvrPdffn Pdg|Pdhf}Stdidjj|Sz|`R}QPdktjk(rtdlPdfz|`Pdktjk(rtdmPdfz|`Pdktjk(r"tdnPdo|Pdg|Pdp|Pdhfz|`Pdktjk(r&tdqPdr|Pdo|Pdg|Pdp|Pdhfz|`KPdktjk(r*tdsPdt|Pdr|Pdo|Pdg|Pdp|Pdhfz|`Pdktjk(r'tduPdodv|Pdgdj|Pdpdv|Pdh|`Pdktjk(r*tdwPdx|Pdo|Pdg|Pdp|Pdh|Pdyfz|`Pdktjk(rtdzPdx|Pdg|Pdhfz|`<Pdktjk(rtd{Pdx|Pdg|Pdhfz|`pPdktjk(r"td|Pdx|Pd}|Pdg|Pdhfz|`Pdktjk(std~Pdgd|Pdh|`nKD]\})}NL|)j|NtL}LdD]}Ptm||P}T|TtjYdPjTd4dl{m|}Um}}V|Pdk(rUnV}W|WtT|&|5}X|Xj| IJLrXjLXjL|Ls|jsXjLr"Xj|Xjddd|jrtjYd|jd4dl{m}Yg}Zi}[|Y|Z|&|5}\|\j| dCIJLjMD]*\}]}^|][t/Z<\j|]|^idCdC,Ls|js\jdddddl}_tt|jd5}|jd|jd|jdtZD]\}`}\|`[vr)|jd[`djd|jdjd|j_j\|jd|jd|jddddLrLSycc}wcc}wcc}wcc}wcc}wcc}}wcc}wcc}wcc}wcc}wcc}wcc}}wcc}wcc}wcc}?wcc}wcc}=}>wcc}#}>wcc}>wcc}D}=wcc}H}wcc}H}},w#1swYCxYw#1swYxYw#1swYxYw#t$r2}aaxj| z c_tj|ad}a~awwxYw)z/Test for interpolatability issues between fontsrNzfonttools varLib.interpolatable) descriptionz--glyphsstorez&Space-separate name of glyphs to check)actionhelpz --show-all store_truez3Show all glyph pairs, even if no problems are foundz --tolerancez,Error tolerance. Between 0 and 1. Default %s)rrerz --kinkinessz)How aggressively report kinks. Default %sz--jsonzOutput report in JSON formatz--pdfzOutput report in PDF formatz--psz"Output report in PostScript formatz--htmlzOutput report in HTML formatz--quietz%Only exit with code 1 or 0, no outputz--outputz3Output file for the problem report; Default: stdoutz--ignore-missingzzmain..#S1+AtM!4D/EFS"%)z.glyphsz.glyphspackage)GSFontto_designspace-c3NK|]}t|tywr%rrs r.r zmain..rrz.ttfz.otf)TTFontheadfvar)r<rrFavarVarStorer<Tgvarr)location normalized recalcBoundsCFF2vsindexblendvstorez''ct||fSr%)r2)r s r.zmain..esCFA;r0)key' c 3`K|]%\}}|dtt||d'yw)=N)rr)r r r  axisMappings r.r zmain..hs< !Aq - 21k!n Er s+.z (normalized)z.ufo) UFOReader.rqz9Font file does not seem to be variable. Nothing to check. getGlyphSetzRunning on %d glyphsetsz Locations: %s) rrrXr[rrYrZr\r]w)filezGlyph z was not compatible:rgrjrkrfrhriz Masters: %s:z, rez" Glyph was missing in master %sz' Glyph has an open path in master %sz* Path count differs: %i in %s, %i in %srlrmz5 Node count differs in path %i: %i in %s, %i in %srnz7 Node %o incompatible in path %i: %s in %s, %s in %sroz Contour order differs: z in zD Contour %d start point differs: %s in %s, %s in %s; reversed: %srLrpz3 Contour %d interpolation is underweight: %s, %sz2 Contour %d interpolation is overweight: %s, %sz' Contour %d has a kink at %s: %s, %srCz Showing z and )pspdfzWriting %s to %s)InterpolatablePSInterpolatablePDFr/)rbr)rYrZzWriting HTML to %s)InterpolatableSVG)show_tolerancerYrZ)r4show_page_numberwbs sN s6fonttools varLib.interpolatable report z

Glyph z

zutf-8z$ s
s )argparsesysArgumentParsermain__doc__ add_argumentfloatDEFAULT_TOLERANCErstr parse_args fontToolsrverboserrsplitos.pathrset DEFAULT_UPEMtuplerr2endswithfontTools.designspaceLibrfromfilesourcesrnraxeshasattrr&rdefaultmaximummapitems glyphsLibrrupmfontrv familyName styleNamefontTools.ttLibr unitsPerEmminValue defaultValuemaxValueaxisTagr3tablesegmentscopyrrrsorted variationsrsr4r,rcff topDictIndex CharStringsprivaterDprogramadd isinstanceintr  otVarStoreVarDataVarRegionIndex VarRegionListRegion VarRegionAxis PeakCoordjoinrfontTools.ufoLibr*rreadInforsplitruwarningrwrrYrZrrr\routputstdoutrrquietjsonprintdumpsrxryrzr{r|r}r~rrrrr sort_problemsupperinterpolatablePlotr1r2add_title_page add_summary add_problems draw_cupcake add_indexadd_table_of_contentshtmlr3base64writeencode b64encode Exceptionrerror)drr7r8parserrrrfontsrrXr]r[original_args_inputs designspacerrfa axis_triplesr vvrrgsfontsourcefrrTraxisrrtagr\r^ fvarMappingrrC ttGlyphSetsrbrrr+varlocDictlocvallocTuplefvarAxescff2 charstringscsre vsindicesrlast_oprMvarStorevarData regionIndexregion axisIndexr,r&_filenamer*rvaccepted_namesgn glyphsSetglyphSetGlyphNamesdiffr rYrZ problems_genrryrlast_glyphnameplast_master_idxs master_idxs master_namesrNr1r2 PlotterClassdocr3svgs glyph_startssvgrJglyph_problemsrrarOr)r sd ` @@r.r:r:asv  $ $)LL%F  5   B    ;>O O     8;L L    +   *   1   +   4   B   K    b    V  k,EUV  ,=UV   T "D&$,,I? zz7#$(KKT[[   TF E EIEM D - 4;;1 ;;q> " "> 2 D-66t{{1~FK5@5H5HI66;;IDK7B7J7JKVKIK + 0 098MM %))66.AIIqyy99L 5@4D4DEqQVVQUU]EM*//1Ar5SPRSSSL [[^ $ $%B C 8DKKN+F::D(0K/:/B/BCVV[[CECNST 1 11663C3CDTETDK7B7J7JKVKIKCNCSCS>?AIIqyy99L5@4D4DEqQVVQUU]EM*//1Ar5SPRSSSL [[^ $ $V , A0G0G0O .$++a.)D<**D#DOO$8$8$:;F!'I#y9"$ (.sxx~~/?(@6HC+.q6GCLJJSV}56$):#;6484D4D)0TPU5E5K1,%y':K#K$4$4$67F!'-SI$Y/B jjG"))Q!? @I%gy!>#39NO 1hh %-    O+D T" Yx01  h0' 1*#'D DK !&'AR' 'KK;   V $ 2X&D"$D MM$ ??D LL  .(#D<**D LL  Xh'..sA6q9:!;$ 5zA~ OPID 4 ''')HH(--/BQ!Xa[.BC D yyTYY#&eY"7 h~%   #&eY"7 h~%   #(B$4>+ABB  THHMMOTbRTRTUVF I$ 1--  $#  $ $    \2 # B1qM/Aq!tB I3"3I"&.."<BSIm *C N; ')"45 ..]]'  t${{" JJ' 4c: zzyy*68&IwY'..w78djj*3!%$0BLIqY'..q1 N2yk1EFQO)2+/((1,<*/>1BC #&66 (1}x[N"#J-:!?% $))L2IIPQR+6(y$9$A$AA@1X;NUV6&;&E&EEE( S!"6&;&F&FFH !) !* !) !* "# 6&;&F&FFS !& !) !* !) !* "# 6&;&P&PPU !& !& !) !* !) !* "# 6&;&I&II!") !* !) !* "# 6&;&M&MMb !) !) !* !) !* !* "# 6&;&G&GGQ !) !* !*  "#6&;&F&FFP !) !* !*  "#6&;&@&@@E !) !' !* !* "# 6&;&C&CC!"* !*  "# wBH'3 4" 7#**73 4!* 0A$"C{ HH'C 8 O/0Dy+>OL!#&)5 0""(I#OOH-  * $$&MMO--/ 0 0 00 99 HH)499 5 =DL"49EJ 'c""(#('' # .6^^-=)E>.3LT+$$/',).%  $$& '" ' 2D9 -Q,-fRS'o'FAsL(*\!_,=W E L LW UVGGBII'RSGGF,,S12GGI&GGI& '+, -(GJK FDTKF2#U~P4(<C  CUCz 0 0* ' '& - -  && !  sLAN/ANAN$ANAAN!AN& AN+ AN1&6AN63AN;5AOAO AO  AO AO AO9 AO ?AO$!AO*8 AO0AO0AO5%AP- AO;:AO;?AP=OAP.BB$AP.D+A=APF(AAP.G6A2API(,AP.JC1AP"NAP.O;APPAP P AP.PAPPAP.P"AP+P'AP.P. AQ*P8-AQ%Q%AQ*__main__)NNFr%)8r;interpolatableHelpersinterpolatableTestContourOrderrinterpolatableTestStartingPointrfontTools.pens.recordingPenrrr fontTools.pens.transformPenr fontTools.pens.statisticsPenr r fontTools.pens.momentsPenr fontTools.varLib.modelsrrfontTools.misc.fixedToolsrfontTools.misc.transformr collectionsrtypesr functoolsrpprintrmathrrrloggingr getLoggerrur>rrrFrrrrrr:rTr8rexitriboolrWr0r.rs%>@ 5L6I7.#!  g9:  U3U3t   G   GTxMQ h zvH CHHSh ! r0