ó
    oñ:iG† ã                   óÊ   • S SK Jr  S SKJrJrJr  S SKJr  S SKJ	r	  S SK
JrJrJr  S SKJs  Jr  S SKrS SKrS SKr\R(                  " \5      r " S S\5      r " S	 S
\5      rg)é    )ÚFeatureLibError)ÚLexerÚIncludingLexerÚNonIncludingLexer)ÚVariableScalar)ÚgetEncoding)ÚbytechrÚtobytesÚtostrNc                   ó:  • \ rS rSrSr0 r\r\" SS5       V Vs1 s H  nSU-  iM
     snn r\" SS5       V Vs1 s H  nSU-  iM
     snn r	 SlS	 jr
S
 rS rS rS rS rS rS rS rS rS rSmS jrS rS rS rS rS rS rS rS rS rS rS r S  r!S! r"S" r#S# r$S$ r%S% r&S& r'S' r(S( r)S) r*S* r+S+ r,S, r-S- r.S. r/S/ r0S0 r1S1 r2S2 r3S3 r4\5S4 5       r6\5S5 5       r7S6 r8S7 r9S8 r:S9 r;S: r<S; r=S< r>S= r?S> r@S? rAS@ rBSA rCSB rDSC rESD rFSE rGSF rHSmSG jrISH rJSI rKSJ rLSK rMSL rNSM rOSN rP SnSO jrQSP rRSQ rSSR rTSS rUST rVSU rWSV rXSW rYSX rZSY r[SZ r\S[ r]S\ r^SmS] jr_S^ r`S_ raS` rbSa rcSb rdSc reSd rfSe rgSf rhSmSg jri\5Sh 5       rjSi rkSj rlSkrmgs  snn f s  snn f )oÚParseré   aÆ  Initializes a Parser object.

Example:

    .. code:: python

        from fontTools.feaLib.parser import Parser
        parser = Parser(file, font.getReverseGlyphMap())
        parsetree = parser.parse()

Note: the ``glyphNames`` iterable serves a double role to help distinguish
glyph names from ranges in the presence of hyphens and to ensure that glyph
names referenced in a feature file are actually part of a font's glyph set.
If the iterable is left empty, no glyph name in glyph set checking takes
place, and all glyph tokens containing hyphens are treated as literal glyph
names, not as ranges. (Adding a space around the hyphen can, in any case,
help to disambiguate ranges from glyph names containing hyphens.)

By default, the parser will follow ``include()`` statements in the feature
file. To turn this off, pass ``followIncludes=False``. Pass a directory string as
``includeDir`` to explicitly declare a directory to search included feature files
in.
é   é   zss%02déd   zcv%02dNc           	      ó¨  • SU;   a2  SSK Jn  U" SS5        U(       a  [        S5      eUR                  S5      nU(       a:  [        S[	        U5      S:X  a  SOS	< S
SR                  S U 5       5      < 35      e[        U5      U l        U R                  R                  5       U l
        [        5       U l        [        5       U l        [        5       U l        [        5       U l        U R                  U R                  1U l        Su  U l        U l        / U l        S U l        U(       a  [*        O[,        nU" XS9U l        0 U l        U R3                  SS9  g )NÚglyphMapr   )ÚdeprecateArgumentz#use 'glyphNames' (iterable) insteadz?'glyphNames' and (deprecated) 'glyphMap' are mutually exclusivezunsupported keyword argumentr   Ú Úsz: z, c              3   ó8   #   • U  H  n[        U5      v •  M     g 7f©N)Úrepr)Ú.0Úks     ÚZ/srv/projetos/modelo_ml_acdoc/venv/lib/python3.13/site-packages/fontTools/feaLib/parser.pyÚ	<genexpr>Ú"Parser.__init__.<locals>.<genexpr><   s   é € Ð=VÊvÈ!¼dÀ1¿g¸gÊvùs   ‚©NN)Ú
includeDirT©Úcomments)ÚfontTools.misc.loggingToolsr   Ú	TypeErrorÚpopÚlenÚjoinÚsetÚglyphNames_ÚastÚFeatureFileÚdoc_ÚSymbolTableÚanchors_Úglyphclasses_Úlookups_Úvaluerecords_Úsymbol_tables_Únext_token_type_Únext_token_Úcur_comments_Únext_token_location_r   r   Úlexer_ÚmissingÚadvance_lexer_)ÚselfÚfeaturefileÚ
glyphNamesÚfollowIncludesr    Úkwargsr   Ú
lexerClasss           r   Ú__init__ÚParser.__init__-   s$  € ð ˜ÓÝEá˜jÐ*OÔPÞÜØXóð ð  Ÿ™ JÓ/ˆJÞÝä˜V›¨Ó)‘2¨sÒ2°D·I±IÑ=VÉvÓ=VÕ4VðXóð ô
 ˜z›?ˆÔØ—H‘H×(Ñ(Ó*ˆŒ	Ü#›ˆŒÜ(›]ˆÔÜ#›ˆŒÜ(›]ˆÔØ#Ÿ}™}¨d×.@Ñ.@ÐAˆÔØ2>Ñ/ˆÔ˜tÔ/ØˆÔØ$(ˆÔ!Þ'5•^Ô;Lˆ
Ù  ÑDˆŒØˆŒØ×Ñ TÐÒ*ó    c           	      óH	  • U R                   R                  nU R                  c  U R                  (       Gaö  U R	                  SS9  U R
                  [        R                  L a?  UR                  U R                  R                  U R                  U R                  S95        GOgU R                  S5      (       a!  UR                  U R                  5       5        GO0U R
                  [        R                  L a!  UR                  U R!                  5       5        GOòU R                  S5      (       a!  UR                  U R#                  5       5        GO»U R                  S5      (       a!  UR                  U R%                  5       5        GO„U R                  S5      (       a!  UR                  U R'                  5       5        GOMU R                  S	5      (       a   UR                  U R)                  S
S95        GOU R                  S5      (       a!  UR                  U R+                  5       5        GOàU R                  S5      (       a!  UR                  U R-                  5       5        GO©U R                  S5      (       a!  UR                  U R/                  5       5        GOrU R                  S5      (       a   UR                  U R-                  SS95        GO<U R                  S5      (       a!  UR                  U R1                  5       5        GOU R                  S5      (       a  UR                  U R3                  S
S95        OÐU R
                  [        R4                  L aI  U R                  U R6                  ;   a/  UR                  U R6                  U R                     " U 5      5        OjU R
                  [        R8                  L a  U R                  S:X  a  GM·  [;        SR=                  U R
                  U R                  5      U R                  5      eU R                  b  GMâ  U R                  (       a  GMö  U R>                  (       aU  U R>                  RA                  5        VVs/ s H  u  p#SU< SU< S3PM     nnn[;        SSRC                  U5      -   S5      eU R                   $ s  snnf )z«Parse the file, and return a :class:`fontTools.feaLib.ast.FeatureFile`
object representing the root of the abstract syntax tree containing the
parsed contents of the file.NTr!   ©ÚlocationÚinclude©ÚanonÚ	anonymousÚ	anchorDefÚlanguagesystemÚlookupF©ÚverticalÚ	markClassÚfeatureÚconditionsetÚ	variation)rR   ÚtableÚvalueRecordDefÚ;zbExpected feature, languagesystem, lookup, markClass, table, or glyph class definition, got {} "{}"Ú z (first found at Ú)zMThe following glyph names are referenced but are missing from the glyph set:
Ú
)"r,   Ú
statementsr3   r5   r9   Úcur_token_type_r   ÚCOMMENTÚappendr*   ÚCommentÚ
cur_token_Úcur_token_location_Úis_cur_keyword_Úparse_include_Ú
GLYPHCLASSÚparse_glyphclass_definition_Úparse_anonymous_Úparse_anchordef_Úparse_languagesystem_Úparse_lookup_Úparse_markClass_Úparse_feature_block_Úparse_conditionset_Úparse_table_Úparse_valuerecord_definition_ÚNAMEÚ
extensionsÚSYMBOLr   Úformatr8   Úitemsr'   )r:   rY   ÚnameÚlocÚerrors        r   ÚparseÚParser.parseN   s¢  € ð —Y‘Y×)Ñ)ˆ
Ø×#Ñ#Ñ/°4×3E×3EÐ3EØ×Ñ¨ÐÑ.Ø×#Ñ#¤u§}¡}Ò4Ø×!Ñ!Ø—H‘H×$Ñ$ T§_¡_¸t×?WÑ?WÐ$ÐXöð ×%Ñ% i×0Ñ0Ø×!Ñ! $×"5Ñ"5Ó"7Ö8Ø×%Ñ%¬×)9Ñ)9Ò9Ø×!Ñ! $×"CÑ"CÓ"EÖFØ×%Ñ%Ð&;×<Ñ<Ø×!Ñ! $×"7Ñ"7Ó"9Ö:Ø×%Ñ% k×2Ñ2Ø×!Ñ! $×"7Ñ"7Ó"9Ö:Ø×%Ñ%Ð&6×7Ñ7Ø×!Ñ! $×"<Ñ"<Ó">Ö?Ø×%Ñ% h×/Ñ/Ø×!Ñ! $×"4Ñ"4¸eÐ"4Ð"DÖEØ×%Ñ% k×2Ñ2Ø×!Ñ! $×"7Ñ"7Ó"9Ö:Ø×%Ñ% i×0Ñ0Ø×!Ñ! $×";Ñ";Ó"=Ö>Ø×%Ñ% n×5Ñ5Ø×!Ñ! $×":Ñ":Ó"<Ö=Ø×%Ñ% k×2Ñ2Ø×!Ñ! $×";Ñ";ÀdÐ";Ð"KÖLØ×%Ñ% g×.Ñ.Ø×!Ñ! $×"3Ñ"3Ó"5Ö6Ø×%Ñ%Ð&6×7Ñ7Ø×!Ñ! $×"DÑ"DÈeÐ"DÐ"TÕUà×$Ñ$¬¯
©
Ò2Ø—O‘O t§¡Ó6à×!Ñ! $§/¡/°$·/±/Ò"BÀ4Ó"HÕIØ×%Ñ%¬¯©Ò5¸$¿/¹/ÈSÓ:PÚä%ðDßDJÁFØ×,Ñ,¨d¯o©oóEð ×,Ñ,óð ðM ×#Ñ#Ô/°4×3E×3EÒ3Eð\ �<�<ð "&§¡×!3Ñ!3Ô!5ôâ!5‘I�D˜#ó .2³3Ó7Ù!5ð ñ ô "ðØ"&§)¡)¨EÓ"2ñ4àóð ð
 �y‰yÐùós   ÑRc           
      ó”  • U R                  S5        U R                  S5        U R                  nU R                  S:X  a#  U R                  S5        U R                  S5        g U R                  [
        R                  :X  a•  U R                  5       nU R                  R                  U5      nUc  [        SU-  U R                  5      eU R                  S5        U R                  R                  UR                  UR                  UUR                  S S US9$ U R!                  SS9U R!                  SS9pTS nU R                  S	:X  a!  U R                  S	5        U R!                  5       nU R                  S:X  a!  U R#                  5       nU R#                  5       nOS
u  pxU R                  S5        U R                  R                  UUS UUUUS9$ )NÚ<ÚanchorÚNULLÚ>zUnknown anchor "%s")rr   ÚcontourpointÚxDeviceTableÚyDeviceTablerE   T©Úvariabler|   r   )Úexpect_symbol_Úexpect_keyword_r_   r4   r3   r   rm   Úexpect_name_r.   Úresolver   r*   ÚAnchorÚxÚyr|   Úexpect_number_Úparse_device_)	r:   rE   rr   Ú	anchordefr†   r‡   r|   r}   r~   s	            r   Úparse_anchor_ÚParser.parse_anchor_�   sÀ  € ð 	×Ñ˜CÔ Ø×Ñ˜XÔ&Ø×+Ñ+ˆà×Ñ˜vÓ%Ø× Ñ  Ô(Ø×Ñ Ô$Øà× Ñ ¤E§J¡JÓ.Ø×$Ñ$Ó&ˆDØŸ™×-Ñ-¨dÓ3ˆIØÑ Ü%Ø)¨DÑ0°$×2JÑ2Jóð ð ×Ñ Ô$Ø—8‘8—?‘?Ø—‘Ø—‘ØØ&×3Ñ3Ø!Ø!Ø!ð #ð ð ð ×"Ñ"¨DÐ"Ð1°4×3FÑ3FÐPTÐ3FÐ3Uˆ1àˆØ×Ñ˜~Ó-Ø× Ñ  Ô0Ø×.Ñ.Ó0ˆLà×Ñ˜sÓ"Ø×-Ñ-Ó/ˆLØ×-Ñ-Ó/‰Là)3Ñ&ˆLà×Ñ˜CÔ Ø�x‰x�‰ØØØØ%Ø%Ø%Øð ð 
ð 	
rB   c                 óþ   • / nU R                   S:X  aj  U R                  5       nUc  U R                   S:w  a  M5  U R                  S5        U R                  5       nUR	                  X#45        U R                   S:X  a  Mj  U$ )Nrx   Úmark)r4   r‹   r‚   Úexpect_markClass_reference_r\   )r:   ÚanchorMarksry   rO   s       r   Úparse_anchor_marks_ÚParser.parse_anchor_marks_Ã   s}   € àˆØ×Ñ #Ó%Ø×'Ñ'Ó)ˆFØ‰~ $×"2Ñ"2°fÓ"<ÙØ× Ñ  Ô(Ø×8Ñ8Ó:ˆIØ×Ñ Ð2Ô3ð ×Ñ #Õ%ð ÐrB   c                 ó   • U R                  S5      (       d   eU R                  nU R                  5       U R                  5       p2S nU R                  S:X  a!  U R	                  S5        U R                  5       nU R                  5       nU R                  S5        U R                  R                  XRX4US9nU R                  R                  XV5        U$ )NrJ   r|   rU   )r|   rE   )r`   r_   rˆ   r4   r‚   rƒ   r�   r*   ÚAnchorDefinitionr.   Údefine)r:   rE   r†   r‡   r|   rr   rŠ   s          r   re   ÚParser.parse_anchordef_Ï   sÂ   € à×#Ñ# K×0Ñ0Ð0Ð0Ø×+Ñ+ˆØ×"Ñ"Ó$ d×&9Ñ&9Ó&;ˆ1ØˆØ×Ñ˜~Ó-Ø× Ñ  Ô0Ø×.Ñ.Ó0ˆLØ× Ñ Ó"ˆØ×Ñ˜CÔ Ø—H‘H×-Ñ-Ø�Q¸Hð .ð 
ˆ	ð 	�‰×Ñ˜TÔ-ØÐrB   c                 ó^  • U R                  S5      (       d   eU R                  5       nU R                  R                  U5      u  p#nU R	                  5         U R                  S5        U R                  5       nX:X  d   S5       eU R                  S5        U R                  R                  XUS9$ )NrG   Ú}z-bad splitting in Lexer.scan_anonymous_block()rU   rD   )r`   Úexpect_tag_r7   Úscan_anonymous_blockr9   r�   r*   ÚAnonymousBlock)r:   ÚtagÚ_ÚcontentrE   Úend_tags         r   rd   ÚParser.parse_anonymous_à   s¡   € à×#Ñ#Ð$9×:Ñ:Ð:Ð:Ø×ÑÓ ˆØ#Ÿ{™{×?Ñ?ÀÓDÑˆ�HØ×ÑÔØ×Ñ˜CÔ Ø×"Ñ"Ó$ˆØ‹~ÐNÐNÓNˆ~Ø×Ñ˜CÔ Ø�x‰x×&Ñ& s¸hÐ&ÐGÐGrB   c                 ób  • U R                  S5      (       d   eU R                  nU R                  SS9nU R                  5       1nU R                  S:w  a1  UR                  U R                  5       5        U R                  S:w  a  M1  U R                  S5        U R                  R                  X#US9$ )NÚAttachT©Úaccept_glyphnamerU   rD   )	r`   r_   Úparse_glyphclass_rˆ   r4   Úaddr�   r*   ÚAttachStatement)r:   rE   ÚglyphsÚcontourPointss       r   Úparse_attach_ÚParser.parse_attach_ì   s¥   € à×#Ñ# H×-Ñ-Ð-Ð-Ø×+Ñ+ˆØ×'Ñ'¸Ð'Ð>ˆØ×,Ñ,Ó.Ð/ˆØ×Ñ #Ó%Ø×Ñ˜d×1Ñ1Ó3Ô4ð ×Ñ #Õ%à×Ñ˜CÔ Ø�x‰x×'Ñ'¨ÈÐ'ÐQÐQrB   c                 óf   • U R                   S;   d   eU R                  5         U R                  SUS9$ )N>   ÚenumÚ	enumerateT©Ú
enumeratedrN   )r^   r9   Úparse_position_)r:   rN   s     r   Úparse_enumerate_ÚParser.parse_enumerate_÷   s7   € à�‰Ð"7Ó7Ð7Ð7Ø×ÑÔØ×#Ñ#¨t¸hÐ#ÐGÐGrB   c                 ó  • U R                  S5      (       d   eU R                  nU R                  S:w  a  U R                  SS9nOS nU R	                  S5        U R                  S:w  a  U R                  SS9nOS nU R	                  S5        U R                  S:w  a  U R                  SS9nOS nU R	                  S5        U R                  S:w  a  U R                  SS9nOS nU R	                  S5        U R
                  R                  X$X5US9$ )NÚGlyphClassDefÚ,Fr£   rU   rD   )r`   r_   r4   r¥   r�   r*   ÚGlyphClassDefStatement)r:   rE   Ú
baseGlyphsÚligatureGlyphsÚ
markGlyphsÚcomponentGlyphss         r   Úparse_GlyphClassDef_ÚParser.parse_GlyphClassDef_ý   s  € à×#Ñ# O×4Ñ4Ð4Ð4Ø×+Ñ+ˆØ×Ñ˜sÓ"Ø×/Ñ/ÀÐ/ÐG‰JàˆJØ×Ñ˜CÔ Ø×Ñ˜sÓ"Ø!×3Ñ3ÀUÐ3ÐK‰Nà!ˆNØ×Ñ˜CÔ Ø×Ñ˜sÓ"Ø×/Ñ/ÀÐ/ÐG‰JàˆJØ×Ñ˜CÔ Ø×Ñ˜sÓ"Ø"×4Ñ4ÀeÐ4ÐL‰Oà"ˆOØ×Ñ˜CÔ Ø�x‰x×.Ñ.Ø NÈhð /ð 
ð 	
rB   c                 ó   • U R                   U R                  p!U R                  S5        U R                  SS9nU R                  S5        U R                  R                  X#US9nU R                  R                  X$5        U$ )NÚ=Fr£   rU   rD   )r_   r^   r�   r¥   r*   ÚGlyphClassDefinitionr/   r•   )r:   rE   rr   r¨   Ú
glyphclasss        r   rc   Ú#Parser.parse_glyphclass_definition_  su   € à×1Ñ1°4·?±?�$Ø×Ñ˜CÔ Ø×'Ñ'¸Ð'Ð?ˆØ×Ñ˜CÔ Ø—X‘X×2Ñ2°4È(Ð2ÐSˆ
Ø×Ñ×!Ñ! $Ô3ØÐrB   c                 ó  • UR                  S5      n/ n[        [        U5      5       H]  nSR                  USU 5      SR                  X5S  5      pvX`R                  ;   d  M:  XpR                  ;   d  MK  UR                  Xg45        M_     [        U5      S:X  a
  US   u  pgXg4$ [        U5      S:X  a  [        SU-  U5      eSR                  U VV	s/ s H  u  p‰SU< SU	< S3PM     sn	n5      n
[        SU< S	U
< S
3U5      es  sn	nf )NÚ-r   r   zU"%s" is not a glyph in the font, and it can not be split into a range of known glyphsz or Ú"z - zAmbiguous glyph range "z"; please use z to clarify what you mean)ÚsplitÚranger&   r'   r)   r\   r   )r:   rr   rE   ÚpartsÚ	solutionsÚiÚstartÚlimitr   ÚlÚrangess              r   Úsplit_glyph_range_ÚParser.split_glyph_range_#  s  € ð& —
‘
˜3“ˆØˆ	Ü”s˜5“zÖ"ˆAØŸ8™8 E¨!¨A JÓ/°·±¸%À¸)Ó1D�5Ø×(Ñ(Õ(¨U×6FÑ6FÕ-FØ× Ñ  % Ö0ñ #ô ˆy‹>˜QÓØ$ Q™<‰LˆEØ�<ÐÜ�‹^˜qÓ Ü!ð/Ø15ñ6àóð ð —[‘[Á9Ô!MÂ9¹4¸1¸a³³AÓ"6Á9Ò!MÓNˆFÝ!ã<@Ã&ðJàóð ùó "Ns   ÃD
c           	      ó  • U(       a¼  U R                   [        R                  [        R                  4;   aŽ  U(       aC  U R                  S:X  a3  U R                  5         U R                  R                  U R                  S9$ U R                  5       nU R                  U5        U R                  R                  X0R                  S9$ U R                   [        R                  L aÅ  U R                  5         U R                  R                  U R                  5      nUc#  [!        SU R                  -  U R                  5      e[#        X@R                  R$                  5      (       a#  U R                  R'                  X@R                  S9$ U R                  R)                  X@R                  S9$ U R+                  S5        U R                  nU R                  R-                  US9nU R                  S:w  GaŒ  U R                   [        R                  L GaY  U R                  5       nU R                  nSU;   ah  U R.                  (       aW  X0R.                  ;  aH  U R1                  X55      u  pxU R                  Xx5        UR3                  XxU R5                  XWU5      5        GOÑU R                  S:X  aX  UnU R+                  S5        U R                  5       nU R                  Xx5        UR3                  XxU R5                  XWU5      5        GOiSU;   a=  U R.                  (       d,  [6        R9                  [;        [!        SU< 3U5      5      5        U R                  U5        UR=                  U5        GOU R                   [        R                  L aÌ  U R                  5       nU R                  S:X  ax  U R                  n	U R                  n
U R+                  S5        U R?                  5       nU R                  SU
S	 3SUS	 35        URA                  U
UU RC                  XšU5      5        GOMSU R                  S	 3nU R                  U5        UR=                  U5        GOU R                   [        R                  L aØ  U R                  5         U R                  R                  U R                  5      nUc#  [!        SU R                  -  U R                  5      e[#        X@R                  R$                  5      (       a$  U R                  R'                  X@R                  S9nO#U R                  R)                  X@R                  S9nURE                  U5        O$[!        S
U R                  < 3U RF                  5      eU R                  S:w  a  GMŒ  U R+                  S5        U$ )Nrz   rD   zUnknown glyph class @%sÚ[Ú]rÄ   z.Ambiguous glyph name that looks like a range: ÚcidÚ05dzBExpected glyph name, glyph range, or glyph class reference, found )$r3   r   rm   ÚCIDr4   r9   r*   Ú	NullGlyphr_   Úexpect_glyph_Úcheck_glyph_name_in_glyph_setÚ	GlyphNamerb   r/   r„   r^   r   Ú
isinstanceÚ	MarkClassÚMarkClassNameÚGlyphClassNamer�   Ú
GlyphClassr)   rÏ   Ú	add_rangeÚmake_glyph_range_ÚlogÚwarningÚstrr\   Úexpect_cid_Úadd_cid_rangeÚmake_cid_range_Ú	add_classr6   )r:   r¤   Úaccept_nullÚglyphÚgcrE   r¨   rË   rÌ   Úrange_locationÚrange_startÚ	range_endÚ
glyph_names                r   r¥   ÚParser.parse_glyphclass_M  s±  € ö  × 5Ñ 5¼%¿*¹*ÄeÇiÁiÐ9PÓ PÞ˜t×/Ñ/°6Ó9à×#Ñ#Ô%Ø—x‘x×)Ñ)°4×3KÑ3KÐ)ÐLÐLØ×&Ñ&Ó(ˆEØ×.Ñ.¨uÔ5Ø—8‘8×%Ñ% e×6NÑ6NÐ%ÐOÐOØ× Ñ ¤E×$4Ñ$4Ò4Ø×ÑÔ!Ø×#Ñ#×+Ñ+¨D¯O©OÓ<ˆBØ‰zÜ%Ø-°·±Ñ?Ø×,Ñ,óð ô ˜"Ÿh™h×0Ñ0×1Ñ1Ø—x‘x×-Ñ-¨b×;SÑ;SÐ-ÐTÐTà—x‘x×.Ñ.¨r×<TÑ<TÐ.ÐUÐUà×Ñ˜CÔ Ø×+Ñ+ˆØ—‘×$Ñ$¨hÐ$Ð7ˆØ×Ñ #Ô%Ø×$Ñ$¬¯
©
Ó2Ø×*Ñ*Ó,�Ø×3Ñ3�Ø˜%“< D×$4×$4¸×FVÑFVÓ9VØ#'×#:Ñ#:¸5Ó#K‘L�EØ×6Ñ6°uÔDØ×$Ñ$Ø d×&<Ñ&<¸XÈeÓ&Töð ×%Ñ%¨Ó,Ø!�EØ×'Ñ'¨Ô,Ø ×.Ñ.Ó0�EØ×6Ñ6°uÔDØ×$Ñ$Ø d×&<Ñ&<¸XÈeÓ&Töð ˜e“|¨D×,<×,<ÜŸ™ÜÜ /Ø&TÐUZÑT]Ð$^Ø$,ó!"óôð ×6Ñ6°uÔ=Ø—M‘M %Ö(Ø×&Ñ&¬%¯)©)Ò3Ø×*Ñ*Ó,�Ø×#Ñ# sÓ*Ø%)×%=Ñ%=�NØ"&§/¡/�KØ×'Ñ'¨Ô,Ø $× 0Ñ 0Ó 2�IØ×6Ñ6Ø˜k¨#Ð.Ð/Ø˜i¨˜_Ð-ôð ×(Ñ(Ø#Ø!Ø×,Ñ,¨^È)ÓTöð $' t§¡°sÐ&;Ð!<�JØ×6Ñ6°zÔBØ—M‘M *Ö-Ø×&Ñ&¬%×*:Ñ*:Ò:Ø×#Ñ#Ô%Ø×'Ñ'×/Ñ/°·±Ó@�Ø‘:Ü)Ø1°D·O±OÑCØ×0Ñ0óð ô ˜b§(¡(×"4Ñ"4×5Ñ5ØŸ™×/Ñ/°×=UÑ=UÐ/ÐV‘BàŸ™×0Ñ0°×>VÑ>VÐ0ÐW�BØ× Ñ  Õ$ä%ð7Ø7;×7GÑ7GÑ6JðLà×-Ñ-óð ðA ×Ñ #Ö%ðJ 	×Ñ˜CÔ ØˆrB   c                 ó@  • / / / / / 4u  p#pEnSnU R                   S;  Ga¶  U R                  SS9nSn	U R                   S:X  a  U R                  S5        S=pyU	(       a/  U(       a  [        SU R                  5      eUR                  U5        O*U(       a  UR                  U5        OUR                  U5        U R                  5       (       a!  UR                  U R                  U5      5        OUR                  S 5        S n
U R                   S:X  a�  U
c  / n
U R                  S5        U	(       d  [        SU R                  5      eU R                  5       nU R                  R                  U5      nUc  [        S	U-  U R                  5      eU
R                  U5        U R                   S:X  a  M�  U	(       a  UR                  U
5        U R                   S;  a  GM¶  U(       d$  U(       d  U/ :X  d   e/ US /[        U5      -  U/ U4$ [        US [        U5       5      (       a  [        S
U R                  5      eU[        U5      [        U5      [        U5      -    n[        U5      (       aA  [        U[        U5      [        U5      -   S  5      (       a  [        SU R                  5      eUnOuU(       aH  US   (       a>  [        U5      S:”  d  [        US S 5      (       a  [        SU R                  5      eUSS  nO&[        U5      (       a  [        SU R                  5      eX#XEXg4$ )NF>   r¶   rU   ÚbyÚfromTr£   Ú'z_Unsupported contextual target sequence: at most one run of marked (') glyph/class names allowedrL   z%Lookups can only follow marked glyphsúUnknown lookup "%s"z_Positioning cannot be applied in the bactrack glyph sequence, before the marked glyph sequence.zƒPositioning values are allowed only in the marked glyph sequence, or after the final glyph node when only one glyph node is marked.éÿÿÿÿr   )r4   r¥   r�   r   r_   r\   Úis_next_value_Úparse_valuerecord_r‚   rƒ   r0   r„   r&   Úany)r:   rN   Úprefixr¨   ÚlookupsÚvaluesÚsuffixÚhasMarksrë   ÚmarkedÚ
lookuplistÚlookup_namerL   Úmarked_valuess                 r   Úparse_glyph_pattern_ÚParser.parse_glyph_pattern_±  s  € ð 46°r¸2¸rÀ2Ð2FÑ/ˆ˜¨ØˆØ×ÑÐ&>Ô>Ø×'Ñ'¸Ð'Ð>ˆBØˆFØ×Ñ 3Ó&Ø×#Ñ# CÔ(Ø$(Ð(�ÞÞô *ðJà×0Ñ0óð ð
 —‘˜bÕ!ÞØ—‘˜bÕ!à—‘˜bÔ!à×"Ñ"×$Ñ$Ø—‘˜d×5Ñ5°hÓ?Õ@à—‘˜dÔ#àˆJØ×"Ñ" hÓ.ØÑ%Ø!#�JØ×$Ñ$ XÔ.ÞÜ)Ø?Ø×0Ñ0óð ð #×/Ñ/Ó1�ØŸ™×.Ñ.¨{Ó;�Ø‘>Ü)Ø-°Ñ;¸T×=UÑ=Uóð ð ×!Ñ! &Ô)ð ×"Ñ" hÕ.ö  Ø—‘˜zÔ*ð[ ×ÑÐ&>Ö>ö^ žfØ˜b“=Ð �=Ø˜  ¬¨V«Ñ 4°f¸bÀ(ÐKÐKä�6˜-œC ›KÐ(×)Ñ)Ü%ð8à×,Ñ,óð ð
 #¤3 v£;´°V³¼sÀ6»{Ñ1JÐKˆMÜ�=×!Ñ!Ü�vœc &›k¬C°«KÑ7Ð9Ð:×;Ñ;Ü)ð*ð ×0Ñ0ó	ð ð '‘Þ˜F 2ŸJÜ�v“; “?¤c¨&°°"¨+×&6Ñ&6Ü)ð*ð ×0Ñ0ó	ð ð    ˜‘Ü�V—‘Ü%ð&ð ×,Ñ,ó	ð ð  G°VÐFÐFrB   c                 ó  • U R                   nU R                  SS9u  p4pVpx[        U5      (       a  [        SU S3U5      eU(       d7  [        SU S3U5      n	[        R                  [        U	5      5        USS  USS pGX4U4n
U
$ )	NFrM   z(No lookups can be specified for "ignore rÅ   zAmbiguous "ignore z)", there should be least one marked glyphr   r   )r_   r  rù   r   râ   rã   rä   )r:   ÚsubrE   rú   r¨   rû   rü   rý   rþ   rt   ÚchainContexts              r   Úparse_ignore_glyph_pattern_Ú"Parser.parse_ignore_glyph_pattern_  s§   € Ø×+Ñ+ˆØ<@×<UÑ<UØð =Vð =
Ñ9ˆ˜¨ô ˆw�<‰<Ü!Ø:¸3¸%¸qÐAÀ8óð ö Ü#Ø$ S EÐ)RÐSØóˆEô �K‰Kœ˜E›
Ô#Ø# A B˜Z¨°°!¨�FØ¨Ð/ˆØÐrB   c                 ó
  • U R                   nU R                  U5      /nU R                  S:X  aC  U R                  S5        UR	                  U R                  U5      5        U R                  S:X  a  MC  U R                  S5        U$ )Nr¶   rU   )r_   r  r4   r�   r\   )r:   r  rE   r  s       r   Úparse_ignore_context_ÚParser.parse_ignore_context_!  s{   € Ø×+Ñ+ˆØ×8Ñ8¸Ó=Ð>ˆØ×Ñ #Ó%Ø×Ñ Ô$Ø×Ñ × @Ñ @ÀÓ EÔFð ×Ñ #Õ%ð 	×Ñ˜CÔ ØÐrB   c                 ó~  • U R                  S5      (       d   eU R                  nU R                  5         U R                  S;   a*  U R	                  S5      nU R
                  R                  X!S9$ U R                  S;   a*  U R	                  S5      nU R
                  R                  X!S9$ [        SU R                  5      e)NÚignore)Ú
substituter  r  rD   )ÚpositionÚposr  z#Expected "substitute" or "position")	r`   r_   r9   r^   r  r*   ÚIgnoreSubstStatementÚIgnorePosStatementr   )r:   rE   r  s      r   Úparse_ignore_ÚParser.parse_ignore_*  s²   € à×#Ñ# H×-Ñ-Ð-Ð-Ø×+Ñ+ˆØ×ÑÔØ�?‰?Ð3Ó3Ø×5Ñ5°eÓ<ˆLØ—8‘8×0Ñ0°Ð0ÐQÐQØ�?‰?Ð1Ó1Ø×5Ñ5°eÓ<ˆLØ—8‘8×.Ñ.¨|Ð.ÐOÐOÜØ1°4×3KÑ3Kó
ð 	
rB   c                 ó†   • U R                   S:X  d   eU R                  nU R                  5       n[        R                  " X!S9$ )NrF   rD   )r^   r_   Úexpect_filename_r*   ÚIncludeStatement)r:   rE   Úfilenames      r   ra   ÚParser.parse_include_9  s>   € Ø�‰ )Ó+Ð+Ð+Ø×+Ñ+ˆØ×(Ñ(Ó*ˆä×#Ò# HÑ@Ð@rB   c                 óT  • U R                  S5      (       d   eU R                  nU R                  5       nSu  p4U R                  S;   a  U R	                  5       S:H  nU R                  S:X  a  U R                  S5        SnU R                  S5        U R                  R                  X#XAS9$ )	NÚlanguage)TF>   Úexclude_dfltÚinclude_dfltr  ÚrequiredTrU   rD   )	r`   r_   Úexpect_language_tag_r4   rƒ   r‚   r�   r*   ÚLanguageStatement)r:   rE   r  Úinclude_defaultr  s        r   Úparse_language_ÚParser.parse_language_@  s¬   € Ø×#Ñ# J×/Ñ/Ð/Ð/Ø×+Ñ+ˆØ×,Ñ,Ó.ˆØ$1Ñ!ˆØ×ÑÐ?Ó?Ø"×/Ñ/Ó1°^ÑCˆOØ×Ñ˜zÓ)Ø× Ñ  Ô,ØˆHØ×Ñ˜CÔ Ø�x‰x×)Ñ)Ø xð *ð 
ð 	
rB   c                 ób  • U R                  S5      (       d   eU R                  nU R                  SS9nU R                  5       /nU R                  S:w  a1  UR                  U R                  5       5        U R                  S:w  a  M1  U R                  S5        U R                  R                  X#US9$ )NÚLigatureCaretByIndexTr£   rU   rD   )	r`   r_   r¥   rˆ   r4   r\   r�   r*   ÚLigatureCaretByIndexStatement©r:   rE   r¨   Úcaretss       r   Úparse_ligatureCaretByIndex_Ú"Parser.parse_ligatureCaretByIndex_O  s¤   € Ø×#Ñ#Ð$:×;Ñ;Ð;Ð;Ø×+Ñ+ˆØ×'Ñ'¸Ð'Ð>ˆØ×%Ñ%Ó'Ð(ˆØ×Ñ #Ó%Ø�M‰M˜$×-Ñ-Ó/Ô0ð ×Ñ #Õ%à×Ñ˜CÔ Ø�x‰x×5Ñ5°fÈxÐ5ÐXÐXrB   c                 ó^  • U R                  S5      (       d   eU R                  nU R                  SS9nU R                  SS9/nU R                  S:w  a0  UR                  U R                  SS95        U R                  S:w  a  M0  U R                  S5        U R                  R                  X#US9$ )NÚLigatureCaretByPosTr£   r   rU   rD   )	r`   r_   r¥   rˆ   r4   r\   r�   r*   ÚLigatureCaretByPosStatementr(  s       r   Úparse_ligatureCaretByPos_Ú Parser.parse_ligatureCaretByPos_Y  s®   € Ø×#Ñ#Ð$8×9Ñ9Ð9Ð9Ø×+Ñ+ˆØ×'Ñ'¸Ð'Ð>ˆØ×%Ñ%¨tÐ%Ð4Ð5ˆØ×Ñ #Ó%Ø�M‰M˜$×-Ñ-°tÐ-Ð<Ô=ð ×Ñ #Õ%à×Ñ˜CÔ Ø�x‰x×3Ñ3°FÈXÐ3ÐVÐVrB   c                 ó$  • U R                  S5      (       d   eU R                  U R                  5       p2U R                  S:X  aa  U R                  R                  U5      nUc  [        SU-  U R                  5      eU R                  S5        U R                  R                  XBS9$ SnU R                  S:X  a  U R                  S5        SnU R                  R                  X5US9nU R                  Xa5        U R                  R                  X65        U$ )NrL   rU   rõ   rD   FÚuseExtensionT)r`   r_   rƒ   r4   r0   r„   r   r�   r*   ÚLookupReferenceStatementr‚   ÚLookupBlockÚparse_block_r•   )r:   rN   rE   rr   rL   Úuse_extensionÚblocks          r   rg   ÚParser.parse_lookup_c  s  € ð ×#Ñ# H×-Ñ-Ð-Ð-Ø×1Ñ1°4×3DÑ3DÓ3F�$à×Ñ˜sÓ"Ø—]‘]×*Ñ*¨4Ó0ˆFØ‰~Ü%Ø)¨DÑ0°$×2JÑ2Jóð ð ×Ñ Ô$Ø—8‘8×4Ñ4°VÐ4ÐOÐOàˆØ×Ñ˜~Ó-Ø× Ñ  Ô0Ø ˆMà—‘×$Ñ$ TÀ8Ð$ÐLˆØ×Ñ˜%Ô*Ø�‰×Ñ˜TÔ)ØˆrB   c                 ó  • U R                  S5      (       d   eU R                  nU R                  [        R                  :X  a:  U R                  5       nU R                  S5        U R                  R                  X!S9$ SnSu  p$nSSSS	S
.n[        5       nU R                  S:w  Ga  U R                  U;   a#  [        SU R                  -  U R                  5      eUR                  U R                  5        U R                  S:X  a!  U R                  S5        U R                  SS9nO|U R                  S:X  a!  U R                  S5        U R                  SS9nOKU R                  U;   a  SnX&U R!                  5          -  nO#[        SU R                  -  U R                  5      eU R                  S:w  a  GM  U R                  S5        [#        X4U/5      (       d  [        SU R                  5      eU R                  R                  UUUUS9$ )NÚ
lookupflagrU   rD   F)r   NNr   é   é   é   )ÚRightToLeftÚIgnoreBaseGlyphsÚIgnoreLigaturesÚIgnoreMarksz%s can be specified only onceÚMarkAttachmentTyper£   ÚUseMarkFilteringSetTz#"%s" is not a recognized lookupflagzlookupflag must have a value)ÚmarkAttachmentÚmarkFilteringSetrE   )r`   r_   r3   r   ÚNUMBERrˆ   r�   r*   ÚLookupFlagStatementr(   r4   r   r6   r¦   r‚   r¥   rƒ   rù   )r:   rE   ÚvalueÚ
value_seenrD  rE  ÚflagsÚseens           r   Úparse_lookupflag_ÚParser.parse_lookupflag_|  s  € ð ×#Ñ# L×1Ñ1Ð1Ð1Ø×+Ñ+ˆð × Ñ ¤E§L¡LÓ0Ø×'Ñ'Ó)ˆEØ×Ñ Ô$Ø—8‘8×/Ñ/°Ð/ÐIÐIð ˆ
Ø2?Ñ/ˆÐ/àØ !Ø Øñ	
ˆô ‹uˆØ×Ñ #Ô%Ø×Ñ 4Ó'Ü%Ø3°d×6FÑ6FÑFØ×-Ñ-óð ð �H‰H�T×%Ñ%Ô&Ø×ÑÐ#7Ó7Ø×$Ñ$Ð%9Ô:Ø!%×!7Ñ!7ÈÐ!7Ð!O‘Ø×!Ñ!Ð%:Ó:Ø×$Ñ$Ð%:Ô;Ø#'×#9Ñ#9È5Ð#9Ð#QÑ Ø×!Ñ! UÓ*Ø!�
Ø d×&7Ñ&7Ó&9Ñ :Ñ:‘ä%Ø9¸D×<LÑ<LÑLØ×-Ñ-óð ð# ×Ñ #Ö%ð* 	×Ñ˜CÔ ä�JÐ0@ÐA×BÑBÜ!Ø.°×0IÑ0Ióð ð �x‰x×+Ñ+ØØ)Ø-Øð	 ,ð 
ð 	
rB   c                 óR  • U R                  S5      (       d   eU R                  nU R                  SS9nUR                  5       (       d  [	        SU5      eU R                  5       nU R                  5       nU R                  S5        U R                  R                  R                  U5      nUcN  U R                  R                  U5      nXPR                  R                  U'   U R                  R                  XE5        U R                  R                  XSX!S9nUR!                  U5        U$ )NrO   Tr£   z*Empty glyph class in mark class definitionrU   rD   )r`   r_   r¥   ÚglyphSetr   r‹   Úexpect_class_name_r�   r,   ÚmarkClassesÚgetr*   rÜ   r/   r•   ÚMarkClassDefinitionÚaddDefinition)r:   rE   r¨   ry   rr   rO   Úmcdefs          r   rh   ÚParser.parse_markClass_µ  s  € Ø×#Ñ# K×0Ñ0Ð0Ð0Ø×+Ñ+ˆØ×'Ñ'¸Ð'Ð>ˆØ�‰× Ñ Ü!Ø<¸hóð ð ×#Ñ#Ó%ˆØ×&Ñ&Ó(ˆØ×Ñ˜CÔ Ø—I‘I×)Ñ)×-Ñ-¨dÓ3ˆ	ØÑØŸ™×*Ñ*¨4Ó0ˆIØ*3�I‰I×!Ñ! $Ñ'Ø×Ñ×%Ñ% dÔ6Ø—‘×,Ñ,Ø˜vð -ð 
ˆð 	×Ñ Ô&ØˆrB   c           	      ól  • U R                   S;   d   eU R                  S:X  a  U R                  X5      $ U R                  S:X  a  U R                  X5      $ U R                  S:X  a  U R	                  X5      $ U R                  S:X  a  U R                  X5      $ U R                  nU R                  U5      u  pEpgp‰U R                  S5        [        U5      (       a7  [        U5      (       a  [        SU5      eU R                  R                  XEX†US9$ U(       d]  U(       dV  [        U5      S	:X  aG  U	(       d@  US
   c  UR                  5         U R                  R                  US
   US
   US   US   UUS9$ U(       a  [        SU5      eU R                  R!                  [#        [%        XW5      5      UUU	US9$ )N>   r  r  ÚcursiveÚbaseÚligaturerŽ   rU   z3If "lookup" is present, no values must be specifiedrD   r;  r   r   )r°   rE   z2"enumerate" is only allowed with pair positionings©Ú
forceChainrE   )r^   r4   Úparse_position_cursive_Úparse_position_base_Úparse_position_ligature_Úparse_position_mark_r_   r  r�   rù   r   r*   ÚChainContextPosStatementr&   ÚreverseÚPairPosStatementÚSinglePosStatementÚlistÚzip)
r:   r°   rN   rE   rú   r¨   rû   rü   rý   rþ   s
             r   r±   ÚParser.parse_position_Ë  sÃ  € Ø�‰Ð"5Ó5Ð5Ð5Ø×Ñ˜yÓ(Ø×/Ñ/°
ÓEÐEØ×Ñ Ó'Ø×,Ñ,¨ZÓBÐBØ×Ñ Ó+Ø×0Ñ0°ÓFÐFØ×Ñ Ó'Ø×,Ñ,¨ZÓBÐBà×+Ñ+ˆØ<@×<UÑ<UØó=
Ñ9ˆ˜¨ð 	×Ñ˜CÔ äˆw�<‰<ä�6�{‰{Ü%ØIÈ8óð ð —8‘8×4Ñ4Ø ¸(ð 5ð ð ö žf¬¨V«¸Ó)9Æ(Ø�a‰yÑ Ø—‘Ô Ø—8‘8×,Ñ,Ø�q‘	Ø�q‘	Ø�q‘	Ø�q‘	Ø%Ø!ð -ð ð ö Ü!ØDÀhóð ð �x‰x×*Ñ*Ü”�VÓ$Ó%ØØØØð +ð 
ð 	
rB   c                 ó  • U R                   nU R                  S5        U(       a  [        SU5      eU R                  SS9nU R	                  5       nU R	                  5       nU R                  S5        U R                  R                  XEXcS9$ )NrX  z>"enumerate" is not allowed with cursive attachment positioningTr£   rU   rD   )r_   r‚   r   r¥   r‹   r�   r*   ÚCursivePosStatement)r:   r°   rN   rE   rÁ   ÚentryAnchorÚ
exitAnchors          r   r]  ÚParser.parse_position_cursive_   s‘   € Ø×+Ñ+ˆØ×Ñ˜YÔ'ÞÜ!ØSØóð ð ×+Ñ+¸TÐ+ÐBˆ
Ø×(Ñ(Ó*ˆØ×'Ñ'Ó)ˆ
Ø×Ñ˜CÔ Ø�x‰x×+Ñ+Ø Zð ,ð 
ð 	
rB   c                 óö   • U R                   nU R                  S5        U(       a  [        SU5      eU R                  SS9nU R	                  5       nU R                  S5        U R                  R                  XEUS9$ )NrY  zC"enumerate" is not allowed with mark-to-base attachment positioningTr£   rU   rD   )r_   r‚   r   r¥   r‘   r�   r*   ÚMarkBasePosStatement)r:   r°   rN   rE   rY  Úmarkss         r   r^  ÚParser.parse_position_base_  s~   € Ø×+Ñ+ˆØ×Ñ˜VÔ$ÞÜ!ð6àóð ð
 ×%Ñ%°tÐ%Ð<ˆØ×(Ñ(Ó*ˆØ×Ñ˜CÔ Ø�x‰x×,Ñ,¨TÀ8Ð,ÐLÐLrB   c                 óœ  • U R                   nU R                  S5        U(       a  [        SU5      eU R                  SS9nU R	                  5       /nU R
                  S:X  aB  U R                  S5        UR                  U R	                  5       5        U R
                  S:X  a  MB  U R                  S5        U R                  R                  XEUS9$ )NrZ  zG"enumerate" is not allowed with mark-to-ligature attachment positioningTr£   ÚligComponentrU   rD   )
r_   r‚   r   r¥   r‘   r4   r\   r�   r*   ÚMarkLigPosStatement)r:   r°   rN   rE   Ú	ligaturesro  s         r   r_  ÚParser.parse_position_ligature_  sÄ   € Ø×+Ñ+ˆØ×Ñ˜ZÔ(ÞÜ!ð:àóð ð
 ×*Ñ*¸DÐ*ÐAˆ	Ø×)Ñ)Ó+Ð,ˆØ×Ñ .Ó0Ø× Ñ  Ô0Ø�L‰L˜×1Ñ1Ó3Ô4ð ×Ñ .Õ0ð 	×Ñ˜CÔ Ø�x‰x×+Ñ+¨IÀxÐ+ÐPÐPrB   c                 óö   • U R                   nU R                  S5        U(       a  [        SU5      eU R                  SS9nU R	                  5       nU R                  S5        U R                  R                  XEUS9$ )NrŽ   zC"enumerate" is not allowed with mark-to-mark attachment positioningTr£   rU   rD   )r_   r‚   r   r¥   r‘   r�   r*   ÚMarkMarkPosStatement)r:   r°   rN   rE   Ú	baseMarksro  s         r   r`  ÚParser.parse_position_mark_/  s~   € Ø×+Ñ+ˆØ×Ñ˜VÔ$ÞÜ!ð6àóð ð
 ×*Ñ*¸DÐ*ÐAˆ	Ø×(Ñ(Ó*ˆØ×Ñ˜CÔ Ø�x‰x×,Ñ,¨YÈÐ,ÐQÐQrB   c                 ó¼   • U R                  S5      (       d   eU R                  U R                  5       p!U R                  S5        U R                  R                  X!S9$ )NÚscriptrU   rD   )r`   r_   Úexpect_script_tag_r�   r*   ÚScriptStatement)r:   rE   r{  s      r   Úparse_script_ÚParser.parse_script_=  sU   € Ø×#Ñ# H×-Ñ-Ð-Ð-Ø×3Ñ3°T×5LÑ5LÓ5N�&Ø×Ñ˜CÔ Ø�x‰x×'Ñ'¨Ð'ÐBÐBrB   c           
      ó   • U R                   S;   d   eU R                  nU R                   S;   nU R                  SS9u  nnnnnn[        U5      (       a  [	        SU5      e/ n	U R
                  S:X  aU  U R                  S5      n
U R
                  S:w  a3  U R                  SSS	9nU	R                  U5        U R
                  S:w  a  M3  O4U R
                  S
:X  a"  U R                  S
5      n
U R                  SS9/n	OS n
U R                  S5        [        U	5      S:X  a&  [        U5      (       d  [	        SU R                  5      eU
S
:X  aŠ  U(       a  [	        SU5      e[        U5      S:w  d   [        US   R                  5       5      S:w  a  [	        SU5      e[        U	5      S:w  a  [	        SU5      eU R                  R                  X4S   XyS   US9$ [        U Vs/ s H	  oÌc  M  UPM     sn5      nSn[        U	5      S:X  a9  [        U	S   [        R                  5      (       a  U(       a  [	        SU5      e/ n	SnU(       dÏ  [        U5      S:X  aÀ  [        U	5      S:X  a±  US:X  a«  [!        US   R                  5       5      n[!        U	S   R                  5       5      n[        U5      S:X  a  U[        U5      -  n[        U5      [        U5      :w  a#  [	        S[        U5      [        U5      4-  U5      eU R                  R#                  XIX7X�S9$ U(       a6  [        U5      S:X  a'  US:X  a!  U R                  R%                  UUS   USUUS9$ U(       dú  [        U5      S:X  aë  [        U	5      S:”  aÜ  US:X  aÖ  [        US   R                  5       5      nU	 H“  n[!        UR                  5       5      (       d  [	        SU5      e[        UR                  5       5      S:w  d  ML  [        UR                  5       5      U:w  d  Mk  [	        SU S[        UR                  5       5       S3U5      e   U R                  R%                  UUS   UU	UUS9$ U(       d  [        U5      S:”  ap  [        U	5      S:X  aa  [        U	S   R                  5       5      S:X  aA  US:X  a;  U R                  R'                  UUU[!        U	S   R                  5       5      S   UUS9$ U(       Ga  [        U5      S:w  a  [	        SU5      e[        U	5      S:w  a  [	        SU5      eUS:w  a  [	        SU5      e[)        [!        US   R                  5       5      5      n[)        [!        U	S   R                  5       5      5      n[        U5      S:X  a  U[        U5      -  n[        U5      [        U5      :w  a#  [	        S[        U5      [        U5      4-  U5      eU R                  R+                  X7XIUS9$ [        U5      S:”  a  [        U	5      S:”  a  [	        SU5      e[        U	5      S:w  d  U(       a  [	        SU5      eU R                  R-                  X4XuUS9nU$ s  snf ) N>   r  ÚrsubÚ
reversesubr  >   r�  r‚  FrM   z-Substitution statements cannot contain valuesrò   rU   T)r¤   ré   ró   r£   r   z3Expected "by", "from" or explicit lookup referencesz4Reverse chaining substitutions do not support "from"r   z%Expected a single glyph before "from"z)Expected a single glyphclass after "from"rD   z<Reverse chaining substitutions do not support glyph deletionz\Expected a glyph class with %d elements after "by", but found a glyph class with %d elementsr[  © zEmpty class in replacementz!Expected a glyph class with 1 or z3 elements after "by", but found a glyph class with z	 elementsz\In reverse chaining single substitutions, only a single glyph or glyph class can be replacedzlIn reverse chaining single substitutions, the replacement (after "by") must be a single glyph or glyph classz8Reverse chaining substitutions cannot call named lookupszJDirect substitution of multiple glyphs by multiple glyphs is not supportedzInvalid substitution statement)r^   r_   r  rù   r   r4   r‚   r¥   r\   r�   r&   rO  r*   ÚAlternateSubstStatementrÛ   r×   re  ÚSingleSubstStatementÚMultipleSubstStatementÚLigatureSubstStatementÚsortedÚ ReverseChainSingleSubstStatementÚChainContextSubstStatement)r:   rE   rb  Ú
old_prefixÚoldrû   rü   Ú
old_suffixrþ   ÚnewÚkeywordrë   rÍ   Únum_lookupsÚis_deletionr¨   ÚreplacementsÚcountÚnÚrules                       r   Úparse_substitute_ÚParser.parse_substitute_C  sX  € Ø�‰Ð"MÓMÐMÐMØ×+Ñ+ˆØ—/‘/Ð%;Ñ;ˆð ×%Ñ%¨uÐ%Ð5ñ	
ØØØØØØäˆv�;‰;Ü!Ø?Àóð ð ˆØ×Ñ˜tÓ#Ø×*Ñ*¨4Ó0ˆGØ×"Ñ" cÓ)Ø×+Ñ+¸TÈtÐ+ÐT�Ø—
‘
˜2”ð ×"Ñ" cÕ)øð ×Ñ Ó'Ø×*Ñ*¨6Ó2ˆGØ×)Ñ)¸5Ð)ÐAÐB‰CàˆGØ×Ñ˜CÔ Üˆs‹8�q‹=¤ W§¡Ü!ØEØ×(Ñ(óð ð �fÓÞÜ%ØJÈHóð ô �3‹x˜1‹}¤ C¨¡F§O¡OÓ$5Ó 6¸!Ó ;Ü%Ð&MÈxÓXÐXÜ�3‹x˜1‹}Ü%Ø?Àóð ð —8‘8×3Ñ3Ø ™F J°A±Àð 4ð ð ô ¡gÓ?¢g Ÿ1¡gÑ?Ó@ˆàˆÜˆs‹8�q‹=œZ¨¨A©´·±×>Ñ>ÞÜ%ØRØóð ð ˆCØˆKö œ3˜s›8 q›=¬S°«X¸«]¸{ÈaÓ?OÜ˜#˜a™&Ÿ/™/Ó+Ó,ˆFÜ  A¡§¡Ó 1Ó2ˆLÜ�<Ó  AÓ%Ø+¬c°&«kÑ9�Ü�6‹{œc ,Ó/Ó/Ü%ð?ä˜6“{¤C¨Ó$5Ð6ñ7ð ó	ð ð —8‘8×0Ñ0Ø˜*¸Xð 1ð ð ö œ3˜s›8 q›=¨[¸AÓ-=Ø—8‘8×2Ñ2ØØ�A‘ØØØ#Ø!ð 3ð ð ö  œ3˜s›8 q›=¬S°«X¸«\¸kÈQÓ>NÜ˜˜A™Ÿ™Ó)Ó*ˆEÛ�Ü˜AŸJ™J›L×)Ñ)Ü)Ð*FÈÓQÐQÜ�q—z‘z“|Ó$¨Õ)¬c°!·*±*³,Ó.?À5Õ.HÜ)Ø;¸E¸7ð C8Ü8;¸A¿J¹J»LÓ8IÐ7JÈ)ðUà óð ñ	 ð —8‘8×2Ñ2ØØ�A‘ØØØ#Ø!ð 3ð ð ö Ü�C“˜1“Ü�C“˜A“Ü�C˜‘F—O‘OÓ%Ó&¨!Ó+Ø˜qÓ à—8‘8×2Ñ2ØØØÜ�S˜‘V—_‘_Ó&Ó'¨Ñ*Ø#Ø!ð 3ð ð ÷ Ü�3‹x˜1‹}Ü%ðIàóð ô
 �3‹x˜1‹}Ü%ð%ð ó	ð ð ˜aÓÜ%ØNÐPXóð ô œD  Q¡§¡Ó!2Ó3Ó4ˆFÜ!¤$ s¨1¡v§¡Ó'8Ó"9Ó:ˆLÜ�<Ó  AÓ%Ø+¬c°&«kÑ9�Ü�6‹{œc ,Ó/Ó/Ü%ð?ä˜6“{¤C¨Ó$5Ð6ñ7ð ó	ð ð —8‘8×<Ñ<Ø¨¸8ð =ð ð ô ˆs‹8�a‹<œC ›H q›LÜ!ð#àóð ô ˆs‹8�q‹=žKÜ!Ð"BÀHÓMÐMð �x‰x×2Ñ2Ø˜Z¸8ð 3ð 
ˆð ˆùòU @s   ÇYÇ$Yc                 óž   • U R                  S5      (       d   eU R                  nU R                  S5        U R                  R	                  US9$ )NÚsubtablerU   rD   )r`   r_   r�   r*   ÚSubtableStatement)r:   rE   s     r   Úparse_subtable_ÚParser.parse_subtable_  sJ   € Ø×#Ñ# J×/Ñ/Ð/Ð/Ø×+Ñ+ˆØ×Ñ˜CÔ Ø�x‰x×)Ñ)°8Ð)Ð<Ð<rB   c                 ó’  • U R                  S5      (       d   eU R                  nU R                  5       nU R                  5       nSnSnU R                  [
        R                  [
        R                  4;   d  US:w  a   U R                  5       nU R                  5       nU R                  S5        U R                  R                  X#XEUS9$ )NÚ
parametersg        r   rU   rD   )r`   r_   Úexpect_decipoint_rˆ   r3   r   rF  ÚFLOATr�   r*   ÚSizeParameters)r:   rE   Ú
DesignSizeÚSubfamilyIDÚ
RangeStartÚRangeEnds         r   Úparse_size_parameters_ÚParser.parse_size_parameters_  s¼   € ð ×#Ñ# L×1Ñ1Ð1Ð1Ø×+Ñ+ˆØ×+Ñ+Ó-ˆ
Ø×)Ñ)Ó+ˆØˆ
ØˆØ× Ñ ¤U§\¡\´5·;±;Ð$?Ó?À;ÐRSÓCSØ×/Ñ/Ó1ˆJØ×-Ñ-Ó/ˆHà×Ñ˜CÔ Ø�x‰x×&Ñ&Ø ZÀHð 'ð 
ð 	
rB   c           	      ó¨   • U R                  S5      (       d   eU R                  nU R                  5       u  p#pEU R                  R	                  SX#XEUS9$ )NÚsizemenunameÚsizerD   )r`   r_   Úparse_name_r*   ÚFeatureNameStatement)r:   rE   Ú
platformIDÚ	platEncIDÚlangIDÚstrings         r   Úparse_size_menuname_ÚParser.parse_size_menuname_  s\   € Ø×#Ñ# N×3Ñ3Ð3Ð3Ø×+Ñ+ˆØ04×0@Ñ0@Ó0BÑ-ˆ
˜vØ�x‰x×,Ñ,Ø�J¨6ÀHð -ð 
ð 	
rB   c           	      óª  • U R                  S5      (       d   eU R                  U R                  5       p!U R                  R	                  X!S9nU R                  S5        U R                  U R                  U R                  U R                  U R                  U R                  U R                  U R                  S.R                  U5      nU(       a	  U" U5        O[        SUR!                  5       -  U5      eU R                  S5        U R                  5       nXR:w  a'  [        SUR!                  5       -  U R                  5      eU R                  S5        U$ )	NrS   rD   Ú{)ÚGDEFÚheadÚhheaÚvhearr   ÚBASEzOS/2ÚSTATz"table %s" is not supportedr˜   úExpected "%s"rU   )r`   r_   r™   r*   Ú
TableBlockr�   Úparse_table_GDEF_Úparse_table_head_Úparse_table_hhea_Úparse_table_vhea_Úparse_table_name_Úparse_table_BASE_Úparse_table_OS_2_Úparse_table_STAT_rR  r   Ústrip)r:   rE   rr   rS   ÚhandlerrŸ   s         r   rk   ÚParser.parse_table_"  s5  € Ø×#Ñ# G×,Ñ,Ð,Ð,Ø×1Ñ1°4×3CÑ3CÓ3E�$Ø—‘×#Ñ# DÐ#Ð<ˆØ×Ñ˜CÔ à×*Ñ*Ø×*Ñ*Ø×*Ñ*Ø×*Ñ*Ø×*Ñ*Ø×*Ñ*Ø×*Ñ*Ø×*Ñ*ñ	
÷ ‰#ˆd‹)ð 	ö Ù�E�Nä!Ø-°·
±
³Ñ<¸hóð ð 	×Ñ˜CÔ Ø×"Ñ"Ó$ˆØ‹?Ü!Ø $§*¡*£,Ñ.°×0HÑ0Hóð ð 	×Ñ˜CÔ ØˆrB   c                 óˆ  • UR                   nU R                  S:w  d  U R                  (       Ga”  U R                  SS9  U R                  [
        R                  L a?  UR                  U R                  R                  U R                  U R                  S95        GOU R                  S5      (       a   UR                  U R                  5       5        OËU R                  S5      (       a   UR                  U R                  5       5        O•U R                  S5      (       a   UR                  U R                  5       5        O_U R                  S5      (       a   UR                  U R!                  5       5        O)U R                  S	:X  a  GMx  [#        S
U R                  5      eU R                  S:w  a  GM  U R                  (       a  GM“  g g )Nr˜   Tr!   rD   r¢   rµ   r&  r-  rU   z<Expected Attach, LigatureCaretByIndex, or LigatureCaretByPos)rY   r4   r5   r9   rZ   r   r[   r\   r*   r]   r^   r_   r`   rª   r¼   r*  r/  r   ©r:   rS   rY   s      r   r½  ÚParser.parse_table_GDEF_@  s_  € Ø×%Ñ%ˆ
Ø×Ñ #Ó%¨×);×);Ð);Ø×Ñ¨ÐÑ.Ø×#Ñ#¤u§}¡}Ò4Ø×!Ñ!Ø—H‘H×$Ñ$ T§_¡_¸t×?WÑ?WÐ$ÐXöð ×%Ñ% h×/Ñ/Ø×!Ñ! $×"4Ñ"4Ó"6Õ7Ø×%Ñ% o×6Ñ6Ø×!Ñ! $×";Ñ";Ó"=Õ>Ø×%Ñ%Ð&<×=Ñ=Ø×!Ñ! $×"BÑ"BÓ"DÕEØ×%Ñ%Ð&:×;Ñ;Ø×!Ñ! $×"@Ñ"@Ó"BÕCØ—‘ CÓ'Úä%ØUØ×,Ñ,óð ð# ×Ñ #Ö%¨×);×);Ô);rB   c                 ó:  • UR                   nU R                  S:w  d  U R                  (       aî  U R                  SS9  U R                  [
        R                  L a>  UR                  U R                  R                  U R                  U R                  S95        O^U R                  S5      (       a   UR                  U R                  5       5        O(U R                  S:X  a  MÓ  [        SU R                  5      eU R                  S:w  a  MÚ  U R                  (       a  Mí  g g )Nr˜   Tr!   rD   ÚFontRevisionrU   zExpected FontRevision)rY   r4   r5   r9   rZ   r   r[   r\   r*   r]   r^   r_   r`   Úparse_FontRevision_r   rÉ  s      r   r¾  ÚParser.parse_table_head_X  sÝ   € Ø×%Ñ%ˆ
Ø×Ñ #Ó%¨×);×);Ø×Ñ¨ÐÑ.Ø×#Ñ#¤u§}¡}Ò4Ø×!Ñ!Ø—H‘H×$Ñ$ T§_¡_¸t×?WÑ?WÐ$ÐXõð ×%Ñ% n×5Ñ5Ø×!Ñ! $×":Ñ":Ó"<Õ=Ø—‘ CÓ'Ùä%Ð&=¸t×?WÑ?WÓXÐXð ×Ñ #Õ%¨×);×);Ó);rB   c                 ó<  • UR                   nSnU R                  S:w  d  U R                  (       Gal  U R                  SS9  U R                  [
        R                  L a>  UR                  U R                  R                  U R                  U R                  S95        OÚU R                  [
        R                  L a”  U R                  U;   a„  U R                  R                  5       nU R                  5       nUR                  U R                  R                  XEU R                  S95        U R                  S:w  a  [!        SU R"                  5      eO)U R                  S:X  a  GMP  [!        SU R                  5      eU R                  S:w  a  GMW  U R                  (       a  GMk  g g )	N)ÚCaretOffsetÚAscenderÚ	DescenderÚLineGapr˜   Tr!   rD   rU   úIncomplete statementz4Expected CaretOffset, Ascender, Descender or LineGap)rY   r4   r5   r9   rZ   r   r[   r\   r*   r]   r^   r_   rm   Úlowerrˆ   Ú	HheaFieldr   r6   ©r:   rS   rY   ÚfieldsÚkeyrH  s         r   r¿  ÚParser.parse_table_hhea_g  sY  € Ø×%Ñ%ˆ
ØDˆØ×Ñ #Ó%¨×);×);Ð);Ø×Ñ¨ÐÑ.Ø×#Ñ#¤u§}¡}Ò4Ø×!Ñ!Ø—H‘H×$Ñ$ T§_¡_¸t×?WÑ?WÐ$ÐXõð ×%Ñ%¬¯©Ò3¸¿¹È6Ó8QØ—o‘o×+Ñ+Ó-�Ø×+Ñ+Ó-�Ø×!Ñ!Ø—H‘H×&Ñ& s¸D×<TÑ<TÐ&ÐUôð ×#Ñ# sÓ*Ü)Ø.°×0IÑ0Ióð ð +ð —‘ CÓ'Úä%ØMØ×,Ñ,óð ð' ×Ñ #Ö%¨×);×);Ô);rB   c                 ó<  • UR                   nSnU R                  S:w  d  U R                  (       Gal  U R                  SS9  U R                  [
        R                  L a>  UR                  U R                  R                  U R                  U R                  S95        OÚU R                  [
        R                  L a”  U R                  U;   a„  U R                  R                  5       nU R                  5       nUR                  U R                  R                  XEU R                  S95        U R                  S:w  a  [!        SU R"                  5      eO)U R                  S:X  a  GMP  [!        SU R                  5      eU R                  S:w  a  GMW  U R                  (       a  GMk  g g )	N)ÚVertTypoAscenderÚVertTypoDescenderÚVertTypoLineGapr˜   Tr!   rD   rU   rÔ  z?Expected VertTypoAscender, VertTypoDescender or VertTypoLineGap)rY   r4   r5   r9   rZ   r   r[   r\   r*   r]   r^   r_   rm   rÕ  rˆ   Ú	VheaFieldr   r6   r×  s         r   rÀ  ÚParser.parse_table_vhea_‚  s[  € Ø×%Ñ%ˆ
ØMˆØ×Ñ #Ó%¨×);×);Ð);Ø×Ñ¨ÐÑ.Ø×#Ñ#¤u§}¡}Ò4Ø×!Ñ!Ø—H‘H×$Ñ$ T§_¡_¸t×?WÑ?WÐ$ÐXõð ×%Ñ%¬¯©Ò3¸¿¹È6Ó8QØ—o‘o×+Ñ+Ó-�Ø×+Ñ+Ó-�Ø×!Ñ!Ø—H‘H×&Ñ& s¸D×<TÑ<TÐ&ÐUôð ×#Ñ# sÓ*Ü)Ø.°×0IÑ0Ióð ð +ð —‘ CÓ'Úä%ð;à×,Ñ,óð ð' ×Ñ #Ö%¨×);×);Ô);rB   c                 óL  • UR                   nU R                  S:w  d  U R                  (       a÷  U R                  SS9  U R                  [
        R                  L a>  UR                  U R                  R                  U R                  U R                  S95        OgU R                  S5      (       a)  U R                  5       nU(       a  UR                  U5        O(U R                  S:X  a  MÜ  [        SU R                  5      eU R                  S:w  a  Mã  U R                  (       a  Mö  g g )Nr˜   Tr!   rD   ÚnameidrU   zExpected nameid)rY   r4   r5   r9   rZ   r   r[   r\   r*   r]   r^   r_   r`   Úparse_nameid_r   )r:   rS   rY   Ú	statements       r   rÁ  ÚParser.parse_table_name_ž  sæ   € Ø×%Ñ%ˆ
Ø×Ñ #Ó%¨×);×);Ø×Ñ¨ÐÑ.Ø×#Ñ#¤u§}¡}Ò4Ø×!Ñ!Ø—H‘H×$Ñ$ T§_¡_¸t×?WÑ?WÐ$ÐXõð ×%Ñ% h×/Ñ/Ø ×.Ñ.Ó0�	ÞØ×%Ñ% iÔ0øØ—‘ CÓ'Ùä%Ð&7¸×9QÑ9QÓRÐRð ×Ñ #Õ%¨×);×);Ó);rB   c                 óD  • SnSnU R                   [        R                  ;   am  U R                  5       nU R                  nUS;  a  [        SU5      eU R                   [        R                  ;   a   U R                  5       nU R                  5       nOSnU R                  nUS:X  a  U=(       d    SnU=(       d    SnOU=(       d    SnU=(       d    SnU R                  5       nU R                  S5        [        X1U5      nUc  [        S	U5      eU R                  XV5      nX1X'4$ )
z~Parses a name record. See `section 9.e <https://adobe-type-tools.github.io/afdko/OpenTypeFeatureFileSpecification.html#9.e>`_.N©r   é   úExpected platform id 1 or 3rè  r   r   é	  rU   úUnsupported encoding)
r3   r   ÚNUMBERSÚexpect_any_number_r_   r   Úexpect_string_r�   r   Úunescape_string_©r:   r®  r¯  r­  rE   r°  ÚencodingÚ	unescapeds           r   r«  ÚParser.parse_name_¯  s  € àˆ	ØˆØ× Ñ ¤E§M¡MÓ1Ø×0Ñ0Ó2ˆJØ×/Ñ/ˆHØ Ó'Ü%Ð&CÀXÓNÐNØ×$Ñ$¬¯©Ó5Ø ×3Ñ3Ó5�	Ø×0Ñ0Ó2�øàˆJØ×/Ñ/ˆHà˜‹?Ø!Ÿ QˆIØ—[˜q‰Fà!Ÿ QˆIØ×%˜vˆFà×$Ñ$Ó&ˆØ×Ñ˜CÔ ä˜z°fÓ=ˆØÑÜ!Ð"8¸(ÓCÐCØ×)Ñ)¨&Ó;ˆ	Ø fÐ7Ð7rB   c                 ó"  • S nS nU R                   [        R                  ;   am  U R                  5       nU R                  nUS;  a  [        SU5      eU R                   [        R                  ;   a   U R                  5       nU R                  5       nOSnU R                  nUS:X  a  U=(       d    SnU=(       d    SnOU=(       d    SnU=(       d    SnU R                  5       n[        X1U5      nUc  [        SU5      eU R                  XV5      nX1X'4$ )Nrç  ré  rè  r   r   rê  rë  )	r3   r   rì  rí  r_   r   rî  r   rï  rð  s           r   Úparse_stat_name_ÚParser.parse_stat_name_Ï  s  € Øˆ	ØˆØ× Ñ ¤E§M¡MÓ1Ø×0Ñ0Ó2ˆJØ×/Ñ/ˆHØ Ó'Ü%Ð&CÀXÓNÐNØ×$Ñ$¬¯©Ó5Ø ×3Ñ3Ó5�	Ø×0Ñ0Ó2�øàˆJØ×/Ñ/ˆHà˜‹?Ø!Ÿ QˆIØ—[˜q‰Fà!Ÿ QˆIØ×%˜vˆFà×$Ñ$Ó&ˆÜ˜z°fÓ=ˆØÑÜ!Ð"8¸(ÓCÐCØ×)Ñ)¨&Ó;ˆ	Ø fÐ7Ð7rB   c           	      ó  • U R                   S:X  d   U R                   5       eU R                  U R                  5       p!US:”  a  [        SU R                  5      eU R	                  5       u  p4pVU R
                  R                  X#XEXaS9$ )Nrâ  iÿ  z*Name id value cannot be greater than 32767rD   )r^   r_   rí  r   r«  r*   Ú
NameRecord)r:   rE   ÚnameIDr­  r®  r¯  r°  s          r   rã  ÚParser.parse_nameid_ì  sŠ   € Ø�‰ (Ó*Ð;¨D¯O©OÓ;Ð*Ø×3Ñ3°T×5LÑ5LÓ5N�&Ø�E‹>Ü!Ø<¸d×>VÑ>Vóð ð 15×0@Ñ0@Ó0BÑ-ˆ
˜vØ�x‰x×"Ñ"Ø 	°6ð #ð 
ð 	
rB   c                 óÆ   ^ ^• TS:X  a#  [         R                  " ST R                  U5      nOUU 4S jn[         R                  " SXA5      n[        USS5      n[	        US5      $ )NÚ	utf_16_bez\\[0-9a-fA-F]{4}c                 ó(   >• TR                  U T5      $ r   )Úunescape_byte_)Úmrñ  r:   s    €€r   Ú<lambda>Ú)Parser.unescape_string_.<locals>.<lambda>ü  s   ø€  ×!4Ñ!4°Q¸Ô!ArB   z\\[0-9a-fA-F]{2}Úsurrogatepass)Úrer  Úunescape_unichr_r
   r   )r:   r°  rñ  r   ÚunescapeÚutf16s   ` `   r   rï  ÚParser.unescape_string_ø  sW   ù€ Ø�{Ó"Ü—’Ð*¨D×,AÑ,AÀ6ÓJ‰AåAˆHÜ—’Ð*¨HÓ=ˆAô ˜˜;¨Ó8ˆÜ�U˜KÓ(Ð(rB   c                 óT   • U R                  S5      SS  n[        [        US5      5      $ ©Nr   r   é   )ÚgroupÚchrÚint)Úmatchr”  s     r   r  ÚParser.unescape_unichr_  s&   € à�K‰K˜‹N˜1˜2ÐˆÜ”3�q˜"“:‹ÐrB   c                 ór   • U R                  S5      SS  n[        [        US5      5      R                  U5      $ r	  )r  r	   r  Údecode)r  rñ  r”  s      r   rþ  ÚParser.unescape_byte_	  s2   € à�K‰K˜‹N˜1˜2ÐˆÜ”s˜1˜b“zÓ"×)Ñ)¨(Ó3Ð3rB   c                 óœ   • [        U5       H=  n[        X0R                  R                  5      (       a  M)  [        X25      (       a  Us  $   g    g r   )ÚreversedrÛ   r*   r]   )r:   rY   Úclass_Úpreviouss       r   Úfind_previousÚParser.find_previous  sC   € Ü  Ö,ˆHÜ˜(§H¡H×$4Ñ$4×5Ñ5ÙÜ˜H×-Ñ-Ø’ñ ñ -ð rB   c           	      óh  • UR                   nU R                  S:w  d  U R                  (       Ga  U R                  SS9  U R                  [
        R                  L a?  UR                  U R                  R                  U R                  U R                  S95        GOqU R                  S5      (       a  U R                  5       nGOIU R                  S5      (       aQ  U R                  [        W5      5      nUR                  U R                  R!                  UUSU R                  S95        GOâU R                  S5      (       a‹  U R#                  U[        R                   5      nUc  [%        S	U R                  5      eUR&                  (       a  [%        S
U R                  5      eUR(                  R                  U R+                  5       5        GOAU R                  S5      (       a  U R                  5       nGOU R                  S5      (       aP  U R                  [        W5      5      nUR                  U R                  R!                  UUSU R                  S95        O³U R                  S5      (       aŠ  U R#                  U[        R                   5      nUc  [%        S	U R                  5      eUR&                  (       d  [%        SU R                  5      eUR(                  R                  U R+                  5       5        OU R                  S:X  a  GMþ  U R                  S:w  a  GMï  U R                  (       a  GM  g g )Nr˜   Tr!   rD   úHorizAxis.BaseTagListúHorizAxis.BaseScriptListFzHorizAxis.MinMaxz)MinMax must be preceded by BaseScriptListz9HorizAxis.MinMax must be preceded by HorizAxis statementsúVertAxis.BaseTagListúVertAxis.BaseScriptListzVertAxis.MinMaxz7VertAxis.MinMax must be preceded by VertAxis statementsrU   )rY   r4   r5   r9   rZ   r   r[   r\   r*   r]   r^   r_   r`   Úparse_base_tag_list_Úparse_base_script_list_r&   ÚBaseAxisr  r   rN   ÚminmaxÚparse_base_minmax_)r:   rS   rY   Úhoriz_basesÚhoriz_scriptsÚbase_script_listÚ
vert_basesÚvert_scriptss           r   rÂ  ÚParser.parse_table_BASE_  sº  € Ø×%Ñ%ˆ
Ø×Ñ #Ó%¨×);×);Ð);Ø×Ñ¨ÐÑ.Ø×#Ñ#¤u§}¡}Ò4Ø×!Ñ!Ø—H‘H×$Ñ$ T§_¡_¸t×?WÑ?WÐ$ÐXöð ×%Ñ%Ð&=×>Ñ>Ø"×7Ñ7Ó9’Ø×%Ñ%Ð&@×AÑAØ $× <Ñ <¼SÀÓ=MÓ N�Ø×!Ñ!Ø—H‘H×%Ñ%Ø#Ø%ØØ!%×!9Ñ!9ð	 &ð öð ×%Ñ%Ð&8×9Ñ9Ø#'×#5Ñ#5°jÄ#Ç,Á,Ó#OÐ Ø#Ñ+Ü)ØCØ×0Ñ0óð ð $×,×,Ü)ØSØ×0Ñ0óð ð !×'Ñ'×.Ñ.¨t×/FÑ/FÓ/HÖIØ×%Ñ%Ð&<×=Ñ=Ø!×6Ñ6Ó8’
Ø×%Ñ%Ð&?×@Ñ@Ø#×;Ñ;¼CÀ
»OÓL�Ø×!Ñ!Ø—H‘H×%Ñ%Ø"Ø$ØØ!%×!9Ñ!9ð	 &ð õð ×%Ñ%Ð&7×8Ñ8Ø#'×#5Ñ#5°jÄ#Ç,Á,Ó#OÐ Ø#Ñ+Ü)ØCØ×0Ñ0óð ð (×0×0Ü)ØQØ×0Ñ0óð ð !×'Ñ'×.Ñ.¨t×/FÑ/FÓ/HÕIØ—‘ CÓ'Úðs ×Ñ #Ö%¨×);×);Ô);rB   c                 óZ  • UR                   nSnSnU R                  S:w  d  U R                  (       Gaù  U R                  SS9  U R                  [
        R                  L a?  UR                  U R                  R                  U R                  U R                  S95        GOfU R                  [
        R                  L Ga5  U R                  R                  5       nS nU R                  U;   a  U R                  5       nOÄU R                  S5      (       a4  / n[!        S5       H"  nUR                  U R                  5       5        M$     OzU R                  U;   aD  / nU R                  S	:w  a1  UR                  U R                  5       5        U R                  S	:w  a  M1  O&U R                  S
5      (       a  U R#                  5       nUR                  U R                  R%                  XVU R                  S95        OU R                  S	:X  a  GMó  U R                  S:w  a  GMä  U R                  (       a  GMø  g g )N)ÚFSTypeÚTypoAscenderÚTypoDescenderÚTypoLineGapÚ	winAscentÚ
winDescentÚXHeightÚ	CapHeightÚWeightClassÚ
WidthClassÚLowerOpSizeÚUpperOpSize)ÚUnicodeRangeÚCodePageRanger˜   Tr!   rD   ÚPanoseé
   rU   ÚVendor)rY   r4   r5   r9   rZ   r   r[   r\   r*   r]   r^   r_   rm   rÕ  rˆ   r`   rÇ   rî  ÚOS2Field)r:   rS   rY   ÚnumbersrÎ   rÙ  rH  rÊ   s           r   rÃ  ÚParser.parse_table_OS_2_X  s¿  € Ø×%Ñ%ˆ
ð
ˆð 3ˆØ×Ñ #Ó%¨×);×);Ð);Ø×Ñ¨ÐÑ.Ø×#Ñ#¤u§}¡}Ò4Ø×!Ñ!Ø—H‘H×$Ñ$ T§_¡_¸t×?WÑ?WÐ$ÐXöð ×%Ñ%¬¯©Ó3Ø—o‘o×+Ñ+Ó-�Ø�Ø—?‘? gÓ-Ø ×/Ñ/Ó1‘EØ×)Ñ)¨(×3Ñ3Ø�EÜ" 2žY˜ØŸ™ T×%8Ñ%8Ó%:Ö;ò 'à—_‘_¨Ó.Ø�EØ×*Ñ*¨cÓ1ØŸ™ T×%8Ñ%8Ó%:Ô;ð ×*Ñ*¨cÕ1øà×)Ñ)¨(×3Ñ3Ø ×/Ñ/Ó1�EØ×!Ñ!Ø—H‘H×%Ñ% c¸4×;SÑ;SÐ%ÐTõð —‘ CÓ'Úð3 ×Ñ #Ö%¨×);×);Ô);rB   c           	      ó’  • U R                  S5      (       d   eU R                  S5        / nU R                  S:w  d  U R                  (       aÌ  U R	                  5         U R                  S5      (       aM  U R                  5       u  p#pEU R                  R                  SUUUUU R                  S9nUR                  U5        O4U R                  S:w  a$  [        SU R                   S	3U R                  5      eU R                  S:w  a  M¹  U R                  (       a  MÌ  U R                  S5        U(       d  [        S
U R                  5      eU$ )NÚElidedFallbackNamer´  r˜   rr   ÚstatrD   rU   úUnexpected token z in ElidedFallbackNameúExpected "name")r`   r�   r4   r5   r9   rõ  r*   ÚSTATNameStatementr_   r\   r^   r   )r:   Únamesr­  r®  r¯  r°  Ú
nameRecords          r   Úparse_STAT_ElidedFallbackNameÚ$Parser.parse_STAT_ElidedFallbackName„  s-  € Ø×#Ñ#Ð$8×9Ñ9Ð9Ð9Ø×Ñ˜CÔ ØˆØ×Ñ #Ó%¨×);×);Ø×ÑÔ!Ø×#Ñ# F×+Ñ+Ø8<×8MÑ8MÓ8OÑ5�
 vØ!ŸX™X×7Ñ7ØØØØØØ!×5Ñ5ð 8ð �
ð —‘˜ZÕ(à—?‘? cÓ)Ü)Ø+¨D¯O©OÐ+<Ð<VÐWØ×0Ñ0óð ð ×Ñ #Õ%¨×);×);Ñ);ð& 	×Ñ˜CÔ ÞÜ!Ð"3°T×5MÑ5MÓNÐNØˆrB   c           	      óˆ  • U R                  S5      (       d   e/ nU R                  5       nUS;  a.  UR                  5       (       d  [        R	                  SU S35        U R                  5       nU R                  S5        U R                  S:w  d  U R                  (       aì  U R                  5         U R                  [        R                  L a  MP  U R                  S5      (       aM  U R                  nU R                  5       u  pVpxU R                  R!                  SXVXxUS	9n	UR#                  U	5        O5U R$                  S
:X  a  MÅ  ['        SU R$                   3U R                  5      eU R                  S:w  a  MÙ  U R                  (       a  Mì  U R                  S5        U R                  R)                  X#XR                  5      $ )NÚ
DesignAxis)ÚitalÚopszÚslntÚwdthÚwghtzUnregistered axis tag z should be uppercase.r´  r˜   rr   r@  rD   rU   zExpected "name", got )r`   r™   Úisupperrâ   rã   rˆ   r�   r4   r5   r9   rZ   r   r[   r_   rõ  r*   rC  r\   r^   r   ÚSTATDesignAxisStatement)
r:   rD  ÚaxisTagÚ	axisOrderrE   r­  r®  r¯  r°  rr   s
             r   Úparse_STAT_design_axisÚParser.parse_STAT_design_axis   s‹  € Ø×#Ñ# L×1Ñ1Ð1Ð1ØˆØ×"Ñ"Ó$ˆàÐCÓCØ—O‘O×%Ñ%ä�K‰KÐ0°°	Ð9NÐOÔPØ×'Ñ'Ó)ˆ	Ø×Ñ˜CÔ Ø×Ñ #Ó%¨×);×);Ø×ÑÔ!Ø×#Ñ#¤u§}¡}Ò4ÙØ×%Ñ% f×-Ñ-Ø×3Ñ3�Ø8<×8MÑ8MÓ8OÑ5�
 vØ—x‘x×1Ñ1Ø˜J°6ÈHð 2ð �ð —‘˜TÕ"Ø—‘ CÓ'Ùä%Ø+¨D¯O©OÐ+<Ð=¸t×?WÑ?Wóð ð ×Ñ #Õ%¨×);×);Ñ);ð$ 	×Ñ˜CÔ Ø�x‰x×/Ñ/Ø ×'?Ñ'?ó
ð 	
rB   c           	      ól  • U R                  S5      (       d   eU R                  S5        / n/ nSnU R                  S:w  d  U R                  (       GaN  U R	                  SS9  U R
                  [        R                  L a  MP  U R                  S5      (       aM  U R                  nU R                  5       u  pVpxU R                  R                  SXVXxUS	9n	UR                  U	5        O–U R                  S
5      (       a"  U R                  5       nUR                  U5        O^U R                  S5      (       a  U R                  5       nO7U R                  S:X  a  GM%  [!        SU R                   S3U R                  5      eU R                  S:w  a  GM:  U R                  (       a  GMN  U R                  S5        U(       d  [!        SU R                  5      eU(       d  [!        SU R                  5      e[#        U5      S:”  a–  U HI  n[#        UR$                  5      S:”  d  M  [!        S[#        UR$                  5       S3U R                  5      e   / n
U H?  nUR&                  nXº;   a  [!        SU S3U R                  5      eU
R                  U5        MA     U R                  R)                  X!X0R                  5      $ )NÚ	AxisValuer´  r   r˜   Tr!   rr   r@  rD   rE   ÚflagrU   rA  z in AxisValuezExpected "Axis Name"zExpected "Axis location"r   z?Only one value is allowed in a Format 4 Axis Value Record, but z were found.ú	Axis tag z already defined.)r`   r�   r4   r5   r9   rZ   r   r[   r_   rõ  r*   rC  r\   Úparse_STAT_locationÚexpect_stat_flagsr^   r   r&   rü   rœ   ÚSTATAxisValueStatement)r:   Ú	locationsrD  rJ  rE   r­  r®  r¯  r°  rr   Úformat4_tagsrœ   s               r   Úparse_STAT_axis_value_ÚParser.parse_STAT_axis_value_Â  s€  € Ø×#Ñ# K×0Ñ0Ð0Ð0Ø×Ñ˜CÔ Øˆ	ØˆØˆØ×Ñ #Ó%¨×);×);Ð);Ø×Ñ¨ÐÑ.Ø×#Ñ#¤u§}¡}Ò4ÙØ×%Ñ% f×-Ñ-Ø×3Ñ3�Ø8<×8MÑ8MÓ8OÑ5�
 vØ—x‘x×1Ñ1Ø˜J°6ÈHð 2ð �ð —‘˜TÕ"Ø×%Ñ% j×1Ñ1Ø×3Ñ3Ó5�Ø× Ñ  Õ*Ø×%Ñ% f×-Ñ-Ø×.Ñ.Ó0‘Ø—‘ CÓ'Úä%Ø'¨¯©Ð'8Ð8IÐJØ×,Ñ,óð ð' ×Ñ #Ö%¨×);×);Ò);ð. 	×Ñ˜CÔ ÞÜ!Ð"8¸$×:RÑ:RÓSÐSÞÜ!Ð"<¸d×>VÑ>VÓWÐWÜˆy‹>˜AÓÛ%�Ü�x—‘Ó'¨!Õ+Ü)ð;ä˜xŸ™Ó/Ð0°ð>ð ×0Ñ0ó	ð ñ &ð ˆLÛ%�Ø—l‘l�ØÓ&Ü)Ø# C 5Ð(=Ð=¸t×?WÑ?Wóð ð ×#Ñ# CÖ(ñ &ð �x‰x×.Ñ.Ø˜e×%=Ñ%=ó
ð 	
rB   c           	      óâ  • / nU R                  5       n[        UR                  5       5      S:w  a$  [        SU R                   S3U R
                  5      eU R                  S:w  a´  U R                  [        R                  L a"  U R                  5       nUR                  U5        OcU R                  [        R                  L a"  U R                  5       nUR                  U5        O$[        SU R                   S3U R                  5      eU R                  S:w  a  M´  [        U5      S:X  a/  Uu  pEnXE:  d  XF:”  a   [        SU S	U S
U S3U R                  5      eU R                  R!                  X!5      $ )Nr<  rX  z must be 4 charactersrU   zUnexpected value "z". Expected integer or float.rè  zDefault value z is outside of specified range rÄ   Ú.)r™   r&   rÅ  r   r^   r_   r4   r3   r   r   Úexpect_float_r\   rF  rˆ   r6   r*   ÚAxisValueLocationStatement)r:   rü   rœ   rH  ÚnominalÚmin_valÚmax_vals          r   rY  ÚParser.parse_STAT_locationú  sf  € ØˆØ×ÑÓ ˆÜˆs�y‰y‹{Ó˜qÓ Ü!Ø˜DŸO™OÐ,Ð,EÐEØ×(Ñ(óð ð
 ×Ñ #Ó%Ø×$Ñ$¬¯©Ò3Ø×*Ñ*Ó,�Ø—‘˜eÕ$Ø×&Ñ&¬%¯,©,Ò6Ø×+Ñ+Ó-�Ø—‘˜eÕ$ä%Ø(¨×)9Ñ)9Ð(:ð ;1ð 1à×-Ñ-óð ð ×Ñ #Õ%ô ˆv‹;˜!ÓØ(.Ñ%ˆG˜gØÓ  GÓ$5Ü%Ø$ W Ið .*à�i˜q  	¨ð,ð ×-Ñ-ó	ð ð �x‰x×2Ñ2°3Ó?Ð?rB   c                 ó„  • UR                   n/ nU R                  S:w  d  U R                  (       Ga�  U R                  SS9  U R                  [
        R                  L a?  UR                  U R                  R                  U R                  U R                  S95        GOýU R                  [
        R                  L GaÌ  U R                  S5      (       a<  U R                  5       nUR                  U R                  R                  U5      5        GO�U R                  S5      (       aM  U R!                  5       nUR                  U R                  R#                  U5      5        U R%                  S5        GO*U R                  S5      (       aN  U R'                  5       nUR                  UR(                  5        UR                  U5        U R%                  S5        OÆU R                  S	5      (       az  U R+                  5       nUR,                   H7  nUR(                  U;  d  M  [/        S
UR(                   S3U R                  5      e   UR                  U5        U R%                  S5        O6[/        SU R                   3U R                  5      eU R                  S:X  a  GMŠ  U R                  S:w  a  GM{  U R                  (       a  GM�  g g )Nr˜   Tr!   rD   r?  ÚElidedFallbackNameIDrU   rI  rV  zDesignAxis not defined for ra  rA  )rY   r4   r5   r9   rZ   r   r[   r\   r*   r]   r^   r_   rm   r`   rF  r?  rˆ   ri  r�   rS  rœ   r^  r\  r   )	r:   rS   rY   Údesign_axesrD  rH  Ú
designAxisÚaxisValueRecordrE   s	            r   rÄ  ÚParser.parse_table_STAT_  s8  € Ø×%Ñ%ˆ
ØˆØ×Ñ #Ó%¨×);×);Ð);Ø×Ñ¨ÐÑ.Ø×#Ñ#¤u§}¡}Ò4Ø×!Ñ!Ø—H‘H×$Ñ$ T§_¡_¸t×?WÑ?WÐ$ÐXöð ×%Ñ%¬¯©Ó3Ø×'Ñ'Ð(<×=Ñ=Ø ×>Ñ>Ó@�EØ×%Ñ% d§h¡h×&AÑ&AÀ%Ó&HÖIØ×)Ñ)Ð*@×AÑAØ ×/Ñ/Ó1�EØ×%Ñ% d§h¡h×&CÑ&CÀEÓ&JÔKØ×'Ñ'¨Ö,Ø×)Ñ)¨,×7Ñ7Ø!%×!<Ñ!<Ó!>�JØ×&Ñ& z§~¡~Ô6Ø×%Ñ% jÔ1Ø×'Ñ'¨Õ,Ø×)Ñ)¨+×6Ñ6Ø&*×&AÑ&AÓ&C�OØ$3×$=Ô$=˜Ø#Ÿ<™<¨{Õ:ô #2Ø =ÀÇÁÀÈaÐ PØ $× 8Ñ 8ó#ð ñ	 %>ð ×%Ñ% oÔ6Ø×'Ñ'¨Õ,ä)Ø+¨D¯O©OÐ+<Ð=¸t×?WÑ?Wóð ð —‘ CÓ'ÚðI ×Ñ #Ö%¨×);×);Ô);rB   c                 óð   • U R                   S;   d   U R                   5       e/ nU R                  S:w  a1  UR                  U R                  5       5        U R                  S:w  a  M1  U R	                  S5        U$ )N)r  r  rU   )r^   r4   r\   r|  r�   )r:   Úbasess     r   r  ÚParser.parse_base_tag_list_D  sx   € à�‰ð #
ó 
ð 	ð �?‰?ó	ð 
ð ˆØ×Ñ #Ó%Ø�L‰L˜×0Ñ0Ó2Ô3ð ×Ñ #Õ%à×Ñ˜CÔ ØˆrB   c                 ó4  • U R                   S;   d   U R                   5       eU R                  U5      /nU R                  S:X  aC  U R                  S5        UR	                  U R                  U5      5        U R                  S:X  a  MC  U R                  S5        U$ )N)r  r  r¶   rU   )r^   Úparse_base_script_record_r4   r�   r\   )r:   r“  Úscriptss      r   r  ÚParser.parse_base_script_list_P  s˜   € Ø�‰ð #
ó 
ð 	ð �?‰?ó	ð 
ð ×1Ñ1°%Ó8Ð9ˆØ×Ñ #Ó%Ø×Ñ Ô$Ø�N‰N˜4×9Ñ9¸%Ó@ÔAð ×Ñ #Õ%ð 	×Ñ˜CÔ ØˆrB   c                 ó¤   • U R                  5       nU R                  5       n[        U5       Vs/ s H  o@R                  5       PM     nnX#U4$ s  snf r   )r|  rÇ   rˆ   )r:   r“  Ú
script_tagÚbase_tagrÊ   Úcoordss         r   rr  Ú Parser.parse_base_script_record_\  sM   € Ø×,Ñ,Ó.ˆ
Ø×*Ñ*Ó,ˆÜ16°u´Ó>²¨A×%Ñ%Ö'±ˆÐ>Ø VÐ+Ð+ùò ?s   ®Ac                 ó|  • U R                  5       nU R                  5       nU R                  5       nU R                  5         U R                  [
        R                  L a  U R                  S:X  d  [        SU R                  5      eU R                  5       nU R                  S:X  a  [        SU R                  5      eXX44$ )Nr¶   z0Expected a comma between min and max coordinatesz0Feature tags are not yet supported in BASE table)r|  r   rˆ   r9   rZ   r   ro   r^   r   r_   r4   )r:   rv  r  Ú	min_coordÚ	max_coords        r   r"  ÚParser.parse_base_minmax_b  s²   € Ø×,Ñ,Ó.ˆ
Ø×,Ñ,Ó.ˆØ×'Ñ'Ó)ˆ	Ø×ÑÔØ×$Ñ$¬¯©Ò4¸¿¹ÈCÓ9OÜ!ØBØ×(Ñ(óð ð ×'Ñ'Ó)ˆ	Ø×Ñ˜sÓ"Ü!ØBØ×(Ñ(óð ð
  YÐ9Ð9rB   c                 óÐ  • S nU R                  S5        U R                  S5        U R                  S:X  a  U R                  S5        OŽU R                  5       U R                  5       4/nU R                  S:X  aR  U R                  S5        UR	                  U R                  5       U R                  5       45        U R                  S:X  a  MR  [        U5      nU R                  S5        U$ )Nrx   Údevicerz   r¶   r{   )r�   r‚   r4   rˆ   r\   Útuple)r:   Úresults     r   r‰   ÚParser.parse_device_u  sË   € ØˆØ×Ñ˜CÔ Ø×Ñ˜XÔ&Ø×Ñ˜vÓ%Ø× Ñ  Õ(à×*Ñ*Ó,¨d×.AÑ.AÓ.CÐDÐEˆFØ×"Ñ" cÓ)Ø×#Ñ# CÔ(Ø—‘˜t×2Ñ2Ó4°d×6IÑ6IÓ6KÐLÔMð ×"Ñ" cÕ)ô ˜6“]ˆFØ×Ñ˜CÔ ØˆrB   c                 ó’   • U R                   [        R                  L =(       d%    U R                  S:H  =(       d    U R                  S:H  $ )Nrx   Ú()r3   r   rF  r4   ©r:   s    r   r÷   ÚParser.is_next_value_„  s?   € à×!Ñ!¤U§\¡\Ð1÷ 'Ø×Ñ 3Ñ&÷'à×Ñ 3Ñ&ð	
rB   c                 ó¨  • U R                   [        R                  L a  U R                  S:X  d  U R                   [        R                  L aY  U R                  SS9U R                  p2U(       a  U R                  R                  X!US9nU$ U R                  R                  X!US9nU$ U R                  S5        U R                  nU R                   [        R                  L a³  U R                  5       nUS:X  a+  U R                  S5        U R                  R                  5       $ U R                  R                  U5      nUc  [        S	U-  U R                  5      eUR                  nUR                   UR"                  p˜UR$                  UR&                  pºO=U R                  SS9U R                  SS9U R                  SS9U R                  SS94u  p‰p«U R                  S:X  a¸  U R)                  5       U R)                  5       U R)                  5       U R)                  5       4u  pÍpï[+        U(       a  UOS
U(       a  UOS
-   U(       a  UOS
-   U(       a  UOS
-    VVs/ s H  u  nnUPM
     snn5      nUS   S:  d	  US   S:”  a  [        SU R                  5      eOSu  pÍpïU R                  S5        U R                  R                  UU	U
UUUUUUUS9
$ s  snnf )Nr„  Tr   )ÚyAdvancerN   rE   )ÚxAdvancerN   rE   rx   rz   r{   zUnknown valueRecordDef "%s"rƒ  r   i€ÿÿÿrö   é   z+Device value out of valid range (-128..127))NNNN)rN   rE   )r3   r   ro   r4   rF  rˆ   r_   r*   ÚValueRecordr�   rm   rƒ   r1   r„   r   rH  Ú
xPlacementÚ
yPlacementr‰  rˆ  r‰   rˆ  )r:   rN   ÚnumberrE   Úvalrr   ÚvrdrH  rŒ  r�  r‰  rˆ  Ú
xPlaDeviceÚ
yPlaDeviceÚ
xAdvDeviceÚ
yAdvDevicerª  ÚdeltaÚ	allDeltass                      r   rø   ÚParser.parse_valuerecord_‹  sô  € à×!Ñ!¤U§\¡\Ò1°d×6FÑ6FÈ#Ó6MØ×"Ñ"¤e§l¡lÒ2à×#Ñ#¨TÐ#Ð2Ø×(Ñ(ð ö Ø—h‘h×*Ñ*Ø#Àð +ð �ð ˆJð —h‘h×*Ñ*Ø#Àð +ð �ð ˆJØ×Ñ˜CÔ Ø×+Ñ+ˆØ× Ñ ¤E§J¡JÒ.Ø×$Ñ$Ó&ˆDØ�v‹~Ø×#Ñ# CÔ(Ø—x‘x×+Ñ+Ó-Ð-Ø×$Ñ$×,Ñ,¨TÓ2ˆCØ‰{Ü%Ø1°DÑ8¸$×:RÑ:Róð ð —I‘IˆEØ&+×&6Ñ&6¸×8HÑ8H˜
Ø"'§.¡.°%·.±.‘hð ×#Ñ#¨TÐ#Ð2Ø×#Ñ#¨TÐ#Ð2Ø×#Ñ#¨TÐ#Ð2Ø×#Ñ#¨TÐ#Ð2ð	:Ñ6ˆJ Hð ×Ñ˜sÓ"à×"Ñ"Ó$Ø×"Ñ"Ó$Ø×"Ñ"Ó$Ø×"Ñ"Ó$ð	>Ñ:ˆJ Jô ö 7A©
ÀbÞ%/‘z°Rñ(9æ%/‘z°Rñ(9ö &0‘z°Rò(9ôò(9™˜˜eó ñ(9òóˆIð ˜‰|˜dÓ" i°¡m°cÓ&9Ü%ØAØ×,Ñ,óð ð ':ð >VÑ:ˆJ Jà×Ñ˜CÔ Ø�x‰x×#Ñ#ØØØØØØØØØØð $ð 
ð 	
ùó#s   ÉK
c                 ó  • U R                  S5      (       d   eU R                  nU R                  U5      nU R                  5       nU R	                  S5        U R
                  R                  XCUS9nU R                  R                  XE5        U$ )NrT   rU   rD   )	r`   r_   rø   rƒ   r�   r*   ÚValueRecordDefinitionr1   r•   )r:   rN   rE   rH  rr   r�  s         r   rl   Ú$Parser.parse_valuerecord_definition_Ù  sƒ   € à×#Ñ#Ð$4×5Ñ5Ð5Ð5Ø×+Ñ+ˆØ×'Ñ'¨Ó1ˆØ× Ñ Ó"ˆØ×Ñ˜CÔ Ø�h‰h×,Ñ,¨TÀ8Ð,ÐLˆØ×Ñ×!Ñ! $Ô,Øˆ
rB   c                 óÔ   • U R                   S:X  d   eU R                  nU R                  5       nU R                  5       nU R	                  S5        U R
                  R                  X#US9$ )NrK   rU   rD   )r^   r_   r|  r   r�   r*   ÚLanguageSystemStatement)r:   rE   r{  r  s       r   rf   ÚParser.parse_languagesystem_ä  sd   € Ø�‰Ð"2Ó2Ð2Ð2Ø×+Ñ+ˆØ×(Ñ(Ó*ˆØ×,Ñ,Ó.ˆØ×Ñ˜CÔ Ø�x‰x×/Ñ/°È8Ð/ÐTÐTrB   c                 ó  • U(       a  U R                   S:X  d   eOU R                   S:X  d   eU R                  nU R                  5       nUS;   nS nS nSnX0R                  ;   a  UnOX0R                  ;   a  UnOUS:X  a  SnU(       a  U R                  5       nSn	U R                  S:X  a  U R                  S5        Sn	U(       a  U R                  R                  UWX’S9n
OU R                  R                  X9US9n
U R                  X¤XWU5        U
$ )	NrR   rP   >   ÚvaltÚvhalÚvkrnÚvpalFrª  Tr2  )r6  rE   )r^   r_   r™   ÚSS_FEATURE_TAGSÚCV_FEATURE_TAGSrƒ   r4   r‚   r*   ÚVariationBlockÚFeatureBlockr5  )r:   rR   rE   rœ   rN   ÚstylisticsetÚ
cv_featureÚsize_featurerQ   r6  r7  s              r   ri   ÚParser.parse_feature_block_ì  s  € ÞØ—?‘? kÓ1Ð1Ñ1à—?‘? iÓ/Ð/Ð/Ø×+Ñ+ˆØ×ÑÓ ˆØÐ:Ñ:ˆàˆØˆ
ØˆØ×&Ñ&Ó&Ø‰LØ×(Ñ(Ó(Ø‰JØ�F‹]ØˆLæØ×,Ñ,Ó.ˆLàˆØ×Ñ˜~Ó-Ø× Ñ  Ô0Ø ˆMæØ—H‘H×+Ñ+Ø�\°ð ,ð ‰Eð —H‘H×)Ñ)Ø¸8ð *ð ˆEð 	×Ñ˜%¨<ÀzÔRØˆrB   c                 óÐ   • U R                   S:X  d   U R                   5       eU R                  nU R                  5       nU R                  S5        U R                  R                  X!S9$ )NrP   rU   rD   )r^   r_   r™   r�   r*   ÚFeatureReferenceStatement)r:   rE   ÚfeatureNames      r   Úparse_feature_reference_ÚParser.parse_feature_reference_  s\   € Ø�‰ )Ó+Ð<¨T¯_©_Ó<Ð+Ø×+Ñ+ˆØ×&Ñ&Ó(ˆØ×Ñ˜CÔ Ø�x‰x×1Ñ1°+Ð1ÐQÐQrB   c                 ó6  • U R                   S:X  d   U R                   5       eU R                  R                  XR                   U R                  S9nU R	                  S5        U R
                   H  nUR                  5         M     U R                  S:w  d  U R                  (       Ga.  U R                  SS9  U R                  [        R                  L aH  UR                  R                  U R                  R                  U R                   U R                  S95        O“U R!                  S5      (       aT  U R                  nU R#                  5       u  pVpxUR                  R                  U R                  R%                  XXgX„S95        O)U R                   S:X  a  GM  ['        S	U R                  5      eU R                  S:w  a  GM  U R                  (       a  GM.  U R	                  S5        U R
                   H  nUR)                  5         M     U R	                  S5        U$ )
z®Parses a ``featureNames`` statement found in stylistic set features.
See section `8.c <https://adobe-type-tools.github.io/afdko/OpenTypeFeatureFileSpecification.html#8.c>`_.
ÚfeatureNamesrD   r´  r˜   Tr!   rr   rU   rB  )r^   r*   ÚNestedBlockr_   r�   r2   Úenter_scoper4   r5   r9   rZ   r   r[   rY   r\   r]   r`   r«  r¬  r   Ú
exit_scope)	r:   rœ   r7  ÚsymtabrE   r­  r®  r¯  r°  s	            r   Úparse_featureNames_ÚParser.parse_featureNames_  sÆ  € ð �‰ .Ó0ÐA°$·/±/ÓAÐ0Ø—‘×$Ñ$Ø—‘¨4×+CÑ+Cð %ð 
ˆð 	×Ñ˜CÔ Ø×)Ô)ˆFØ×ÑÖ ñ *à×Ñ #Ó%¨×);×);Ð);Ø×Ñ¨ÐÑ.Ø×#Ñ#¤u§}¡}Ò4Ø× Ñ ×'Ñ'Ø—H‘H×$Ñ$ T§_¡_¸t×?WÑ?WÐ$ÐXõð ×%Ñ% f×-Ñ-Ø×3Ñ3�Ø8<×8HÑ8HÓ8JÑ5�
 vØ× Ñ ×'Ñ'Ø—H‘H×1Ñ1Ø¨¸Fð 2ð õð
 —‘ CÓ'Úä%Ð&7¸×9QÑ9QÓRÐRð# ×Ñ #Ö%¨×);×);Ò);ð$ 	×Ñ˜CÔ Ø×)Ô)ˆFØ×ÑÖñ *à×Ñ˜CÔ ØˆrB   c                 ó¢  • U R                   S:X  d   U R                   5       eU R                  R                  XR                   U R                  S9nU R	                  S5        U R
                   H  nUR                  5         M     UR                  nU R                  S:w  d  U R                  (       GaX  U R                  SS9  U R                  [        R                  L a>  UR                  U R                  R                  U R                   U R                  S95        OÇU R!                  1 Sk5      (       a+  UR                  U R#                  XR                   5      5        O„U R!                  S5      (       a!  UR                  U R%                  U5      5        OMU R                   S	:X  a  GM  ['        S
R)                  U R                  U R                   5      U R                  5      eU R                  S:w  a  GMD  U R                  (       a  GMX  U R	                  S5        U R
                   H  nUR+                  5         M     U R	                  S	5        U$ )NÚcvParametersrD   r´  r˜   Tr!   >   ÚSampleTextNameIDÚFeatUILabelNameIDÚParamUILabelNameIDÚFeatUITooltipTextNameIDÚ	CharacterrU   zExpected statement: got {} {})r^   r*   r²  r_   r�   r2   r³  rY   r4   r5   r9   rZ   r   r[   r\   r]   r`   Úparse_cvNameIDs_Úparse_cvCharacter_r   rp   r´  )r:   rœ   r7  rµ  rY   s        r   Úparse_cvParameters_ÚParser.parse_cvParameters_<  sì  € ð �‰ .Ó0ÐA°$·/±/ÓAÐ0Ø—‘×$Ñ$Ø—‘¨4×+CÑ+Cð %ð 
ˆð 	×Ñ˜CÔ Ø×)Ô)ˆFØ×ÑÖ ñ *ð ×%Ñ%ˆ
Ø×Ñ #Ó%¨×);×);Ð);Ø×Ñ¨ÐÑ.Ø×#Ñ#¤u§}¡}Ò4Ø×!Ñ!Ø—H‘H×$Ñ$ T§_¡_¸t×?WÑ?WÐ$ÐXõð ×%Ñ%ò÷ñ ð ×!Ñ! $×"7Ñ"7¸¿_¹_Ó"MÕNØ×%Ñ% k×2Ñ2Ø×!Ñ! $×"9Ñ"9¸#Ó">Õ?Ø—‘ CÓ'Úä%Ø3×:Ñ:Ø×,Ñ,¨d¯o©oóð ×,Ñ,ó	ð ð) ×Ñ #Ö%¨×);×);Ò);ð6 	×Ñ˜CÔ Ø×)Ô)ˆFØ×ÑÖñ *à×Ñ˜CÔ ØˆrB   c                 ó*  • U R                   U:X  d   U R                   5       eU R                  R                  XU R                  S9nU R	                  S5        U R
                   H  nUR                  5         M     U R                  S:w  d  U R                  (       Ga2  U R                  SS9  U R                  [        R                  L aH  UR                  R                  U R                  R                  U R                   U R                  S95        O—U R!                  S5      (       aX  U R                  nU R#                  5       u  pgp‰UR                  R                  U R                  R%                  UUUUU	UUS95        O)U R                   S:X  a  GM  ['        SU R                  5      eU R                  S:w  a  GM  U R                  (       a  GM2  U R	                  S5        U R
                   H  nUR)                  5         M     U R	                  S5        U$ )	NrD   r´  r˜   Tr!   rr   rU   rB  )r^   r*   r²  r_   r�   r2   r³  r4   r5   r9   rZ   r   r[   rY   r\   r]   r`   r«  ÚCVParametersNameStatementr   r´  )
r:   rœ   Ú
block_namer7  rµ  rE   r­  r®  r¯  r°  s
             r   r¿  ÚParser.parse_cvNameIDs_i  sÇ  € Ø�‰ *Ó,Ð=¨d¯o©oÓ=Ð,Ø—‘×$Ñ$ S¸t×?WÑ?WÐ$ÐXˆØ×Ñ˜CÔ Ø×)Ô)ˆFØ×ÑÖ ñ *à×Ñ #Ó%¨×);×);Ð);Ø×Ñ¨ÐÑ.Ø×#Ñ#¤u§}¡}Ò4Ø× Ñ ×'Ñ'Ø—H‘H×$Ñ$ T§_¡_¸t×?WÑ?WÐ$ÐXõð ×%Ñ% f×-Ñ-Ø×3Ñ3�Ø8<×8HÑ8HÓ8JÑ5�
 vØ× Ñ ×'Ñ'Ø—H‘H×6Ñ6ØØ"Ø!ØØØ"Ø!)ð 7ð õ
ð —‘ CÓ'Úä%Ð&7¸×9QÑ9QÓRÐRð/ ×Ñ #Ö%¨×);×);Ò);ð0 	×Ñ˜CÔ Ø×)Ô)ˆFØ×ÑÖñ *à×Ñ˜CÔ ØˆrB   c                 ó&  • U R                   S:X  d   U R                   5       eU R                  U R                  5       p2U R                  S5        SUs=:¼  a  S:¼  d  O  [	        SR                  SS5      U5      eU R                  R                  X1US9$ )Nr¾  rU   iÿÿÿ r   z/Character value must be between {:#x} and {:#x}rD   )r^   r_   rí  r�   r   rp   r*   ÚCharacterStatement)r:   rœ   rE   Ú	characters       r   rÀ  ÚParser.parse_cvCharacter_�  s‹   € Ø�‰ +Ó-Ð>¨t¯©Ó>Ð-Ø"×6Ñ6¸×8OÑ8OÓ8Q�)Ø×Ñ˜CÔ Ø˜IÕ*¨Õ*Ü!ð"ß"(¡&¨¨HÓ"5Øóð ð
 �x‰x×*Ñ*¨9ÀHÐ*ÐMÐMrB   c                 óò   • U R                   S:X  d   U R                   5       eU R                  U R                  5       p!U R                  S5        US::  a  [	        SU5      eU R
                  R                  X!S9$ )NrÌ  rU   r   z&Font revision numbers must be positiverD   )r^   r_   rb  r�   r   r*   ÚFontRevisionStatement)r:   rE   Úversions      r   rÍ  ÚParser.parse_FontRevision_™  sp   € ð �‰ .Ó0ÐA°$·/±/ÓAÐ0Ø ×4Ñ4°d×6HÑ6HÓ6J�'Ø×Ñ˜CÔ Ø�a‹<Ü!Ð"JÈHÓUÐUØ�x‰x×-Ñ-¨gÐ-ÐIÐIrB   c                 ó´  • U R                  5       n0 nU R                  S5        U R                  S:w  GaK  U R                  5         U R                  [
        R                  La  [        SU R                  5      eU R                  nX2;   a  [        SU 3U R                  5      eU R                  [
        R                  L a  U R                  5       nO,U R                  [
        R                  L a  U R                  SS9nU R                  [
        R                  L a  U R                  5       nO,U R                  [
        R                  L a  U R                  SS9nU R                  S5        WW4X#'   U R                  S:w  a  GMK  U R                  S5        U R                  5       nXa:w  a  [        SU-  U R                  5      eU R                  R!                  X5      $ )	Nr´  r˜   úExpected an axis namezRepeated condition for axis Fr   rU   r»  )rƒ   r�   r4   r9   rZ   r   rm   r   r_   r^   r3   r   rb  rF  rˆ   r*   ÚConditionsetStatement)r:   rr   Ú
conditionsÚaxisÚ	min_valueÚ	max_valueÚ	finalnames          r   rj   ÚParser.parse_conditionset_£  s™  € Ø× Ñ Ó"ˆàˆ
Ø×Ñ˜CÔ à×Ñ #Ô%Ø×ÑÔ!Ø×#Ñ#¬5¯:©:Ò5Ü%Ð&=¸t×?WÑ?WÓXÐXà—?‘?ˆDØÓ!Ü%Ø2°4°&Ð9¸4×;SÑ;Sóð ð ×$Ñ$¬¯©Ò3Ø ×.Ñ.Ó0‘	Ø×&Ñ&¬%¯,©,Ò6Ø ×/Ñ/¸Ð/Ð?�	à×$Ñ$¬¯©Ò3Ø ×.Ñ.Ó0‘	Ø×&Ñ&¬%¯,©,Ò6Ø ×/Ñ/¸Ð/Ð?�	Ø×Ñ Ô$à )¨9Ð5ˆJÑð- ×Ñ #Ö%ð0 	×Ñ˜CÔ à×%Ñ%Ó'ˆ	ØÓÜ! /°DÑ"8¸$×:RÑ:RÓSÐSØ�x‰x×-Ñ-¨dÓ?Ð?rB   c                 ó¨  • U R                  S5        U R                   H  nUR                  5         M     UR                  nU R                  S:w  d  U R
                  (       GaM  U R                  SS9  U R                  [        R                  L a?  UR                  U R                  R                  U R                  U R                  S95        GO»U R                  [        R                  L a!  UR                  U R!                  5       5        GO}U R#                  S5      (       a!  UR                  U R%                  5       5        GOFU R#                  SS15      (       a   UR                  U R'                  US	95        GOU R#                  S
5      (       a!  UR                  U R)                  5       5        GO×U R#                  S5      (       a!  UR                  U R+                  5       5        GO U R#                  S5      (       a!  UR                  U R-                  5       5        GOiU R#                  S5      (       a"  UR                  U R/                  U5      5        GO1U R#                  S5      (       a!  UR                  U R1                  5       5        GOúU R#                  S5      (       a!  UR                  U R3                  5       5        GOÃU R#                  SS15      (       a!  UR                  U R5                  SUS95        GOŠU R#                  S5      (       a!  UR                  U R7                  5       5        GOSU R#                  1 Sk5      (       a!  UR                  U R9                  5       5        GOU R#                  S5      (       a!  UR                  U R;                  5       5        GOãU R#                  S5      (       a"  UR                  U R=                  U5      5        GO«U(       a8  U R#                  S5      (       a"  UR                  U R?                  U5      5        GOlU(       a8  U R#                  S5      (       a"  UR                  U RA                  U5      5        GO-U(       a6  U R#                  S5      (       a   UR                  U RC                  5       5        OðU(       a6  U R#                  S5      (       a   UR                  U RE                  5       5        O³U R                  [        RF                  L aI  U R                  U RH                  ;   a/  UR                  U RH                  U R                     " U 5      5        OMU R                  S:X  a  GM  [K        SRM                  U R                  U R                  5      U R                  5      eU R                  S:w  a  GM9  U R
                  (       a  GMM  U R                  S5        U R                   H  nURO                  5         M     U RQ                  5       nX�RR                  RU                  5       :w  a1  [K        SURR                  RU                  5       -  U R                  5      eU R                  S5        g )Nr´  r˜   Tr!   rD   rJ   r­   r®   rM   rP   r  r  rL   r:  rO   r  r  Fr¯   r{  >   r  r�  r‚  r  r™  rT   r±  r¹  rž  r©  rU   z7Expected glyph class definition or statement: got {} {}r»  )+r�   r2   r³  rY   r4   r5   r9   rZ   r   r[   r\   r*   r]   r^   r_   rb   rc   r`   re   r²   r®  r  r#  rg   rL  rh   r±   r~  r–  r›  rl   r¶  rÁ  r¦  r±  rm   rn   r   rp   r´  rƒ   rr   rÅ  )	r:   r7  rN   r§  r©  r¨  rµ  rY   rr   s	            r   r5  ÚParser.parse_block_È  sÔ  € ð 	×Ñ˜CÔ Ø×)Ô)ˆFØ×ÑÖ ñ *ð ×%Ñ%ˆ
Ø×Ñ #Ó%¨×);×);Ð);Ø×Ñ¨ÐÑ.Ø×#Ñ#¤u§}¡}Ò4Ø×!Ñ!Ø—H‘H×$Ñ$ T§_¡_¸t×?WÑ?WÐ$ÐXöð ×%Ñ%¬×)9Ñ)9Ò9Ø×!Ñ! $×"CÑ"CÓ"EÖFØ×%Ñ% k×2Ñ2Ø×!Ñ! $×"7Ñ"7Ó"9Ö:Ø×%Ñ% v¨{Ð&;×<Ñ<Ø×!Ñ! $×"7Ñ"7ÀÐ"7Ð"JÖKØ×%Ñ% i×0Ñ0Ø×!Ñ! $×"?Ñ"?Ó"AÖBØ×%Ñ% h×/Ñ/Ø×!Ñ! $×"4Ñ"4Ó"6Ö7Ø×%Ñ% j×1Ñ1Ø×!Ñ! $×"6Ñ"6Ó"8Ö9Ø×%Ñ% h×/Ñ/Ø×!Ñ! $×"4Ñ"4°XÓ">Ö?Ø×%Ñ% l×3Ñ3Ø×!Ñ! $×"8Ñ"8Ó":Ö;Ø×%Ñ% k×2Ñ2Ø×!Ñ! $×"7Ñ"7Ó"9Ö:Ø×%Ñ% u¨jÐ&9×:Ñ:Ø×!Ñ!Ø×(Ñ(°EÀHÐ(ÐMöð ×%Ñ% h×/Ñ/Ø×!Ñ! $×"4Ñ"4Ó"6Ö7Ø×%Ñ%Ò&Q×RÑRØ×!Ñ! $×"8Ñ"8Ó":Ö;Ø×%Ñ% j×1Ñ1Ø×!Ñ! $×"6Ñ"6Ó"8Ö9Ø×%Ñ%Ð&6×7Ñ7Ø×!Ñ! $×"DÑ"DÀXÓ"NÖOÞ $×"6Ñ"6°~×"FÑ"FØ×!Ñ! $×":Ñ":¸<Ó"HÖIÞ × 4Ñ 4°^× DÑ DØ×!Ñ! $×":Ñ":¸:Ó"FÖGÞ $×"6Ñ"6°|×"DÑ"DØ×!Ñ! $×"=Ñ"=Ó"?Õ@Þ $×"6Ñ"6°~×"FÑ"FØ×!Ñ! $×";Ñ";Ó"=Õ>à×$Ñ$¬¯
©
Ò2Ø—O‘O t§¡Ó6à×!Ñ! $§/¡/°$·/±/Ò"BÀ4Ó"HÕIØ—‘ CÓ'Úä%ØM×TÑTØ×,Ñ,¨d¯o©oóð ×,Ñ,ó	ð ði ×Ñ #Ö%¨×);×);Ò);ðv 	×Ñ˜CÔ Ø×)Ô)ˆFØ×ÑÖñ *ð × Ñ Ó"ˆØ—:‘:×#Ñ#Ó%Ó%Ü!Ø %§*¡*×"2Ñ"2Ó"4Ñ4°d×6NÑ6Nóð ð 	×Ñ˜CÕ rB   c                 ó®   • U R                   [        R                  L a8  [        U[	        S5      5      (       a  U R
                  U:H  $ U R
                  U;   $ g)Nr   F)rZ   r   rm   rÛ   Útyper^   )r:   r   s     r   r`   ÚParser.is_cur_keyword_  sF   € Ø×Ñ¤5§:¡:Ò-Ü˜!œT "›X×&Ñ&Ø—‘¨!Ñ+Ð+à—‘¨!Ñ+Ð+ØrB   c                 ó    • U R                  5         U R                  [        R                  La  [	        SU R
                  5      eU R                  $ )NzExpected @NAME)r9   rZ   r   rb   r   r_   r^   r…  s    r   rP  ÚParser.expect_class_name_  s@   € Ø×ÑÔØ×Ñ¤u×'7Ñ'7Ò7Ü!Ð"2°D×4LÑ4LÓMÐMØ�‰ÐrB   c                 ó    • U R                  5         U R                  [        R                  L a  U R                  $ [        SU R                  5      e)NzExpected a CID)r9   rZ   r   rÖ   r^   r   r_   r…  s    r   rå   ÚParser.expect_cid_$  s>   € Ø×ÑÔØ×Ñ¤5§9¡9Ò,Ø—?‘?Ð"ÜÐ.°×0HÑ0HÓIÐIrB   c                 ó    • U R                  5         U R                  [        R                  La  [	        SU R
                  5      eU R                  $ )NzExpected file name)r9   rZ   r   ÚFILENAMEr   r_   r^   r…  s    r   r  ÚParser.expect_filename_*  s>   € Ø×ÑÔØ×Ñ¤u§~¡~Ò5Ü!Ð"6¸×8PÑ8PÓQÐQØ�‰ÐrB   c                 ó  • U R                  5         U R                  [        R                  L a  U R                  R                  S5      $ U R                  [        R                  L a  SU R                  -  $ [        SU R                  5      e)NÚ\úcid%05dzExpected a glyph name or CID)	r9   rZ   r   rm   r^   ÚlstriprÖ   r   r_   r…  s    r   rØ   ÚParser.expect_glyph_0  sj   € Ø×ÑÔØ×Ñ¤5§:¡:Ò-Ø—?‘?×)Ñ)¨$Ó/Ð/Ø×!Ñ!¤U§Y¡YÒ.Ø˜tŸ™Ñ.Ð.ÜÐ<¸d×>VÑ>VÓWÐWrB   c                 ó°   • U R                   (       aE  U H>  nX R                   ;   a  M  X R                  ;  d  M%  U R                  U R                  U'   M@     gg)zËAdds a glyph name (just `start`) or glyph names of a
range (`start` and `end`) which are not in the glyph set
to the "missing list" for future error reporting.

If no glyph set is present, does nothing.
N)r)   r8   r_   )r:   rD  rr   s      r   rÙ   Ú$Parser.check_glyph_name_in_glyph_set8  sI   € ð ××Û�Ø×+Ñ+Ó+ÙØŸ|™|Õ+Ø)-×)AÑ)A�D—L‘L Ó&ò	 ð rB   c                 ó  • U R                  5       nU R                  R                  U5      nUc  [        SU-  U R                  5      e[        X R                  R                  5      (       d  [        SU-  U R                  5      eU$ )NzUnknown markClass @%sz@%s is not a markClass)rP  r/   r„   r   r_   rÛ   r*   rÜ   )r:   rr   Úmcs      r   r�   Ú"Parser.expect_markClass_reference_F  sƒ   € Ø×&Ñ&Ó(ˆØ×Ñ×'Ñ'¨Ó-ˆØ‰:Ü!Ø'¨$Ñ.°×0HÑ0Hóð ô ˜"Ÿh™h×0Ñ0×1Ñ1Ü!Ø(¨4Ñ/°×1IÑ1Ióð ð ˆ	rB   c                 ó
  • U R                  5         U R                  [        R                  La  [	        SU R
                  5      e[        U R                  5      S:”  a  [	        SU R
                  5      eU R                  S-   S S $ )NzExpected a tagr<  z'Tags cannot be longer than 4 charactersz    )r9   rZ   r   rm   r   r_   r&   r^   r…  s    r   r™   ÚParser.expect_tag_S  su   € Ø×ÑÔØ×Ñ¤u§z¡zÒ1Ü!Ð"2°D×4LÑ4LÓMÐMÜˆt�‰Ó !Ó#Ü!Ø9¸4×;SÑ;Sóð ð —‘ &Ñ(¨"¨1Ð-Ð-rB   c                 ó^   • U R                  5       nUS:X  a  [        SU R                  5      eU$ )NÚdfltz4"dflt" is not a valid script tag; use "DFLT" instead©r™   r   r_   ©r:   rœ   s     r   r|  ÚParser.expect_script_tag_]  s7   € Ø×ÑÓ ˆØ�&‹=Ü!ØFØ×(Ñ(óð ð ˆ
rB   c                 ó^   • U R                  5       nUS:X  a  [        SU R                  5      eU$ )NÚDFLTz6"DFLT" is not a valid language tag; use "dflt" insteadrò  ró  s     r   r   ÚParser.expect_language_tag_f  s7   € Ø×ÑÓ ˆØ�&‹=Ü!ØHØ×(Ñ(óð ð ˆ
rB   c                 ó²   • U R                  5         U R                  [        R                  L a  U R                  U:X  a  U$ [        SU-  U R                  5      e)NzExpected '%s')r9   rZ   r   ro   r^   r   r_   )r:   Úsymbols     r   r�   ÚParser.expect_symbol_o  sH   € Ø×ÑÔØ×Ñ¤5§<¡<Ò/°D·O±OÀvÓ4MØˆMÜ˜o°Ñ6¸×8PÑ8PÓQÐQrB   c                 óÆ   • U R                  5         U R                  [        R                  L a  U R                  U:X  a  U R                  $ [        SU-  U R                  5      e)Nr»  ©r9   rZ   r   rm   r^   r   r_   )r:   r�  s     r   r‚   ÚParser.expect_keyword_u  sM   € Ø×ÑÔØ×Ñ¤5§:¡:Ò-°$·/±/ÀWÓ2LØ—?‘?Ð"Ü˜o°Ñ7¸×9QÑ9QÓRÐRrB   c                 ó    • U R                  5         U R                  [        R                  L a  U R                  $ [        SU R                  5      e)NzExpected a namerü  r…  s    r   rƒ   ÚParser.expect_name_{  s>   € Ø×ÑÔØ×Ñ¤5§:¡:Ò-Ø—?‘?Ð"ÜÐ/°×1IÑ1IÓJÐJrB   c                 ó(  • U R                  5         U R                  [        R                  L a  U R                  $ U(       a=  U R                  [        R
                  L a   U R                  S:X  a  U R                  5       $ [        SU R                  5      e)Nr„  zExpected a number)	r9   rZ   r   rF  r^   ro   Úexpect_variable_scalar_r   r_   )r:   r€   s     r   rˆ   ÚParser.expect_number_�  sm   € Ø×ÑÔØ×Ñ¤5§<¡<Ò/Ø—?‘?Ð"Þ˜×,Ñ,´·±Ò<ÀÇÁÐTWÓAWØ×/Ñ/Ó1Ð1ÜÐ1°4×3KÑ3KÓLÐLrB   c                 óä   • U R                  5         [        5       n U R                  [        R                  :X  a  U R
                  S:X  a   U$ U R                  5       u  p#UR                  X#5        MV  )NrW   )r9   r   rZ   r   ro   r^   Úexpect_master_Ú	add_value)r:   ÚscalarrE   rH  s       r   r  ÚParser.expect_variable_scalar_‰  se   € Ø×ÑÔÜÓ!ˆØØ×#Ñ#¤u§|¡|Ó3¸¿¹È3Ó8NØð ˆð #×1Ñ1Ó3‰OˆHØ×Ñ˜XÔ-ñ	 rB   c                 óø  • 0 n U R                   [        R                  La  [        SU R                  5      eU R
                  nU R                  5         U R                   [        R                  L a  U R
                  S:X  d  [        SU R                  5      eU R                  5       nX1U'   U R                  [        R                  L a  U R                  S   S:X  a  OfU R                  5         U R                   [        R                  L a  U R
                  S:X  d  [        SU R                  5      eU R                  5         GM=  U R                  5         [        U R
                  SS  5      nU R                  5         X4$ )	NrÐ  r¿   zExpected an equals signr   Ú:r¶   z#Expected an comma or an equals signr   )rZ   r   rm   r   r_   r^   r9   ro   Úexpect_integer_or_float_r3   r4   r  )r:   rE   rÓ  rH  s       r   r  ÚParser.expect_master_“  sE  € ØˆØØ×#Ñ#¬5¯:©:Ò5Ü%Ð&=¸t×?WÑ?WÓXÐXØ—?‘?ˆDØ×ÑÔ!Ø×(Ñ(¬E¯L©LÒ8¸T¿_¹_ÐPSÓ=SÜ%Ø-¨t×/GÑ/Góð ð ×1Ñ1Ó3ˆEØ"�T‰NØ×$Ñ$¬¯
©
Ò2°t×7GÑ7GÈÑ7JÈcÓ7QàØ×ÑÔ!Ø×(Ñ(¬E¯L©LÒ8¸T¿_¹_ÐPSÓ=SÜ%Ø9¸4×;SÑ;Sóð ð ×ÑÔ!ò' ð( 	×ÑÔÜ�D—O‘O A BÐ'Ó(ˆØ×ÑÔØˆÐrB   c                 ó¢   • U R                  5         U R                  [        R                  ;   a  U R                  $ [        SU R                  5      e)Nz/Expected a decimal, hexadecimal or octal number)r9   rZ   r   rì  r^   r   r_   r…  s    r   rí  ÚParser.expect_any_number_®  sB   € Ø×ÑÔØ×Ñ¤5§=¡=Ó0Ø—?‘?Ð"ÜØ=¸t×?WÑ?Wó
ð 	
rB   c                 ó    • U R                  5         U R                  [        R                  L a  U R                  $ [        SU R                  5      e)Nz Expected a floating-point number)r9   rZ   r   r   r^   r   r_   r…  s    r   rb  ÚParser.expect_float_¶  sB   € Ø×ÑÔØ×Ñ¤5§;¡;Ò.Ø—?‘?Ð"ÜØ.°×0HÑ0Hó
ð 	
rB   c                 óä   • U R                   [        R                  :X  a  U R                  5       $ U R                   [        R                  L a  U R                  5       $ [        SU R                  5      e©Nú,Expected an integer or floating-point number©r3   r   r   rb  rF  rˆ   r   r_   r…  s    r   r
  ÚParser.expect_integer_or_float_¾  ó\   € Ø× Ñ ¤E§K¡KÓ/Ø×%Ñ%Ó'Ð'Ø×"Ñ"¤e§l¡lÒ2Ø×&Ñ&Ó(Ð(ä!Ø>À×@XÑ@Xóð rB   c                 óê   • U R                   [        R                  :X  a  U R                  5       $ U R                   [        R                  L a  U R                  5       S-  $ [        SU R                  5      e)Nr9  r  r  r…  s    r   rŸ  ÚParser.expect_decipoint_È  sa   € Ø× Ñ ¤E§K¡KÓ/Ø×%Ñ%Ó'Ð'Ø×"Ñ"¤e§l¡lÒ2Ø×&Ñ&Ó(¨2Ñ-Ð-ä!Ø>À×@XÑ@Xóð rB   c                 óî   • SnSSS.nU R                   S:w  a]  U R                   U;   a  U R                  5       nXU   -  nO#[        SU R                   3U R                  5      eU R                   S:w  a  M]  U$ )Nr   r   r;  )ÚOlderSiblingFontAttributeÚElidableAxisValueNamerU   zUnexpected STAT flag )r4   rƒ   r   r^   r_   )r:   rH  rJ  rr   s       r   rZ  ÚParser.expect_stat_flagsÒ  s‡   € Øˆà)*Ø%&ñ
ˆð ×Ñ #Ó%Ø×Ñ 5Ó(Ø×(Ñ(Ó*�Ø d¡Ñ+‘ä%Ø+¨D¯O©OÐ+<Ð=¸t×?WÑ?Wóð ð ×Ñ #Õ%ð ˆrB   c                 óä   • U R                   [        R                  :X  a  U R                  5       $ U R                   [        R                  L a  U R                  5       $ [        SU R                  5      er  r  r…  s    r   Úexpect_stat_values_ÚParser.expect_stat_values_â  r  rB   c                 ó    • U R                  5         U R                  [        R                  L a  U R                  $ [        SU R                  5      e)NzExpected a string)r9   rZ   r   ÚSTRINGr^   r   r_   r…  s    r   rî  ÚParser.expect_string_ì  s>   € Ø×ÑÔØ×Ñ¤5§<¡<Ò/Ø—?‘?Ð"ÜÐ1°4×3KÑ3KÓLÐLrB   c                 óL  • U(       aO  U R                   (       a>  [        R                  U l        U R                   R	                  S5      u  U l        U l        g U R                  U R                  U R                  sU l        U l        U l          [        U R                  5      u  U l        U l        U l	        U R                  [        R                  :w  a  g U R                   R                  U R                  U R                  45        M{  ! [         a    Su  U l        U l         Nmf = f)Nr   r   )r5   r   r[   rZ   r%   r^   r_   r3   r4   r6   Únextr7   ÚStopIterationr\   )r:   r"   s     r   r9   ÚParser.advance_lexer_ò  s  € Þ˜×*×*Ü#(§=¡=ˆDÔ Ø8<×8JÑ8J×8NÑ8NÈqÓ8QÑ5ˆDŒO˜TÔ5Øð ×%Ñ%Ø× Ñ Ø×)Ñ)ð LˆDÔ  $¤/°4Ô3Kð
 ðGô
 ˜Ÿ™Ó%ñ	ØÔ)ØÔ$ØÔ-ð ×$Ñ$¬¯©Ó5ØØ×Ñ×%Ñ% t×'7Ñ'7¸×9RÑ9RÐ&SÔTñ øô !ó GØ:FÑ7�Ô% tÖ'7ðGús   Â(D ÄD#Ä"D#c                 óH   • SR                  [        [        U 5      5      5      $ )z'abc' --> 'cba'r   )r'   r  re  )r   s    r   Úreverse_string_ÚParser.reverse_string_
	  s   € ð �w‰w”x¤ Q£Ó(Ó)Ð)rB   c                 óŽ   • [        5       nX#:”  a  [        SU5      e[        X#S-   5       H  nUR                  SU-  5        M     U$ )z>(location, 999, 1001) --> ["cid00999", "cid01000", "cid01001"]z*Bad range: start should be less than limitr   ræ  )re  r   rÇ   r\   )r:   rE   rË   rÌ   r�  rÔ   s         r   rç   ÚParser.make_cid_range_	  sJ   € ä“ˆØ‹=Ü!Ø<¸hóð ô ˜¨¡	Ö*ˆCØ�M‰M˜) c™/Ö*ñ +àˆrB   c                 ó€  • [        5       n[        U5      [        U5      :w  a  [        SU< SU< S3U5      eU R                  n[        R
                  R                  X#/5      nU" [        R
                  R                  U" U5      U" U5      /5      5      n[        U5      S:”  a1  U[        U5      [        U5      *  nU[        U5      [        U5      *  n	OU[        U5      S nU[        U5      S n	X‰:¼  a  [        SU5      e[        R                  " S5      n
U
R                  U5      (       aV  U
R                  U	5      (       a@  [        [        U5      [        U	5      S-   5       H  nUR                  S	XkU4-  5        M     U$ [        R                  " S
5      nUR                  U5      (       aV  UR                  U	5      (       a@  [        [        U5      [        U	5      S-   5       H  nUR                  S	XkU4-  5        M     U$ [        R                  " S5      nUR                  U5      (       aw  UR                  U	5      (       aa  [        [        US5      [        U	S5      S-   5       H8  nS[        U5      -   [        U5      * S nUR                  U< U< U< 35        M:     U$ [        SU< SU< S3U5      e)z?(location, "a.sc", "d.sc") --> ["a.sc", "b.sc", "c.sc", "d.sc"]zBad range: "z" and "z" should have the same lengthr   Nz+Start of range must be smaller than its endz^[A-Z]$r   z%s%c%sz^[a-z]$z^[0-9]{1,3}$r9  Ú000rÄ   rÅ   )re  r&   r   r'  ÚosÚpathÚcommonprefixr  Úcompiler  rÇ   Úordr\   r  rä   )r:   rE   rË   rÌ   r�  Úrevrú   rý   Ústart_rangeÚlimit_rangeÚ	uppercaseÚcÚ	lowercaseÚdigitsrÊ   rŽ  s                   r   rá   ÚParser.make_glyph_range_	  sS  € ä“ˆÜˆu‹:œ˜U›Ó#Ý!ÛJOÓQVÐWØóð ð
 ×"Ñ"ˆÜ—‘×%Ñ% u nÓ5ˆÙ”R—W‘W×)Ñ)©3¨u«:±s¸5³zÐ*BÓCÓDˆÜˆv‹;˜‹?Ø¤ F£¬s°6«{¨lÐ;ˆKØ¤ F£¬s°6«{¨lÐ;‰Kà¤ F£ Ð.ˆKØ¤ F£ Ð.ˆKàÓ%Ü!Ø=¸xóð ô —J’J˜zÓ*ˆ	Ø�?‰?˜;×'Ñ'¨I¯O©O¸K×,HÑ,HÜœ3˜{Ó+¬S°Ó-=ÀÑ-AÖB�Ø—‘˜h¨&°VÐ)<Ñ<Ö=ñ CàˆMä—J’J˜zÓ*ˆ	Ø�?‰?˜;×'Ñ'¨I¯O©O¸K×,HÑ,HÜœ3˜{Ó+¬S°Ó-=ÀÑ-AÖB�Ø—‘˜h¨&°VÐ)<Ñ<Ö=ñ CàˆMä—’˜OÓ,ˆØ�<‰<˜×$Ñ$¨¯©°k×)BÑ)BÜœ3˜{¨BÓ/´°[À"Ó1EÈÑ1IÖJ�Ø¤# a£&™.¬3¨{Ó+;Ð*;Ð*=Ð>�Ø—‘ª&²&º&ÐAÖBñ Kð ˆMå³e»UÐCÀXÓNÐNrB   )r.   r5   r^   r_   rZ   r,   r)   r/   r7   r0   r8   r4   r6   r3   r2   r1   )rƒ  TN)F)NFN)nÚ__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__rn   r*   rÇ   r£  r¤  r@   ru   r‹   r‘   re   rd   rª   r²   r¼   rc   rÏ   r¥   r  r  r  r  ra   r#  r*  r/  rg   rL  rh   r±   r]  r^  r_  r`  r~  r–  r›  r¦  r±  rk   r½  r¾  r¿  rÀ  rÁ  r«  rõ  rã  rï  Ústaticmethodr  rþ  r  rÂ  rÃ  rF  rS  r^  rY  rÄ  r  r  rr  r"  r‰   r÷   rø   rl   rf   ri   r®  r¶  rÁ  r¿  rÀ  rÍ  rj   r5  r`   rP  rå   r  rØ   rÙ   r�   r™   r|  r   r�   r‚   rƒ   rˆ   r  r  rí  rb  r
  rŸ  rZ  r  rî  r9   r'  rç   rá   Ú__static_attributes__)r   rÊ   s   00r   r   r      s½  † ñð0 €JØ
€CÙ-2°1°fÔ-=Ô>Ò-=¨�x !”|Ñ-=Ò>€OÙ-2°1°fÔ-=Ô>Ò-=¨�x !”|Ñ-=Ò>€Oð KOô+òB=ò~4
òl
òò"
Hò	RòHò
ò8ò(ôTbòH[Gòzò&ò
òAò
òYòWòò27
òrò,3
òj
ò MòQò"RòCò}ò~=ò
ò$
òò<ò0Yòò6ò8Sò"8ò@8ò:

ò
)ð ñó ðð ñ4ó ð4òò;òz*òXò8 
òD6
òp@òB'òR
ò
ò,ò:ò&ò
òL
ò\	òUô$òLRò!òF+òZ"òH
NòJò#@ðL RVôL!ò\òòJòòXòBòò.òòòRòSòKôMòòò6
ò
òòòò òMôUð0 ñ*ó ð*ò	õ+OùóaG ?ùÛ>s
   ™F¸Fr   c                   ó2   • \ rS rSrS rS rS rS rS rSr	g)	r-   iH	  c                 ó   • 0 /U l         g r   ©Úscopes_r…  s    r   r@   ÚSymbolTable.__init__I	  s   € Ø�tˆ�rB   c                 ó:   • U R                   R                  0 5        g r   )rD  r\   r…  s    r   r³  ÚSymbolTable.enter_scopeL	  s   € Ø�‰×Ñ˜BÕrB   c                 ó8   • U R                   R                  5         g r   )rD  r%   r…  s    r   r´  ÚSymbolTable.exit_scopeO	  s   € Ø�‰×ÑÕrB   c                 ó&   • X R                   S   U'   g )Nrö   rC  )r:   rr   Úitems      r   r•   ÚSymbolTable.defineR	  s   € Ø!%�‰�RÑ˜ÒrB   c                 ót   • [        U R                  5       H  nUR                  U5      nU(       d  M  Us  $    g r   )r  rD  rR  )r:   rr   ÚscoperK  s       r   r„   ÚSymbolTable.resolveU	  s1   € Ü˜dŸl™lÖ+ˆEØ—9‘9˜T“?ˆDßˆtØ’ñ ,ð rB   rC  N)
r:  r;  r<  r=  r@   r³  r´  r•   r„   r@  rƒ  rB   r   r-   r-   H	  s   † òò òò&õrB   r-   )ÚfontTools.feaLib.errorr   ÚfontTools.feaLib.lexerr   r   r   ÚfontTools.feaLib.variableScalarr   ÚfontTools.misc.encodingToolsr   ÚfontTools.misc.textToolsr	   r
   r   ÚfontTools.feaLib.astÚfeaLibr*   Úloggingr-  r  Ú	getLoggerr:  râ   Úobjectr   r-   rƒ  rB   r   Ú<module>rZ     sY   ðÝ 2ß KÑ KÝ :Ý 4ß <Ñ <ß "Ð "Û Û 	Û 	ð ×Ò˜Ó!€ôv$OˆVô v$OôrI�&õ rB   