Ë
    £ehÝŠ ã                   óÊ   — d dl mZ d dlmZmZmZ d dlmZ d dlm	Z	 d dl
mZmZmZ d dlmc mZ d dlZd dlZd dlZ ej(                  e«      Z G d„ de«      Z G d	„ d
e«      Zy)é    )ÚFeatureLibError)ÚLexerÚIncludingLexerÚNonIncludingLexer)ÚVariableScalar)ÚgetEncoding)ÚbytechrÚtobytesÚtostrNc                   ó  — e Zd ZdZi ZeZ edd«      D � �ch c]  }d|z  ’Œ	 c}} Z edd«      D � �ch c]  }d|z  ’Œ	 c}} Z	 did„Z	d	„ Z
d
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zdjd„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z d „ Z!d!„ Z"d"„ Z#d#„ Z$d$„ Z%d%„ Z&d&„ Z'd'„ Z(d(„ Z)d)„ Z*d*„ Z+d+„ Z,d,„ Z-d-„ Z.d.„ Z/d/„ Z0d0„ Z1d1„ Z2d2„ Z3e4d3„ «       Z5e4d4„ «       Z6d5„ Z7d6„ Z8d7„ Z9d8„ Z:d9„ Z;d:„ Z<d;„ Z=d<„ Z>d=„ Z?d>„ Z@d?„ ZAd@„ ZBdA„ ZCdB„ ZDdC„ ZEdD„ ZFdE„ ZGdjdF„ZHdG„ ZIdH„ ZJdI„ ZKdJ„ ZLdK„ ZMdL„ ZNdM„ ZO	 dkdN„ZPdO„ ZQdP„ ZRdQ„ ZSdR„ ZTdS„ ZUdT„ ZVdU„ ZWdV„ ZXdW„ ZYdX„ ZZdY„ Z[dZ„ Z\d[„ Z]djd\„Z^d]„ Z_d^„ Z`d_„ Zad`„ Zbda„ Zcdb„ Zddc„ Zedd„ Zfdjde„Zge4df„ «       Zhdg„ Zidh„ Zjyc c}} w c c}} w )lÚParsera
  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           	      óŽ  — d|v r-ddl m}  |dd«       |rt        d«      ‚|j                  d«      }|r7t        dt	        |«      dk(  rdnd	›d
dj                  d„ |D «       «      ›�«      ‚t        |«      | _        | j                  j                  «       | _
        t        «       | _        t        «       | _        t        «       | _        t        «       | _        | j                  | j                  h| _        d\  | _        | _        g | _        d | _        |rt*        nt,        } |||¬«      | _        i | _        | j3                  d¬«       y )NÚglyphMapr   )ÚdeprecateArgumentz#use 'glyphNames' (iterable) insteadz?'glyphNames' and (deprecated) 'glyphMap' are mutually exclusivezunsupported keyword argumentr   Ú Úsz: z, c              3   ó2   K  — | ]  }t        |«      –— Œ y ­w©N)Úrepr)Ú.0Úks     úU/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/fontTools/feaLib/parser.pyú	<genexpr>z"Parser.__init__.<locals>.<genexpr><   s   è ø€ Ò=VÈ!¼dÀ1¿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__z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           	      ó¸  — | j                   j                  }| j                  €| j                  �r½| j	                  d¬«       | j
                  t        j                  u rB|j                  | j                  j                  | j                  | j                  ¬«      «       �n1| j                  d«      r!|j                  | j                  «       «       �nÿ| j
                  t        j                  u r!|j                  | j!                  «       «       �nÂ| j                  d«      r!|j                  | j#                  «       «       �n�| j                  d«      r!|j                  | j%                  «       «       �n^| j                  d«      r!|j                  | j'                  «       «       �n,| j                  d	«      r#|j                  | j)                  d
¬«      «       �nø| j                  d«      r!|j                  | j+                  «       «       �nÆ| j                  d«      r!|j                  | j-                  «       «       �n”| j                  d«      r!|j                  | j/                  «       «       �nb| j                  d«      r#|j                  | j-                  d¬«      «       �n.| j                  d«      r |j                  | j1                  «       «       ný| j                  d«      r"|j                  | j3                  d
¬«      «       nÊ| j
                  t        j4                  u rG| j                  | j6                  v r/|j                   | j6                  | j                     | «      «       ng| j
                  t        j8                  u r| j                  dk(  r�Œ€t;        dj=                  | j
                  | j                  «      | j                  «      ‚| j                  ��Œ¯| j                  r�Œ½| j>                  rQ| j>                  jA                  «       D ��cg c]  \  }}d|›d|›d�‘Œ }}}t;        ddjC                  |«      z   d«      ‚| j                   S c c}}w )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)rO   Ú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*   Ú
statementsr1   r3   r7   Ú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   Úformatr6   Úitemsr%   )r8   rV   ÚnameÚlocÚerrors        r   ÚparsezParser.parseN   s{  € ð —Y‘Y×)Ñ)ˆ
Ø×#Ñ#Ð/°4×3EÓ3EØ×Ñ¨ÐÔ.Ø×#Ñ#¤u§}¡}Ñ4Ø×!Ñ!Ø—H‘H×$Ñ$ T§_¡_¸t×?WÑ?WÐ$ÓXöð ×%Ñ% iÔ0Ø×!Ñ! $×"5Ñ"5Ó"7Ö8Ø×%Ñ%¬×)9Ñ)9Ñ9Ø×!Ñ! $×"CÑ"CÓ"EÖFØ×%Ñ%Ð&;Ô<Ø×!Ñ! $×"7Ñ"7Ó"9Ö:Ø×%Ñ% kÔ2Ø×!Ñ! $×"7Ñ"7Ó"9Ö:Ø×%Ñ%Ð&6Ô7Ø×!Ñ! $×"<Ñ"<Ó">Ö?Ø×%Ñ% hÔ/Ø×!Ñ! $×"4Ñ"4¸eÐ"4Ó"DÖEØ×%Ñ% kÔ2Ø×!Ñ! $×"7Ñ"7Ó"9Ö:Ø×%Ñ% iÔ0Ø×!Ñ! $×";Ñ";Ó"=Ö>Ø×%Ñ% nÔ5Ø×!Ñ! $×":Ñ":Ó"<Ö=Ø×%Ñ% kÔ2Ø×!Ñ! $×";Ñ";ÀdÐ";Ó"KÖLØ×%Ñ% gÔ.Ø×!Ñ! $×"3Ñ"3Ó"5Õ6Ø×%Ñ%Ð&6Ô7Ø×!Ñ! $×"DÑ"DÈeÐ"DÓ"TÕUà×$Ñ$¬¯
©
Ñ2Ø—O‘O t§¡Ñ6à×!Ñ!Ð"B $§/¡/°$·/±/Ñ"BÀ4Ó"HÕIØ×%Ñ%¬¯©Ñ5¸$¿/¹/ÈSÒ:PÙä%ðDßDJÁFØ×,Ñ,¨d¯o©oóEð ×,Ñ,óð ðM ×#Ñ#Ò/°4×3EÔ3Eð\ �<Š<ð "&§¡×!3Ñ!3Ó!5÷á�D™#ò .2²3Ò7ðˆEñ ô "ðØ"&§)¡)¨EÓ"2ñ4àóð ð
 �y‰yÐùós   ÐQc           	      ó¦  — | j                  d«       | j                  d«       | j                  }| j                  dk(  r#| j                  d«       | j                  d«       y | j                  t
        j                  k(  r—| j                  «       }| j                  j                  |«      }|€t        d|z  | j                  «      ‚| j                  d«       | j                  j                  |j                  |j                  ||j                  d d |¬«      S | j!                  d¬«      | j!                  d¬«      }}d }| j                  d	k(  r!| j                  d	«       | j!                  «       }| j                  dk(  r!| j#                  «       }| j#                  «       }nd
\  }}| j                  d«       | j                  j                  ||d ||||¬«      S )Nú<ÚanchorÚNULLú>zUnknown anchor "%s")ro   ÚcontourpointÚxDeviceTableÚyDeviceTablerB   T©Úvariablerx   r   )Úexpect_symbol_Úexpect_keyword_r\   r2   r1   r   rj   Úexpect_name_r,   Úresolver   r(   ÚAnchorÚxÚyrx   Úexpect_number_Úparse_device_)	r8   rB   ro   Ú	anchordefr‚   rƒ   rx   ry   rz   s	            r   Úparse_anchor_z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�‰ØØØØ%Ø%Ø%Øð ó 
ð 	
r?   c                 óô   — g }| j                   dk(  rf| j                  «       }|€| j                   dk7  rŒ1| j                  d«       | j                  «       }|j	                  ||f«       | j                   dk(  rŒf|S )Nrt   Úmark)r2   r‡   r~   Úexpect_markClass_reference_rY   )r8   ÚanchorMarksru   rL   s       r   Úparse_anchor_marks_zParser.parse_anchor_marks_Ã   s   € àˆØ×Ñ #Ò%Ø×'Ñ'Ó)ˆFØˆ~ $×"2Ñ"2°fÒ"<ØØ× Ñ  Ô(Ø×8Ñ8Ó:ˆIØ×Ñ ¨	Ð2Ô3ð ×Ñ #Ó%ð Ðr?   c                 ó¢  — | j                  d«      sJ ‚| j                  }| j                  «       | j                  «       }}d }| j                  dk(  r!| j	                  d«       | j                  «       }| j                  «       }| j                  d«       | j                  j                  |||||¬«      }| j                  j                  ||«       |S )NrG   rx   rR   )rx   rB   )r]   r\   r„   r2   r~   r   r}   r(   ÚAnchorDefinitionr,   Údefine)r8   rB   r‚   rƒ   rx   ro   r†   s          r   rb   zParser.parse_anchordef_Ï   sÇ   € à×#Ñ# KÔ0Ð0Ð0Ø×+Ñ+ˆØ×"Ñ"Ó$ d×&9Ñ&9Ó&;ˆ1ˆØˆØ×Ñ˜~Ò-Ø× Ñ  Ô0Ø×.Ñ.Ó0ˆLØ× Ñ Ó"ˆØ×Ñ˜CÔ Ø—H‘H×-Ñ-Ø�!�Q \¸Hð .ó 
ˆ	ð 	�‰×Ñ˜T 9Ô-ØÐr?   c                 ó^  — | j                  d«      sJ ‚| j                  «       }| j                  j                  |«      \  }}}| j	                  «        | j                  d«       | j                  «       }||k(  sJ d«       ‚| j                  d«       | j                  j                  |||¬«      S )NrD   ú}z-bad splitting in Lexer.scan_anonymous_block()rR   rA   )r]   Úexpect_tag_r5   Úscan_anonymous_blockr7   r}   r(   ÚAnonymousBlock)r8   ÚtagÚ_ÚcontentrB   Úend_tags         r   ra   zParser.parse_anonymous_à   s¤   € à×#Ñ#Ð$9Ô:Ð:Ð:Ø×ÑÓ ˆØ#Ÿ{™{×?Ñ?ÀÓDÑˆˆ7�HØ×ÑÔØ×Ñ˜CÔ Ø×"Ñ"Ó$ˆØ�gŠ~ÐNÐNÓNˆ~Ø×Ñ˜CÔ Ø�x‰x×&Ñ& s¨G¸hÐ&ÓGÐGr?   c                 ó`  — | j                  d«      sJ ‚| j                  }| j                  d¬«      }| j                  «       h}| j                  dk7  r/|j                  | j                  «       «       | j                  dk7  rŒ/| j                  d«       | j                  j                  |||¬«      S )NÚAttachT©Úaccept_glyphnamerR   rA   )	r]   r\   Úparse_glyphclass_r„   r2   Úaddr}   r(   ÚAttachStatement)r8   rB   ÚglyphsÚcontourPointss       r   Úparse_attach_zParser.parse_attach_ì   s¤   € à×#Ñ# HÔ-Ð-Ð-Ø×+Ñ+ˆØ×'Ñ'¸Ð'Ó>ˆØ×,Ñ,Ó.Ð/ˆØ×Ñ #Ò%Ø×Ñ˜d×1Ñ1Ó3Ô4ð ×Ñ #Ó%à×Ñ˜CÔ Ø�x‰x×'Ñ'¨°ÈÐ'ÓQÐQr?   c                 óh   — | j                   dv sJ ‚| j                  «        | j                  d|¬«      S )N>   ÚenumÚ	enumerateT©Ú
enumeratedrK   )r[   r7   Úparse_position_)r8   rK   s     r   Úparse_enumerate_zParser.parse_enumerate_÷   s7   € à�‰Ð"7Ñ7Ð7Ð7Ø×ÑÔØ×#Ñ#¨t¸hÐ#ÓGÐGr?   c                 ó(  — | j                  d«      sJ ‚| j                  }| j                  dk7  r| j                  d¬«      }nd }| j	                  d«       | j                  dk7  r| j                  d¬«      }nd }| j	                  d«       | j                  dk7  r| j                  d¬«      }nd }| j	                  d«       | j                  dk7  r| j                  d¬«      }nd }| j	                  d«       | j
                  j                  |||||¬«      S )NÚGlyphClassDefú,Fr›   rR   rA   )r]   r\   r2   r�   r}   r(   ÚGlyphClassDefStatement)r8   rB   Ú
baseGlyphsÚligatureGlyphsÚ
markGlyphsÚcomponentGlyphss         r   Úparse_GlyphClassDef_zParser.parse_GlyphClassDef_ý   s  € à×#Ñ# OÔ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°OÈhð /ó 
ð 	
r?   c                 ó  — | j                   | j                  }}| j                  d«       | j                  d¬«      }| j                  d«       | j                  j                  |||¬«      }| j                  j                  ||«       |S )Nú=Fr›   rR   rA   )r\   r[   r}   r�   r(   ÚGlyphClassDefinitionr-   r�   )r8   rB   ro   r    Ú
glyphclasss        r   r`   z#Parser.parse_glyphclass_definition_  s{   € à×1Ñ1°4·?±?�$ˆØ×Ñ˜CÔ Ø×'Ñ'¸Ð'Ó?ˆØ×Ñ˜CÔ Ø—X‘X×2Ñ2°4¸È(Ð2ÓSˆ
Ø×Ñ×!Ñ! $¨
Ô3ØÐr?   c                 ó  — |j                  d«      }g }t        t        |«      «      D ][  }dj                  |d| «      dj                  ||d  «      }}|| j                  v sŒ:|| j                  v sŒI|j                  ||f«       Œ] t        |«      dk(  r|d   \  }}||fS t        |«      dk(  rt        d|z  |«      ‚dj                  |D ��	cg c]  \  }}	d|›d|	›d�‘Œ c}	}«      }
t        d|›d	|
›d
�|«      ‚c c}	}w )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'   rY   r   )r8   ro   rB   ÚpartsÚ	solutionsÚiÚstartÚlimitr   ÚlÚrangess              r   Úsplit_glyph_range_zParser.split_glyph_range_#  s  € ð& —
‘
˜3“ˆØˆ	Ü”s˜5“zÓ"ò 	1ˆAØŸ8™8 E¨!¨A JÓ/°·±¸%ÀÀ¸)Ó1D�5ˆEØ˜×(Ñ(Ò(¨U°d×6FÑ6FÒ-FØ× Ñ  %¨ Õ0ð	1ô ˆy‹>˜QÒØ$ Q™<‰LˆE�5Ø˜%�<ÐÜ�‹^˜qÒ Ü!ð/Ø15ñ6àóð ð —[‘[À9×!M¹4¸1¹a²²AÒ"6Ó!MÓNˆFÝ!â<@Â&ðJàóð ùó "Ns   ÃC;
c           	      óü
  — |r»| j                   t        j                  t        j                  fv r�|rE| j                  dk(  r6| j                  «        | j                  j                  | j                  ¬«      S | j                  «       }| j                  |«       | j                  j                  || j                  ¬«      S | j                   t        j                  u rÈ| j                  «        | j                  j                  | j                  «      }|€#t!        d| j                  z  | j                  «      ‚t#        || j                  j$                  «      r'| j                  j'                  || j                  ¬«      S | j                  j)                  || j                  ¬«      S | j+                  d«       | j                  }| j                  j-                  |¬«      }| j                  dk7  �r€| j                   t        j                  u �rP| j                  «       }| j                  }d|v rg| j.                  r[|| j.                  vrM| j1                  ||«      \  }}| j                  ||«       |j3                  ||| j5                  |||«      «       �nË| j                  dk(  r[|}| j+                  d«       | j                  «       }| j                  ||«       |j3                  ||| j5                  |||«      «       �nad|v r7| j.                  s+t6        j9                  t;        t!        d|›�|«      «      «       | j                  |«       |j=                  |«       �n| j                   t        j                  u rÌ| j                  «       }| j                  dk(  ry| j                  }	| j                  }
| j+                  d«       | j?                  «       }| j                  d|
d	›�d|d	›�«       |jA                  |
|| jC                  |	|
|«      «       �nNd| j                  d	›�}| j                  |«       |j=                  |«       �n| j                   t        j                  u rÛ| j                  «        | j                  j                  | j                  «      }|€#t!        d| j                  z  | j                  «      ‚t#        || j                  j$                  «      r(| j                  j'                  || j                  ¬«      }n'| j                  j)                  || j                  ¬«      }|jE                  |«       n#t!        d
| j                  ›�| jF                  «      ‚| j                  dk7  r�Œ€| j+                  d«       |S )Nrv   rA   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 )$r1   r   rj   ÚCIDr2   r7   r(   Ú	NullGlyphr\   Úexpect_glyph_Úcheck_glyph_name_in_glyph_setÚ	GlyphNamer_   r-   r€   r[   r   Ú
isinstanceÚ	MarkClassÚMarkClassNameÚGlyphClassNamer}   Ú
GlyphClassr'   rÃ   Ú	add_rangeÚmake_glyph_range_ÚlogÚwarningÚstrrY   Úexpect_cid_Úadd_cid_rangeÚmake_cid_range_Ú	add_classr4   )r8   rœ   Úaccept_nullÚglyphÚgcrB   r    r¿   rÀ   Úrange_locationÚrange_startÚ	range_endÚ
glyph_names                r   r�   z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°d×6NÑ6NÐ%ÓOÐOØ× Ñ ¤E×$4Ñ$4Ñ4Ø×ÑÔ!Ø×#Ñ#×+Ñ+¨D¯O©OÓ<ˆBØˆzÜ%Ø-°·±Ñ?Ø×,Ñ,óð ô ˜"˜dŸh™h×0Ñ0Ô1Ø—x‘x×-Ñ-¨b¸4×;SÑ;SÐ-ÓTÐTà—x‘x×.Ñ.¨r¸D×<TÑ<TÐ.ÓUÐUà×Ñ˜CÔ Ø×+Ñ+ˆØ—‘×$Ñ$¨hÐ$Ó7ˆØ×Ñ #Ó%Ø×$Ñ$¬¯
©
Ò2Ø×*Ñ*Ó,�Ø×3Ñ3�Ø˜%‘< D×$4Ò$4¸Àd×FVÑFVÑ9VØ#'×#:Ñ#:¸5À(Ó#K‘L�E˜5Ø×6Ñ6°u¸eÔDØ×$Ñ$Ø˜u d×&<Ñ&<¸XÀuÈeÓ&Töð ×%Ñ%¨Ò,Ø!�EØ×'Ñ'¨Ô,Ø ×.Ñ.Ó0�EØ×6Ñ6°u¸eÔDØ×$Ñ$Ø˜u d×&<Ñ&<¸XÀuÈ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ØŸ™×/Ñ/°¸T×=UÑ=UÐ/ÓV‘BàŸ™×0Ñ0°¸d×>VÑ>VÐ0ÓW�BØ× Ñ  Õ$ä%ð7Ø7;×7GÑ7GÐ6JðLà×-Ñ-óð ðA ×Ñ #Ô%ðJ 	×Ñ˜CÔ Øˆr?   c                 ó¢  — g g g g g f\  }}}}}d}| j                   dv�r“| j                  d¬«      }d}	| j                   dk(  r| j                  d«       dx}}	|	r*|rt        d| j                  «      ‚|j                  |«       n%|r|j                  |«       n|j                  |«       | j                  «       r!|j                  | j                  |«      «       n|j                  d «       d }
| j                   dk(  r”|
€g }
| j                  d«       |	st        d| j                  «      ‚| j                  «       }| j                  j                  |«      }|€t        d	|z  | j                  «      ‚|
j                  |«       | j                   dk(  rŒ”|	r|j                  |
«       | j                   dvr�Œ“|s|s|g k(  sJ ‚g |d gt        |«      z  |g |fS t        |d t        |«       «      rt        d
| j                  «      ‚|t        |«      t        |«      t        |«      z    }t        |«      r<t        |t        |«      t        |«      z   d  «      rt        d| j                  «      ‚|}n`|r=|d   r8t        |«      dkD  st        |d d «      rt        d| j                  «      ‚|dd  }n!t        |«      rt        d| j                  «      ‚||||||fS )NF>   ÚbyÚfromr¬   rR   Tr›   ú'z_Unsupported contextual target sequence: at most one run of marked (') glyph/class names allowedrI   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   )r2   r�   r}   r   r\   rY   Úis_next_value_Úparse_valuerecord_r~   r   r.   r€   r$   Úany)r8   rK   Úprefixr    ÚlookupsÚvaluesÚsuffixÚhasMarksrÞ   ÚmarkedÚ
lookuplistÚlookup_namerI   Úmarked_valuess                 r   Úparse_glyph_pattern_zParser.parse_glyph_pattern_±  s
  € ð 46°r¸2¸rÀ2Ð2FÑ/ˆ�˜ ¨ØˆØ×ÑÐ&>Ò>Ø×'Ñ'¸Ð'Ó>ˆBØˆFØ×Ñ 3Ò&Ø×#Ñ# CÔ(Ø$(Ð(�˜6ÙÙô *ð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Ü)ð*ð ×0Ñ0ó	ð ð    ˜‘Ü�V”Ü%ð&ð ×,Ñ,ó	ð ð ˜F G¨V°V¸XÐFÐFr?   c                 ó  — | j                   }| j                  d¬«      \  }}}}}}t        |«      rt        d|› d�|«      ‚|s8t        d|› d�|«      }	t        j                  t        |	«      «       |dd  |dd }}|||f}
|
S )	NFrJ   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×   )r8   ÚsubrB   rì   r    rí   rî   rï   rð   rq   ÚchainContexts              r   Úparse_ignore_glyph_pattern_z"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ˆFØ ¨Ð/ˆØÐr?   c                 ó  — | j                   }| j                  |«      g}| j                  dk(  rA| j                  d«       |j	                  | j                  |«      «       | j                  dk(  rŒA| j                  d«       |S )Nr¬   rR   )r\   rù   r2   r}   rY   )r8   r÷   rB   rø   s       r   Úparse_ignore_context_zParser.parse_ignore_context_!  s{   € Ø×+Ñ+ˆØ×8Ñ8¸Ó=Ð>ˆØ×Ñ #Ò%Ø×Ñ Ô$Ø×Ñ × @Ñ @ÀÓ EÔFð ×Ñ #Ó%ð 	×Ñ˜CÔ ØÐr?   c                 ó|  — | j                  d«      sJ ‚| j                  }| j                  «        | j                  dv r.| j	                  d«      }| j
                  j                  ||¬«      S | j                  dv r.| j	                  d«      }| j
                  j                  ||¬«      S t        d| j                  «      ‚)NÚignore)Ú
substituter÷   r÷   rA   )ÚpositionÚposr   z#Expected "substitute" or "position")	r]   r\   r7   r[   rû   r(   ÚIgnoreSubstStatementÚIgnorePosStatementr   )r8   rB   rø   s      r   Úparse_ignore_z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×.Ñ.¨|ÀhÐ.ÓOÐOÜØ1°4×3KÑ3Kó
ð 	
r?   c                 óŠ   — | j                   dk(  sJ ‚| j                  }| j                  «       }t        j                  ||¬«      S )NrC   rA   )r[   r\   Úexpect_filename_r(   ÚIncludeStatement)r8   rB   Úfilenames      r   r^   zParser.parse_include_9  s@   € Ø�‰ )Ò+Ð+Ð+Ø×+Ñ+ˆØ×(Ñ(Ó*ˆä×#Ñ# H°xÔ@Ð@r?   c                 óP  — | j                  d«      sJ ‚| j                  }| j                  «       }d\  }}| j                  dv r| j	                  «       dk(  }| j                  dk(  r| j                  d«       d}| j                  d«       | j                  j                  ||||¬«      S )	NÚlanguage)TF>   Úexclude_dfltÚinclude_dfltr  ÚrequiredTrR   rA   )	r]   r\   Úexpect_language_tag_r2   r   r~   r}   r(   ÚLanguageStatement)r8   rB   r	  Úinclude_defaultr  s        r   Úparse_language_zParser.parse_language_@  s¯   € Ø×#Ñ# JÔ/Ð/Ð/Ø×+Ñ+ˆØ×,Ñ,Ó.ˆØ$1Ñ!ˆ˜Ø×ÑÐ?Ñ?Ø"×/Ñ/Ó1°^ÑCˆOØ×Ñ˜zÒ)Ø× Ñ  Ô,ØˆHØ×Ñ˜CÔ Ø�x‰x×)Ñ)Ø�o x¸(ð *ó 
ð 	
r?   c                 ó`  — | j                  d«      sJ ‚| j                  }| j                  d¬«      }| j                  «       g}| j                  dk7  r/|j                  | j                  «       «       | j                  dk7  rŒ/| j                  d«       | j                  j                  |||¬«      S )NÚLigatureCaretByIndexTr›   rR   rA   )	r]   r\   r�   r„   r2   rY   r}   r(   ÚLigatureCaretByIndexStatement©r8   rB   r    Úcaretss       r   Úparse_ligatureCaretByIndex_z"Parser.parse_ligatureCaretByIndex_O  s£   € Ø×#Ñ#Ð$:Ô;Ð;Ð;Ø×+Ñ+ˆØ×'Ñ'¸Ð'Ó>ˆØ×%Ñ%Ó'Ð(ˆØ×Ñ #Ò%Ø�M‰M˜$×-Ñ-Ó/Ô0ð ×Ñ #Ó%à×Ñ˜CÔ Ø�x‰x×5Ñ5°f¸fÈxÐ5ÓXÐXr?   c                 óh  — | j                  d«      sJ ‚| j                  }| j                  d¬«      }| j                  d¬«      g}| j                  dk7  r1|j                  | j                  d¬«      «       | j                  dk7  rŒ1| j                  d«       | j                  j                  |||¬«      S )NÚLigatureCaretByPosTr›   r{   rR   rA   )	r]   r\   r�   r„   r2   rY   r}   r(   ÚLigatureCaretByPosStatementr  s       r   Úparse_ligatureCaretByPos_z Parser.parse_ligatureCaretByPos_Y  s­   € Ø×#Ñ#Ð$8Ô9Ð9Ð9Ø×+Ñ+ˆØ×'Ñ'¸Ð'Ó>ˆØ×%Ñ%¨tÐ%Ó4Ð5ˆØ×Ñ #Ò%Ø�M‰M˜$×-Ñ-°tÐ-Ó<Ô=ð ×Ñ #Ó%à×Ñ˜CÔ Ø�x‰x×3Ñ3°F¸FÈXÐ3ÓVÐVr?   c                 ó*  — | j                  d«      sJ ‚| j                  | j                  «       }}| j                  dk(  rd| j                  j                  |«      }|€t        d|z  | j                  «      ‚| j                  d«       | j                  j                  ||¬«      S d}| j                  dk(  r| j                  d«       d}| j                  j                  |||¬«      }| j                  ||«       | j                  j                  ||«       |S )NrI   rR   rç   rA   FÚuseExtensionT)r]   r\   r   r2   r.   r€   r   r}   r(   ÚLookupReferenceStatementr~   ÚLookupBlockÚparse_block_r�   )r8   rK   rB   ro   rI   Úuse_extensionÚblocks          r   rd   z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ÀhÐ4ÓOÐOàˆØ×Ñ˜~Ò-Ø× Ñ  Ô0Ø ˆMà—‘×$Ñ$ T¨=À8Ð$ÓLˆØ×Ñ˜% Ô*Ø�‰×Ñ˜T 5Ô)Øˆr?   c                 ó
  — | j                  d«      sJ ‚| j                  }| j                  t        j                  k(  r>| j                  «       }| j                  d«       | j                  j                  ||¬«      S d}d\  }}}dddd	d
œ}t        «       }| j                  dk7  �r| j                  |v r#t        d| j                  z  | j                  «      ‚|j                  | j                  «       | j                  dk(  r$| j                  d«       | j                  d¬«      }n}| j                  dk(  r$| j                  d«       | j                  d¬«      }nJ| j                  |v rd}||| j!                  «          z  }n#t        d| j                  z  | j                  «      ‚| j                  dk7  r�Œ| j                  d«       t#        |||g«      st        d| j                  «      ‚| j                  j                  ||||¬«      S )NÚ
lookupflagrR   rA   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ÚmarkFilteringSetrB   )r]   r\   r1   r   ÚNUMBERr„   r}   r(   ÚLookupFlagStatementr&   r2   r   r4   rž   r~   r�   r   rë   )r8   rB   ÚvalueÚ
value_seenr-  r.  ÚflagsÚseens           r   Úparse_lookupflag_zParser.parse_lookupflag_|  s  € ð ×#Ñ# LÔ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Ü!Ø.°×0IÑ0Ióð ð �x‰x×+Ñ+ØØ)Ø-Øð	 ,ó 
ð 	
r?   c                 óP  — | j                  d«      sJ ‚| j                  }| j                  d¬«      }|j                  «       st	        d|«      ‚| j                  «       }| j                  «       }| j                  d«       | j                  j                  j                  |«      }|€P| j                  j                  |«      }|| j                  j                  |<   | j                  j                  ||«       | j                  j                  ||||¬«      }|j!                  |«       |S )NrL   Tr›   z*Empty glyph class in mark class definitionrR   rA   )r]   r\   r�   ÚglyphSetr   r‡   Úexpect_class_name_r}   r*   ÚmarkClassesÚgetr(   rÏ   r-   r�   ÚMarkClassDefinitionÚaddDefinition)r8   rB   r    ru   ro   rL   Úmcdefs          r   re   zParser.parse_markClass_µ  s  € Ø×#Ñ# KÔ0Ð0Ð0Ø×+Ñ+ˆØ×'Ñ'¸Ð'Ó>ˆØ�‰Ô Ü!Ø<¸hóð ð ×#Ñ#Ó%ˆØ×&Ñ&Ó(ˆØ×Ñ˜CÔ Ø—I‘I×)Ñ)×-Ñ-¨dÓ3ˆ	ØÐØŸ™×*Ñ*¨4Ó0ˆIØ*3ˆD�I‰I×!Ñ! $Ñ'Ø×Ñ×%Ñ% d¨IÔ6Ø—‘×,Ñ,Ø�v˜v°ð -ó 
ˆð 	×Ñ Ô&Øˆr?   c                 óF  — | j                   dv sJ ‚| j                  dk(  r| j                  ||«      S | j                  dk(  r| j                  ||«      S | j                  dk(  r| j	                  ||«      S | j                  dk(  r| j                  ||«      S | j                  }| j                  |«      \  }}}}}}	| j                  d«       t        |«      r7t        |«      rt        d|«      ‚| j                  j                  |||||¬«      S |sT|sRt        |«      d	k(  rD|	sB|d
   €|j                  «        | j                  j                  |d
   |d
   |d   |d   ||¬«      S |rt        d|«      ‚| j                  j!                  t#        t%        ||«      «      |||	|¬«      S )N>   r   rÿ   ÚcursiveÚbaseÚligaturer‰   rR   z3If "lookup" is present, no values must be specifiedrA   r$  r   r   )r§   rB   z2"enumerate" is only allowed with pair positionings©Ú
forceChainrB   )r[   r2   Úparse_position_cursive_Úparse_position_base_Úparse_position_ligature_Úparse_position_mark_r\   rõ   r}   rë   r   r(   ÚChainContextPosStatementr$   ÚreverseÚPairPosStatementÚSinglePosStatementÚlistÚzip)
r8   r§   rK   rB   rì   r    rí   rî   rï   rð   s
             r   r¨   zParser.parse_position_Ë  sÓ  € Ø�‰Ð"5Ñ5Ð5Ð5Ø×Ñ˜yÒ(Ø×/Ñ/°
¸HÓEÐEØ×Ñ Ò'Ø×,Ñ,¨Z¸ÓBÐBØ×Ñ Ò+Ø×0Ñ0°¸XÓ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˜VÓ$Ó%ØØØØð +ó 
ð 	
r?   c                 ó  — | j                   }| j                  d«       |rt        d|«      ‚| j                  d¬«      }| j	                  «       }| j	                  «       }| j                  d«       | j                  j                  ||||¬«      S )Nr?  z>"enumerate" is not allowed with cursive attachment positioningTr›   rR   rA   )r\   r~   r   r�   r‡   r}   r(   ÚCursivePosStatement)r8   r§   rK   rB   r¶   ÚentryAnchorÚ
exitAnchors          r   rD  zParser.parse_position_cursive_   s•   € Ø×+Ñ+ˆØ×Ñ˜YÔ'ÙÜ!ØSØóð ð ×+Ñ+¸TÐ+ÓBˆ
Ø×(Ñ(Ó*ˆØ×'Ñ'Ó)ˆ
Ø×Ñ˜CÔ Ø�x‰x×+Ñ+Ø˜ Z¸(ð ,ó 
ð 	
r?   c                 óú   — | j                   }| j                  d«       |rt        d|«      ‚| j                  d¬«      }| j	                  «       }| j                  d«       | j                  j                  |||¬«      S )Nr@  zC"enumerate" is not allowed with mark-to-base attachment positioningTr›   rR   rA   )r\   r~   r   r�   rŒ   r}   r(   ÚMarkBasePosStatement)r8   r§   rK   rB   r@  Úmarkss         r   rE  zParser.parse_position_base_  s€   € Ø×+Ñ+ˆØ×Ñ˜VÔ$ÙÜ!ð6àóð ð
 ×%Ñ%°tÐ%Ó<ˆØ×(Ñ(Ó*ˆØ×Ñ˜CÔ Ø�x‰x×,Ñ,¨T°5À8Ð,ÓLÐLr?   c                 óš  — | j                   }| j                  d«       |rt        d|«      ‚| j                  d¬«      }| j	                  «       g}| j
                  dk(  r@| j                  d«       |j                  | j	                  «       «       | j
                  dk(  rŒ@| j                  d«       | j                  j                  |||¬«      S )NrA  zG"enumerate" is not allowed with mark-to-ligature attachment positioningTr›   ÚligComponentrR   rA   )
r\   r~   r   r�   rŒ   r2   rY   r}   r(   ÚMarkLigPosStatement)r8   r§   rK   rB   Ú	ligaturesrT  s         r   rF  zParser.parse_position_ligature_  sÆ   € Ø×+Ñ+ˆØ×Ñ˜ZÔ(ÙÜ!ð:àóð ð
 ×*Ñ*¸DÐ*ÓAˆ	Ø×)Ñ)Ó+Ð,ˆØ×Ñ .Ò0Ø× Ñ  Ô0Ø�L‰L˜×1Ñ1Ó3Ô4ð ×Ñ .Ó0ð 	×Ñ˜CÔ Ø�x‰x×+Ñ+¨I°uÀxÐ+ÓPÐPr?   c                 óú   — | j                   }| j                  d«       |rt        d|«      ‚| j                  d¬«      }| j	                  «       }| j                  d«       | j                  j                  |||¬«      S )Nr‰   zC"enumerate" is not allowed with mark-to-mark attachment positioningTr›   rR   rA   )r\   r~   r   r�   rŒ   r}   r(   ÚMarkMarkPosStatement)r8   r§   rK   rB   Ú	baseMarksrT  s         r   rG  zParser.parse_position_mark_/  s€   € Ø×+Ñ+ˆØ×Ñ˜VÔ$ÙÜ!ð6àóð ð
 ×*Ñ*¸DÐ*ÓAˆ	Ø×(Ñ(Ó*ˆØ×Ñ˜CÔ Ø�x‰x×,Ñ,¨Y¸ÈÐ,ÓQÐQr?   c                 ó¼   — | j                  d«      sJ ‚| j                  | j                  «       }}| j                  d«       | j                  j                  ||¬«      S )NÚscriptrR   rA   )r]   r\   Úexpect_script_tag_r}   r(   ÚScriptStatement)r8   rB   r]  s      r   Úparse_script_zParser.parse_script_=  sV   € Ø×#Ñ# HÔ-Ð-Ð-Ø×3Ñ3°T×5LÑ5LÓ5N�&ˆØ×Ñ˜CÔ Ø�x‰x×'Ñ'¨¸Ð'ÓBÐBr?   c           
      ó   — | j                   dv sJ ‚| j                  }| j                   dv }| j                  d¬«      \  }}}}}}t        |«      rt	        d|«      ‚g }	| j
                  dk(  rU| j                  d«      }
| j
                  dk7  rk| j                  dd¬	«      }|	j                  |«       | j
                  dk7  rŒ4n6| j
                  d
k(  r%| j                  d
«      }
| j                  d¬«      g}	nd }
| j                  d«       t        |	«      dk(  r!t        |«      st	        d| j                  «      ‚|
d
k(  r‡|rt	        d|«      ‚t        |«      dk7  st        |d   j                  «       «      dk7  rt	        d|«      ‚t        |	«      dk7  rt	        d|«      ‚| j                  j                  ||d   ||	d   |¬«      S t        |D �cg c]  }|€Œ|‘Œ	 c}«      }d}t        |	«      dk(  r!t        |	d   t        j                  «      rg }	d}|sÐt        |«      dk(  rÂt        |	«      dk(  r´|dk(  r¯t!        |d   j                  «       «      }t!        |	d   j                  «       «      }t        |«      dk(  r|t        |«      z  }t        |«      t        |«      k7  r#t	        dt        |«      t        |«      fz  |«      ‚| j                  j#                  ||	||||¬«      S |r7t        |«      dk(  r)|dk(  r$| j                  j%                  ||d   |d||¬«      S |sðt        |«      dk(  rât        |	«      dkD  rÔ|dk(  rÏt        |d   j                  «       «      }|	D ]Š  }t!        |j                  «       «      st	        d|«      ‚t        |j                  «       «      dk7  sŒEt        |j                  «       «      |k7  sŒbt	        d|› dt        |j                  «       «      › d�|«      ‚ | j                  j%                  ||d   ||	||¬«      S |s~t        |«      dkD  rpt        |	«      dk(  rbt        |	d   j                  «       «      dk(  rC|dk(  r>| j                  j'                  |||t!        |	d   j                  «       «      d   ||¬«      S |�rt        |«      dk7  rt	        d|«      ‚t        |	«      dk7  rt	        d|«      ‚|dk7  rt	        d|«      ‚t)        t!        |d   j                  «       «      «      }t)        t!        |	d   j                  «       «      «      }t        |«      dk(  r|t        |«      z  }t        |«      t        |«      k7  r#t	        dt        |«      t        |«      fz  |«      ‚| j                  j+                  ||||	|¬«      S t        |«      dkD  rt        |	«      dkD  rt	        d|«      ‚t        |	«      dk7  s|rt	        d|«      ‚| j                  j-                  |||||¬«      }|S c c}w )N>   r÷   ÚrsubÚ
reversesubrþ   >   rb  rc  FrJ   z-Substitution statements cannot contain valuesrä   rR   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"rA   z\Expected a glyph class with %d elements after "by", but found a glyph class with %d elementsrB  © 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   r2   r~   r�   rY   r}   r$   r7  r(   ÚAlternateSubstStatementrÎ   rÊ   rL  ÚSingleSubstStatementÚMultipleSubstStatementÚLigatureSubstStatementÚsortedÚ ReverseChainSingleSubstStatementÚChainContextSubstStatement)r8   rB   rI  Ú
old_prefixÚoldrí   rî   Ú
old_suffixrð   ÚnewÚkeywordrÞ   rÁ   Únum_lookupsÚis_deletionr    ÚreplacementsÚcountÚnÚrules                       r   Úparse_substitute_zParser.parse_substitute_C  sM  € Ø�‰Ð"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Ø˜C ™F J°°A±Àð 4ó ð ô  gÖ? °±š1Ò?Ó@ˆàˆÜˆs‹8�qŠ=œZ¨¨A©´·±Ô>Øˆ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Ø�S˜* j¸XÐPXð 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×<Ñ<Ø˜J¨¨S¸8ð =ó ð ô ˆs‹8�aŠ<œC ›H qšLÜ!ð#àóð ô ˆs‹8�qŠ=™KÜ!Ð"BÀHÓMÐMð �x‰x×2Ñ2Ø˜˜Z¨¸8ð 3ó 
ˆð ˆùòK @s   ÇW;ÇW;c                 óš   — | j                  d«      sJ ‚| j                  }| j                  d«       | j                  j	                  |¬«      S )NÚsubtablerR   rA   )r]   r\   r}   r(   ÚSubtableStatement)r8   rB   s     r   Úparse_subtable_zParser.parse_subtable_ý  sG   € Ø×#Ñ# JÔ/Ð/Ð/Ø×+Ñ+ˆØ×Ñ˜CÔ Ø�x‰x×)Ñ)°8Ð)Ó<Ð<r?   c                 óŒ  — | j                  d«      sJ ‚| j                  }| j                  «       }| j                  «       }d}d}| j                  t
        j                  t
        j                  fv s|dk7  r | j                  «       }| j                  «       }| j                  d«       | j                  j                  |||||¬«      S )NÚ
parametersg        r   rR   rA   )r]   r\   Úexpect_decipoint_r„   r1   r   r/  ÚFLOATr}   r(   ÚSizeParameters)r8   rB   Ú
DesignSizeÚSubfamilyIDÚ
RangeStartÚRangeEnds         r   Úparse_size_parameters_zParser.parse_size_parameters_  s½   € ð ×#Ñ# LÔ1Ð1Ð1Ø×+Ñ+ˆØ×+Ñ+Ó-ˆ
Ø×)Ñ)Ó+ˆØˆ
ØˆØ× Ñ ¤U§\¡\´5·;±;Ð$?Ñ?À;ÐRSÒCSØ×/Ñ/Ó1ˆJØ×-Ñ-Ó/ˆHà×Ñ˜CÔ Ø�x‰x×&Ñ&Ø˜ Z°ÀHð 'ó 
ð 	
r?   c                 ó¬   — | j                  d«      sJ ‚| j                  }| j                  «       \  }}}}| j                  j	                  d|||||¬«      S )NÚsizemenunameÚsizerA   )r]   r\   Úparse_name_r(   ÚFeatureNameStatement)r8   rB   Ú
platformIDÚ	platEncIDÚlangIDÚstrings         r   Úparse_size_menuname_zParser.parse_size_menuname_  sa   € Ø×#Ñ# NÔ3Ð3Ð3Ø×+Ñ+ˆØ04×0@Ñ0@Ó0BÑ-ˆ
�I˜v vØ�x‰x×,Ñ,Ø�J 	¨6°6ÀHð -ó 
ð 	
r?   c           	      ó   — | j                  d«      sJ ‚| j                  | j                  «       }}| j                  j	                  ||¬«      }| j                  d«       | j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  dœj                  |«      }|r	 ||«       nt        d|j!                  «       z  |«      ‚| j                  d«       | j                  «       }||k7  r't        d|j!                  «       z  | j                  «      ‚| j                  d«       |S )	NrP   rA   ú{)ÚGDEFÚheadÚhheaÚvhearo   ÚBASEzOS/2ÚSTATz"table %s" is not supportedr‘   úExpected "%s"rR   )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_r:  r   Ústrip)r8   rB   ro   rP   Úhandlerr˜   s         r   rh   zParser.parse_table_  s8  € Ø×#Ñ# GÔ,Ð,Ð,Ø×1Ñ1°4×3CÑ3CÓ3E�$ˆØ—‘×#Ñ# D°8Ð#Ó<ˆØ×Ñ˜CÔ à×*Ñ*Ø×*Ñ*Ø×*Ñ*Ø×*Ñ*Ø×*Ñ*Ø×*Ñ*Ø×*Ñ*Ø×*Ñ*ñ	
÷ ‰#ˆd‹)ð 	ñ Ù�E�Nä!Ø-°·
±
³Ñ<¸hóð ð 	×Ñ˜CÔ Ø×"Ñ"Ó$ˆØ�dŠ?Ü!Ø $§*¡*£,Ñ.°×0HÑ0Hóð ð 	×Ñ˜CÔ Øˆr?   c                 óH  — |j                   }| j                  dk7  s| j                  �rz| j                  d¬«       | j                  t
        j                  u rA|j                  | j                  j                  | j                  | j                  ¬«      «       në| j                  d«      r |j                  | j                  «       «       nº| j                  d«      r |j                  | j                  «       «       n‰| j                  d«      r |j                  | j                  «       «       nX| j                  d«      r |j                  | j!                  «       «       n'| j                  d	k(  r�Œ`t#        d
| j                  «      ‚| j                  dk7  r�Œk| j                  r�Œyy y )Nr‘   Tr   rA   rš   r«   r  r  rR   z<Expected Attach, LigatureCaretByIndex, or LigatureCaretByPos)rV   r2   r3   r7   rW   r   rX   rY   r(   rZ   r[   r\   r]   r¢   r²   r  r  r   ©r8   rP   rV   s      r   rš  zParser.parse_table_GDEF_;  sM  € Ø×%Ñ%ˆ
Ø×Ñ #Ò%¨×);Ó);Ø×Ñ¨ÐÔ.Ø×#Ñ#¤u§}¡}Ñ4Ø×!Ñ!Ø—H‘H×$Ñ$ T§_¡_¸t×?WÑ?WÐ$ÓXõð ×%Ñ% hÔ/Ø×!Ñ! $×"4Ñ"4Ó"6Õ7Ø×%Ñ% oÔ6Ø×!Ñ! $×";Ñ";Ó"=Õ>Ø×%Ñ%Ð&<Ô=Ø×!Ñ! $×"BÑ"BÓ"DÕEØ×%Ñ%Ð&:Ô;Ø×!Ñ! $×"@Ñ"@Ó"BÕCØ—‘ CÒ'Ùä%ØUØ×,Ñ,óð ð# ×Ñ #Ô%¨×);Ö);r?   c                 ó  — |j                   }| j                  dk7  s| j                  rä| j                  d¬«       | j                  t
        j                  u rA|j                  | j                  j                  | j                  | j                  ¬«      «       nW| j                  d«      r |j                  | j                  «       «       n&| j                  dk(  rŒËt        d| j                  «      ‚| j                  dk7  rŒÖ| j                  rŒãy y )Nr‘   Tr   rA   ÚFontRevisionrR   zExpected FontRevision)rV   r2   r3   r7   rW   r   rX   rY   r(   rZ   r[   r\   r]   Úparse_FontRevision_r   r¥  s      r   r›  zParser.parse_table_head_S  s×   € Ø×%Ñ%ˆ
Ø×Ñ #Ò%¨×);Ò);Ø×Ñ¨ÐÔ.Ø×#Ñ#¤u§}¡}Ñ4Ø×!Ñ!Ø—H‘H×$Ñ$ T§_¡_¸t×?WÑ?WÐ$ÓXõð ×%Ñ% nÔ5Ø×!Ñ! $×":Ñ":Ó"<Õ=Ø—‘ CÒ'Øä%Ð&=¸t×?WÑ?WÓXÐXð ×Ñ #Ó%¨×);Õ);r?   c                 ó$  — |j                   }d}| j                  dk7  s| j                  �rf| j                  d¬«       | j                  t
        j                  u rA|j                  | j                  j                  | j                  | j                  ¬«      «       n×| j                  t
        j                  u r”| j                  |v r†| j                  j                  «       }| j                  «       }|j                  | j                  j                  ||| j                  ¬«      «       | j                  dk7  r=t!        d| j"                  «      ‚| j                  dk(  r�ŒLt!        d| j                  «      ‚| j                  dk7  r�ŒW| j                  r�Œey y )	N)ÚCaretOffsetÚAscenderÚ	DescenderÚLineGapr‘   Tr   rA   rR   úIncomplete statementz4Expected CaretOffset, Ascender, Descender or LineGap)rV   r2   r3   r7   rW   r   rX   rY   r(   rZ   r[   r\   rj   Úlowerr„   Ú	HheaFieldr   r4   ©r8   rP   rV   ÚfieldsÚkeyr1  s         r   rœ  zParser.parse_table_hhea_b  sP  € Ø×%Ñ%ˆ
ØDˆØ×Ñ #Ò%¨×);Ó);Ø×Ñ¨ÐÔ.Ø×#Ñ#¤u§}¡}Ñ4Ø×!Ñ!Ø—H‘H×$Ñ$ T§_¡_¸t×?WÑ?WÐ$ÓXõð ×%Ñ%¬¯©Ñ3¸¿¹È6Ñ8QØ—o‘o×+Ñ+Ó-�Ø×+Ñ+Ó-�Ø×!Ñ!Ø—H‘H×&Ñ& s¨E¸D×<TÑ<TÐ&ÓUôð ×#Ñ# sÒ*Ü)Ø.°×0IÑ0Ióð ð —‘ CÒ'Ùä%ØMØ×,Ñ,óð ð' ×Ñ #Ô%¨×);Ö);r?   c                 ó$  — |j                   }d}| j                  dk7  s| j                  �rf| j                  d¬«       | j                  t
        j                  u rA|j                  | j                  j                  | j                  | j                  ¬«      «       n×| j                  t
        j                  u r”| j                  |v r†| j                  j                  «       }| j                  «       }|j                  | j                  j                  ||| j                  ¬«      «       | j                  dk7  r=t!        d| j"                  «      ‚| j                  dk(  r�ŒLt!        d| j                  «      ‚| j                  dk7  r�ŒW| j                  r�Œey y )	N)ÚVertTypoAscenderÚVertTypoDescenderÚVertTypoLineGapr‘   Tr   rA   rR   r®  z?Expected VertTypoAscender, VertTypoDescender or VertTypoLineGap)rV   r2   r3   r7   rW   r   rX   rY   r(   rZ   r[   r\   rj   r¯  r„   Ú	VheaFieldr   r4   r±  s         r   r�  zParser.parse_table_vhea_}  sR  € Ø×%Ñ%ˆ
ØMˆØ×Ñ #Ò%¨×);Ó);Ø×Ñ¨ÐÔ.Ø×#Ñ#¤u§}¡}Ñ4Ø×!Ñ!Ø—H‘H×$Ñ$ T§_¡_¸t×?WÑ?WÐ$ÓXõð ×%Ñ%¬¯©Ñ3¸¿¹È6Ñ8QØ—o‘o×+Ñ+Ó-�Ø×+Ñ+Ó-�Ø×!Ñ!Ø—H‘H×&Ñ& s¨E¸D×<TÑ<TÐ&ÓUôð ×#Ñ# sÒ*Ü)Ø.°×0IÑ0Ióð ð —‘ CÒ'Ùä%ð;à×,Ñ,óð ð' ×Ñ #Ô%¨×);Ö);r?   c                 ó"  — |j                   }| j                  dk7  s| j                  rè| j                  d¬«       | j                  t
        j                  u rA|j                  | j                  j                  | j                  | j                  ¬«      «       n[| j                  d«      r$| j                  «       }|r8|j                  |«       n&| j                  dk(  rŒÏt        d| j                  «      ‚| j                  dk7  rŒÚ| j                  rŒçy y )Nr‘   Tr   rA   ÚnameidrR   zExpected nameid)rV   r2   r3   r7   rW   r   rX   rY   r(   rZ   r[   r\   r]   Úparse_nameid_r   )r8   rP   rV   Ú	statements       r   rž  zParser.parse_table_name_™  sß   € Ø×%Ñ%ˆ
Ø×Ñ #Ò%¨×);Ò);Ø×Ñ¨ÐÔ.Ø×#Ñ#¤u§}¡}Ñ4Ø×!Ñ!Ø—H‘H×$Ñ$ T§_¡_¸t×?WÑ?WÐ$ÓXõð ×%Ñ% hÔ/Ø ×.Ñ.Ó0�	ÙØ×%Ñ% iÕ0Ø—‘ CÒ'Øä%Ð&7¸×9QÑ9QÓRÐRð ×Ñ #Ó%¨×);Õ);r?   c                 ó  — d}d}| j                   t        j                  v ri| j                  «       }| j                  }|dvrt        d|«      ‚| j                   t        j                  v r/| j                  «       }| j                  «       }nd}| j                  }|dk(  r|xs d}|xs d}n|xs d}|xs d}| j                  «       }| j                  d«       t        |||«      }|€t        d	|«      ‚| j                  ||«      }||||fS )
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   é	  rR   úUnsupported encoding)
r1   r   ÚNUMBERSÚexpect_any_number_r\   r   Úexpect_string_r}   r   Úunescape_string_©r8   rŒ  r�  r‹  rB   rŽ  ÚencodingÚ	unescapeds           r   r‰  z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¨9°fÓ=ˆØÐÜ!Ð"8¸(ÓCÐCØ×)Ñ)¨&°(Ó;ˆ	Ø˜9 f¨iÐ7Ð7r?   c                 óò  — d }d }| j                   t        j                  v ri| j                  «       }| j                  }|dvrt        d|«      ‚| j                   t        j                  v r/| j                  «       }| j                  «       }nd}| j                  }|dk(  r|xs d}|xs d}n|xs d}|xs d}| j                  «       }t        |||«      }|€t        d|«      ‚| j                  ||«      }||||fS )Nr¾  rÀ  r¿  r   r   rÁ  rÂ  )	r1   r   rÃ  rÄ  r\   r   rÅ  r   rÆ  rÇ  s           r   Úparse_stat_name_z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¨9°fÓ=ˆØÐÜ!Ð"8¸(ÓCÐCØ×)Ñ)¨&°(Ó;ˆ	Ø˜9 f¨iÐ7Ð7r?   c                 ó  — | j                   dk(  sJ | j                   «       ‚| j                  | j                  «       }}|dkD  rt        d| j                  «      ‚| j	                  «       \  }}}}| j
                  j                  ||||||¬«      S )Nrº  iÿ  z*Name id value cannot be greater than 32767rA   )r[   r\   rÄ  r   r‰  r(   Ú
NameRecord)r8   rB   ÚnameIDr‹  rŒ  r�  rŽ  s          r   r»  zParser.parse_nameid_ç  s–   € Ø�‰ (Ò*Ð;¨D¯O©OÓ;Ð*Ø×3Ñ3°T×5LÑ5LÓ5N�&ˆØ�EŠ>Ü!Ø<¸d×>VÑ>Vóð ð 15×0@Ñ0@Ó0BÑ-ˆ
�I˜v vØ�x‰x×"Ñ"Ø�J 	¨6°6ÀHð #ó 
ð 	
r?   c                 óÀ   ‡ ‡— ‰dk(  r"t        j                  d‰ j                  |«      }nˆˆ fd„}t        j                  d||«      }t        |dd«      }t	        |d«      S )NÚ	utf_16_bez\\[0-9a-fA-F]{4}c                 ó(   •— ‰j                  | ‰«      S r   )Úunescape_byte_)ÚmrÈ  r8   s    €€r   ú<lambda>z)Parser.unescape_string_.<locals>.<lambda>÷  s   ø€  ×!4Ñ!4°Q¸Ó!A€ r?   z\\[0-9a-fA-F]{2}Úsurrogatepass)Úrer÷   Úunescape_unichr_r
   r   )r8   rŽ  rÈ  r   ÚunescapeÚutf16s   ` `   r   rÆ  zParser.unescape_string_ó  sY   ù€ Ø�{Ò"Ü—‘Ð*¨D×,AÑ,AÀ6ÓJ‰AäAˆHÜ—‘Ð*¨H°fÓ=ˆAô ˜˜;¨Ó8ˆÜ�U˜KÓ(Ð(r?   c                 óT   — | j                  d«      dd  }t        t        |d«      «      S ©Nr   r   é   )ÚgroupÚchrÚint)Úmatchru  s     r   r×  zParser.unescape_unichr_ÿ  s&   € à�K‰K˜‹N˜1˜2ÐˆÜ”3�q˜"“:‹Ðr?   c                 ór   — | j                  d«      dd  }t        t        |d«      «      j                  |«      S rÛ  )rÝ  r	   rß  Údecode)rà  rÈ  ru  s      r   rÒ  zParser.unescape_byte_  s2   € à�K‰K˜‹N˜1˜2ÐˆÜ”s˜1˜b“zÓ"×)Ñ)¨(Ó3Ð3r?   c                 óˆ   — t        |«      D ]4  }t        || j                  j                  «      rŒ$t        ||«      r|c S  y  y r   )ÚreversedrÎ   r(   rZ   )r8   rV   Úclass_Úpreviouss       r   Úfind_previouszParser.find_previous	  sF   € Ü  Ó,ò 	ˆHÜ˜( D§H¡H×$4Ñ$4Ô5ØÜ˜H fÔ-Ø’ñ ð	ð r?   c                 ó
  — |j                   }| j                  dk7  s| j                  �rÛ| j                  d¬«       | j                  t
        j                  u rB|j                  | j                  j                  | j                  | j                  ¬«      «       �nK| j                  d«      r| j                  «       }�n(| j                  d«      rT| j                  t        «      «      }|j                  | j                  j!                  ||d| j                  ¬«      «       �nÃ| j                  d«      r…| j#                  |t        j                   «      }|€t%        d	| j                  «      ‚|j&                  rt%        d
| j                  «      ‚|j(                  j                  | j+                  «       «       �n-| j                  d«      r| j                  «       }�n
| j                  d«      rS| j                  t        «      «      }|j                  | j                  j!                  ||d| j                  ¬«      «       n¦| j                  d«      r„| j#                  |t        j                   «      }|€t%        d	| j                  «      ‚|j&                  st%        d| j                  «      ‚|j(                  j                  | j+                  «       «       n| j                  dk(  r�Œ×| j                  dk7  r�ŒÌ| j                  r�ŒÚy y )Nr‘   Tr   rA   ú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 statementsrR   )rV   r2   r3   r7   rW   r   rX   rY   r(   rZ   r[   r\   r]   Úparse_base_tag_list_Úparse_base_script_list_r$   ÚBaseAxisrç  r   rK   ÚminmaxÚparse_base_minmax_)r8   rP   rV   Úhoriz_basesÚhoriz_scriptsÚbase_script_listÚ
vert_basesÚvert_scriptss           r   rŸ  zParser.parse_table_BASE_  s¢  € Ø×%Ñ%ˆ
Ø×Ñ #Ò%¨×);Ó);Ø×Ñ¨ÐÔ.Ø×#Ñ#¤u§}¡}Ñ4Ø×!Ñ!Ø—H‘H×$Ñ$ T§_¡_¸t×?WÑ?WÐ$ÓXöð ×%Ñ%Ð&=Ô>Ø"×7Ñ7Ó9’Ø×%Ñ%Ð&@ÔAØ $× <Ñ <¼SÀÓ=MÓ N�Ø×!Ñ!Ø—H‘H×%Ñ%Ø#Ø%ØØ!%×!9Ñ!9ð	 &ó öð ×%Ñ%Ð&8Ô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Ø#'×#5Ñ#5°jÄ#Ç,Á,Ó#OÐ Ø#Ð+Ü)ØCØ×0Ñ0óð ð (×0Ò0Ü)ØQØ×0Ñ0óð ð !×'Ñ'×.Ñ.¨t×/FÑ/FÓ/HÕIØ—‘ CÒ'Ùðs ×Ñ #Ô%¨×);Ö);r?   c                 ó$  — |j                   }d}d}| j                  dk7  s| j                  �rä| j                  d¬«       | j                  t
        j                  u rB|j                  | j                  j                  | j                  | j                  ¬«      «       �nT| j                  t
        j                  u �r&| j                  j                  «       }d }| j                  |v r| j                  «       }n³| j                  d«      r2g }t!        d«      D ]!  }|j                  | j                  «       «       Œ# np| j                  |v rAg }| j                  d	k7  rQ|j                  | j                  «       «       | j                  d	k7  rŒ/n!| j                  d
«      r| j#                  «       }|j                  | j                  j%                  ||| j                  ¬«      «       n| j                  d	k(  r�Œà| j                  dk7  r�ŒÕ| j                  r�Œãy y )N)ÚFSTypeÚTypoAscenderÚTypoDescenderÚTypoLineGapÚ	winAscentÚ
winDescentÚXHeightÚ	CapHeightÚWeightClassÚ
WidthClassÚLowerOpSizeÚUpperOpSize)ÚUnicodeRangeÚCodePageRanger‘   Tr   rA   ÚPanoseé
   rR   ÚVendor)rV   r2   r3   r7   rW   r   rX   rY   r(   rZ   r[   r\   rj   r¯  r„   r]   r»   rÅ  ÚOS2Field)r8   rP   rV   ÚnumbersrÂ   r³  r1  r¾   s           r   r   zParser.parse_table_OS_2_S  s¹  € Ø×%Ñ%ˆ
ð
ˆð 3ˆØ×Ñ #Ò%¨×);Ó);Ø×Ñ¨ÐÔ.Ø×#Ñ#¤u§}¡}Ñ4Ø×!Ñ!Ø—H‘H×$Ñ$ T§_¡_¸t×?WÑ?WÐ$ÓXöð ×%Ñ%¬¯©Ò3Ø—o‘o×+Ñ+Ó-�Ø�Ø—?‘? gÑ-Ø ×/Ñ/Ó1‘EØ×)Ñ)¨(Ô3Ø�EÜ" 2›Yò <˜ØŸ™ T×%8Ñ%8Ó%:Õ;ñ<à—_‘_¨Ñ.Ø�EØ×*Ñ*¨cÒ1ØŸ™ T×%8Ñ%8Ó%:Ô;ð ×*Ñ*¨cÔ1à×)Ñ)¨(Ô3Ø ×/Ñ/Ó1�EØ×!Ñ!Ø—H‘H×%Ñ% c¨5¸4×;SÑ;SÐ%ÓTõð —‘ CÒ'Ùð3 ×Ñ #Ô%¨×);Ö);r?   c                 ó`  — | j                  d«      sJ ‚| j                  d«       g }| j                  dk7  s| j                  rÃ| j	                  «        | j                  d«      rR| j                  «       \  }}}}| j                  j                  d||||| j                  ¬«      }|j                  |«       n3| j                  dk7  r$t        d| j                  › d	�| j                  «      ‚| j                  dk7  rŒ¶| j                  rŒÃ| j                  d«       |st        d
| j                  «      ‚|S )NÚElidedFallbackNamer‘  r‘   ro   ÚstatrA   rR   úUnexpected token z in ElidedFallbackNameúExpected "name")r]   r}   r2   r3   r7   rË  r(   ÚSTATNameStatementr\   rY   r[   r   )r8   Únamesr‹  rŒ  r�  rŽ  Ú
nameRecords          r   Úparse_STAT_ElidedFallbackNamez$Parser.parse_STAT_ElidedFallbackName  s(  € Ø×#Ñ#Ð$8Ô9Ð9Ð9Ø×Ñ˜CÔ ØˆØ×Ñ #Ò%¨×);Ò);Ø×ÑÔ!Ø×#Ñ# FÔ+Ø8<×8MÑ8MÓ8OÑ5�
˜I v¨vØ!ŸX™X×7Ñ7ØØØØØØ!×5Ñ5ð 8ó �
ð —‘˜ZÕ(à—?‘? cÒ)Ü)Ø+¨D¯O©OÐ+<Ð<VÐWØ×0Ñ0óð ð ×Ñ #Ó%¨×);Ó);ð& 	×Ñ˜CÔ ÙÜ!Ð"3°T×5MÑ5MÓNÐNØˆr?   c                 óT  — | j                  d«      sJ ‚g }| j                  «       }|dvr)|j                  «       st        j	                  d|› d�«       | j                  «       }| j                  d«       | j                  dk7  s| j                  râ| j                  «        | j                  t        j                  u rŒH| j                  d«      rT| j                  }| j                  «       \  }}}}| j                  j!                  d|||||¬	«      }	|j#                  |	«       n3| j$                  d
k(  rŒ½t'        d| j$                  › �| j                  «      ‚| j                  dk7  rŒÕ| j                  rŒâ| j                  d«       | j                  j)                  |||| j                  «      S )NÚ
DesignAxis)ÚitalÚopszÚslntÚwdthÚwghtzUnregistered axis tag z should be uppercase.r‘  r‘   ro   r  rA   rR   zExpected "name", got )r]   r’   ÚisupperrÕ   rÖ   r„   r}   r2   r3   r7   rW   r   rX   r\   rË  r(   r  rY   r[   r   ÚSTATDesignAxisStatement)
r8   r  ÚaxisTagÚ	axisOrderrB   r‹  rŒ  r�  rŽ  ro   s
             r   Úparse_STAT_design_axiszParser.parse_STAT_design_axis›  s‹  € Ø×#Ñ# LÔ1Ð1Ð1ØˆØ×"Ñ"Ó$ˆàÐCÑCØ—O‘OÔ%ä�K‰KÐ0°°	Ð9NÐOÔPØ×'Ñ'Ó)ˆ	Ø×Ñ˜CÔ Ø×Ñ #Ò%¨×);Ò);Ø×ÑÔ!Ø×#Ñ#¤u§}¡}Ñ4ØØ×%Ñ% fÔ-Ø×3Ñ3�Ø8<×8MÑ8MÓ8OÑ5�
˜I v¨vØ—x‘x×1Ñ1Ø˜J¨	°6¸6ÈHð 2ó �ð —‘˜TÕ"Ø—‘ CÒ'Øä%Ø+¨D¯O©OÐ+<Ð=¸t×?WÑ?Wóð ð ×Ñ #Ó%¨×);Ó);ð$ 	×Ñ˜CÔ Ø�x‰x×/Ñ/Ø�Y  t×'?Ñ'?ó
ð 	
r?   c                 ó  — | j                  d«      sJ ‚| j                  d«       g }g }d}| j                  dk7  s| j                  �r=| j	                  d¬«       | j
                  t        j                  u rŒK| j                  d«      rT| j                  }| j                  «       \  }}}}| j                  j                  d|||||¬	«      }	|j                  |	«       nŠ| j                  d
«      r"| j                  «       }|j                  |«       nW| j                  d«      r| j                  «       }n5| j                  dk(  r�Œt!        d| j                  › d�| j                  «      ‚| j                  dk7  r�Œ/| j                  r�Œ=| j                  d«       |st!        d| j                  «      ‚|st!        d| j                  «      ‚t#        |«      dkD  r�|D ]G  }t#        |j$                  «      dkD  sŒt!        dt#        |j$                  «      › d�| j                  «      ‚ g }
|D ]=  }|j&                  }||
v rt!        d|› d�| j                  «      ‚|
j                  |«       Œ? | j                  j)                  |||| j                  «      S )NÚ	AxisValuer‘  r   r‘   Tr   ro   r  rA   rB   ÚflagrR   r  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}   r2   r3   r7   rW   r   rX   r\   rË  r(   r  rY   Úparse_STAT_locationÚexpect_stat_flagsr[   r   r$   rî   r•   ÚSTATAxisValueStatement)r8   Ú	locationsr  r3  rB   r‹  rŒ  r�  rŽ  ro   Úformat4_tagsr•   s               r   Úparse_STAT_axis_value_zParser.parse_STAT_axis_value_½  s†  € Ø×#Ñ# KÔ0Ð0Ð0Ø×Ñ˜CÔ Øˆ	ØˆØˆØ×Ñ #Ò%¨×);Ó);Ø×Ñ¨ÐÔ.Ø×#Ñ#¤u§}¡}Ñ4ØØ×%Ñ% fÔ-Ø×3Ñ3�Ø8<×8MÑ8MÓ8OÑ5�
˜I v¨vØ—x‘x×1Ñ1Ø˜J¨	°6¸6ÈHð 2ó �ð —‘˜TÕ"Ø×%Ñ% jÔ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×.Ñ.Ø�9˜e T×%=Ñ%=ó
ð 	
r?   c           	      óØ  — g }| j                  «       }t        |j                  «       «      dk7  r$t        d| j                  › d�| j
                  «      ‚| j                  dk7  r°| j                  t        j                  u r"| j                  «       }|j                  |«       nb| j                  t        j                  u r"| j                  «       }|j                  |«       n$t        d| j                  › d�| j                  «      ‚| j                  dk7  rŒ°t        |«      dk(  r0|\  }}}||k  s||kD  r t        d|› d	|› d
|› d�| j                  «      ‚| j                  j!                  ||«      S )Nr%  r#  z must be 4 charactersrR   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\   r2   r1   r   r  Úexpect_float_rY   r/  r„   r4   r(   ÚAxisValueLocationStatement)r8   rî   r•   r1  ÚnominalÚmin_valÚmax_vals          r   r$  zParser.parse_STAT_locationõ  sn  € ØˆØ×ÑÓ ˆÜˆs�y‰y‹{Ó˜qÒ Ü!Ø˜DŸO™OÐ,Ð,EÐEØ×(Ñ(óð ð
 ×Ñ #Ò%Ø×$Ñ$¬¯©Ñ3Ø×*Ñ*Ó,�Ø—‘˜eÕ$Ø×&Ñ&¬%¯,©,Ñ6Ø×+Ñ+Ó-�Ø—‘˜eÕ$ä%Ø(¨×)9Ñ)9Ð(:ð ;1ð 1à×-Ñ-óð ð ×Ñ #Ó%ô ˆv‹;˜!ÒØ(.Ñ%ˆG�W˜gØ˜Ò  G¨gÒ$5Ü%Ø$ W Ið .*à�i˜q  	¨ð,ð ×-Ñ-ó	ð ð �x‰x×2Ñ2°3¸Ó?Ð?r?   c                 ó<  — |j                   }g }| j                  dk7  s| j                  �rr| j                  d¬«       | j                  t
        j                  u rB|j                  | j                  j                  | j                  | j                  ¬«      «       �nâ| j                  t
        j                  u �r´| j                  d«      r<| j                  «       }|j                  | j                  j                  |«      «       �nx| j                  d«      rM| j!                  «       }|j                  | j                  j#                  |«      «       | j%                  d«       �n| j                  d«      rN| j'                  «       }|j                  |j(                  «       |j                  |«       | j%                  d«       n»| j                  d	«      rv| j+                  «       }|j,                  D ]4  }|j(                  |vsŒt/        d
|j(                  › d�| j                  «      ‚ |j                  |«       | j%                  d«       n4t/        d| j                  › �| j                  «      ‚| j                  dk(  r�Œn| j                  dk7  r�Œc| j                  r�Œqy y )Nr‘   Tr   rA   r  ÚElidedFallbackNameIDrR   r  r!  zDesignAxis not defined for r+  r  )rV   r2   r3   r7   rW   r   rX   rY   r(   rZ   r[   r\   rj   r]   r  r  r„   r2  r}   r  r•   r)  r'  r   )	r8   rP   rV   Údesign_axesr  r1  Ú
designAxisÚaxisValueRecordrB   s	            r   r¡  zParser.parse_table_STAT_  s+  € Ø×%Ñ%ˆ
ØˆØ×Ñ #Ò%¨×);Ó);Ø×Ñ¨ÐÔ.Ø×#Ñ#¤u§}¡}Ñ4Ø×!Ñ!Ø—H‘H×$Ñ$ T§_¡_¸t×?WÑ?WÐ$ÓXöð ×%Ñ%¬¯©Ò3Ø×'Ñ'Ð(<Ô=Ø ×>Ñ>Ó@�EØ×%Ñ% d§h¡h×&AÑ&AÀ%Ó&HÖIØ×)Ñ)Ð*@ÔAØ ×/Ñ/Ó1�EØ×%Ñ% d§h¡h×&CÑ&CÀEÓ&JÔKØ×'Ñ'¨Ö,Ø×)Ñ)¨,Ô7Ø!%×!<Ñ!<Ó!>�JØ×&Ñ& z§~¡~Ô6Ø×%Ñ% jÔ1Ø×'Ñ'¨Õ,Ø×)Ñ)¨+Ô6Ø&*×&AÑ&AÓ&C�OØ$3×$=Ñ$=ò ˜Ø#Ÿ<™<¨{Ò:ô #2Ø =ÀÇÁÀÈaÐ PØ $× 8Ñ 8ó#ð ð	ð ×%Ñ% oÔ6Ø×'Ñ'¨Õ,ä)Ø+¨D¯O©OÐ+<Ð=¸t×?WÑ?Wóð ð —‘ CÒ'ÙðI ×Ñ #Ô%¨×);Ö);r?   c                 óæ   — | j                   dv sJ | j                   «       ‚g }| j                  dk7  r/|j                  | j                  «       «       | j                  dk7  rŒ/| j	                  d«       |S )N)ré  rë  rR   )r[   r2   rY   r^  r}   )r8   Úbasess     r   rí  zParser.parse_base_tag_list_?  sx   € à�‰ð #
ñ 
ð 	ð �?‰?ó	ð 
ð ˆØ×Ñ #Ò%Ø�L‰L˜×0Ñ0Ó2Ô3ð ×Ñ #Ó%à×Ñ˜CÔ Øˆr?   c                 ó*  — | j                   dv sJ | j                   «       ‚| j                  |«      g}| j                  dk(  rA| j                  d«       |j	                  | j                  |«      «       | j                  dk(  rŒA| j                  d«       |S )N)rê  rì  r¬   rR   )r[   Úparse_base_script_record_r2   r}   rY   )r8   rt  Úscriptss      r   rî  zParser.parse_base_script_list_K  s˜   € Ø�‰ð #
ñ 
ð 	ð �?‰?ó	ð 
ð ×2Ñ2°5Ó9Ð;ˆØ×Ñ #Ò%Ø×Ñ Ô$Ø�N‰N˜4×9Ñ9¸%Ó@ÔAð ×Ñ #Ó%ð 	×Ñ˜CÔ Øˆr?   c                 ó¢   — | j                  «       }| j                  «       }t        |«      D �cg c]  }| j                  «       ‘Œ }}|||fS c c}w r   )r^  r»   r„   )r8   rt  Ú
script_tagÚbase_tagr¾   Úcoordss         r   r9  z Parser.parse_base_script_record_W  sP   € Ø×,Ñ,Ó.ˆ
Ø×*Ñ*Ó,ˆÜ16°u³Ö>¨A�$×%Ñ%Õ'Ð>ˆÐ>Ø˜8 VÐ+Ð+ùò ?s   ®Ac                 óz  — | j                  «       }| j                  «       }| j                  «       }| j                  «        | j                  t
        j                  u r| j                  dk(  st        d| j                  «      ‚| j                  «       }| j                  dk(  rt        d| j                  «      ‚||||fS )Nr¬   z0Expected a comma between min and max coordinatesz0Feature tags are not yet supported in BASE table)r^  r  r„   r7   rW   r   rl   r[   r   r\   r2   )r8   r<  r	  Ú	min_coordÚ	max_coords        r   rñ  zParser.parse_base_minmax_]  s¶   € Ø×,Ñ,Ó.ˆ
Ø×,Ñ,Ó.ˆØ×'Ñ'Ó)ˆ	Ø×ÑÔØ×$Ñ$¬¯©Ñ4¸¿¹ÈCÒ9OÜ!ØBØ×(Ñ(óð ð ×'Ñ'Ó)ˆ	Ø×Ñ˜sÒ"Ü!ØBØ×(Ñ(óð ð
 ˜8 Y°	Ð9Ð9r?   c                 óÈ  — d }| j                  d«       | j                  d«       | j                  dk(  r| j                  d«       n‹| j                  «       | j                  «       fg}| j                  dk(  rP| j                  d«       |j	                  | j                  «       | j                  «       f«       | j                  dk(  rŒPt        |«      }| j                  d«       |S )Nrt   Údevicerv   r¬   rw   )r}   r~   r2   r„   rY   Útuple)r8   Úresults     r   r…   zParser.parse_device_p  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Ô Øˆr?   c                 ó~   — | j                   t        j                  u xs  | j                  dk(  xs | j                  dk(  S )Nrt   ú()r1   r   r/  r2   ©r8   s    r   ré   zParser.is_next_value_  s?   € à×!Ñ!¤U§\¡\Ð1ò 'Ø×Ñ 3Ñ&ò'à×Ñ 3Ñ&ð	
r?   c                 ó¢  — | j                   t        j                  u r| j                  dk(  s| j                   t        j                  u r`| j                  d¬«      | j                  }}|r | j                  j                  |||¬«      }|S | j                  j                  |||¬«      }|S | j                  d«       | j                  }| j                   t        j                  u r³| j                  «       }|dk(  r+| j                  d«       | j                  j                  «       S | j                  j                  |«      }|€t        d	|z  | j                  «      ‚|j                  }|j                   |j"                  }	}|j$                  |j&                  }}
nK| j                  d¬«      | j                  d¬«      | j                  d¬«      | j                  d¬«      f\  }}	}
}| j                  dk(  r | j)                  «       | j)                  «       | j)                  «       | j)                  «       f\  }}}}t+        |r|nd
|r|nd
z   |r|nd
z   |r|nd
z   D ��cg c]  \  }}|‘Œ	 c}}«      }|d   dk  s|d   dkD  rt        d| j                  «      ‚d\  }}}}| j                  d«       | j                  j                  ||	|
|||||||¬«
      S c c}}w )NrG  Tr{   )ÚyAdvancerK   rB   )ÚxAdvancerK   rB   rt   rv   rw   zUnknown valueRecordDef "%s"rd  r   i€ÿÿÿrè   é   z+Device value out of valid range (-128..127))NNNN)rK   rB   )r1   r   rl   r2   r/  r„   r\   r(   ÚValueRecordr}   rj   r   r/   r€   r   r1  Ú
xPlacementÚ
yPlacementrK  rJ  r…   ri  )r8   rK   ÚnumberrB   Úvalro   Úvrdr1  rN  rO  rK  rJ  Ú
xPlaDeviceÚ
yPlaDeviceÚ
xAdvDeviceÚ
yAdvDevicerˆ  ÚdeltaÚ	allDeltass                      r   rê   zParser.parse_valuerecord_†  sü  € à×!Ñ!¤U§\¡\Ñ1°d×6FÑ6FÈ#Ò6MØ×"Ñ"¤e§l¡lÑ2à×#Ñ#¨TÐ#Ó2Ø×(Ñ(ð ˆFñ Ø—h‘h×*Ñ*Ø#¨hÀð +ó �ð ˆJð —h‘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˜
ˆJØ"'§.¡.°%·.±.�h‰Hð ×#Ñ#¨TÐ#Ó2Ø×#Ñ#¨TÐ#Ó2Ø×#Ñ#¨TÐ#Ó2Ø×#Ñ#¨TÐ#Ó2ð	:Ñ6ˆJ˜
 H¨hð ×Ñ˜sÒ"à×"Ñ"Ó$Ø×"Ñ"Ó$Ø×"Ñ"Ó$Ø×"Ñ"Ó$ð	>Ñ:ˆJ˜
 J°
ô ñ 7A©
ÀbÙ%/‘z°Rñ(9á%/‘z°Rñ(9ñ &0‘z°Rñ(9÷á#˜˜eò óóˆIð ˜‰|˜dÒ" i°¡m°cÒ&9Ü%ØAØ×,Ñ,óð ð
 >VÑ:ˆJ˜
 J°
à×Ñ˜CÔ Ø�x‰x×#Ñ#ØØØØØØØØØØð $ó 
ð 	
ùó#s   ÉK
c                 ó  — | j                  d«      sJ ‚| j                  }| j                  |«      }| j                  «       }| j	                  d«       | j
                  j                  |||¬«      }| j                  j                  ||«       |S )NrQ   rR   rA   )	r]   r\   rê   r   r}   r(   ÚValueRecordDefinitionr/   r�   )r8   rK   rB   r1  ro   rR  s         r   ri   z$Parser.parse_valuerecord_definition_Ô  s„   € à×#Ñ#Ð$4Ô5Ð5Ð5Ø×+Ñ+ˆØ×'Ñ'¨Ó1ˆØ× Ñ Ó"ˆØ×Ñ˜CÔ Ø�h‰h×,Ñ,¨T°5À8Ð,ÓLˆØ×Ñ×!Ñ! $¨Ô,Øˆ
r?   c                 óÚ   — | j                   dk(  sJ ‚| j                  }| j                  «       }| j                  «       }| j	                  d«       | j
                  j                  |||¬«      S )NrH   rR   rA   )r[   r\   r^  r  r}   r(   ÚLanguageSystemStatement)r8   rB   r]  r	  s       r   rc   zParser.parse_languagesystem_ß  sf   € Ø�‰Ð"2Ò2Ð2Ð2Ø×+Ñ+ˆØ×(Ñ(Ó*ˆØ×,Ñ,Ó.ˆØ×Ñ˜CÔ Ø�x‰x×/Ñ/°¸È8Ð/ÓTÐTr?   c                 ó  — |r| j                   dk(  sJ ‚| j                   dk(  sJ ‚| j                  }| j                  «       }|dv }d }d }d}|| j                  v r|}n|| j                  v r|}n|dk(  rd}|r| j                  «       }d}	| j                  dk(  r| j                  d«       d}	|r | j                  j                  ||	|¬«      }
n| j                  j                  ||	|¬«      }
| j                  |
||||«       |
S )	NrO   rM   >   ÚvaltÚvhalÚvkrnÚvpalFrˆ  Tr  )r   rB   )r[   r\   r’   ÚSS_FEATURE_TAGSÚCV_FEATURE_TAGSr   r2   r~   r(   ÚVariationBlockÚFeatureBlockr  )r8   rO   rB   r•   rK   ÚstylisticsetÚ
cv_featureÚsize_featurerN   r   r!  s              r   rf   zParser.parse_feature_block_ç  s)  € ÙØ—?‘? kÒ1Ð1Ð1à—?‘? iÒ/Ð/Ð/Ø×+Ñ+ˆØ×ÑÓ ˆØÐ:Ð:ˆàˆØˆ
ØˆØ�$×&Ñ&Ñ&Ø‰LØ�D×(Ñ(Ñ(Ø‰JØ�FŠ]ØˆLáØ×,Ñ,Ó.ˆLàˆØ×Ñ˜~Ò-Ø× Ñ  Ô0Ø ˆMáØ—H‘H×+Ñ+Ø�\°Èð ,ó ‰Eð —H‘H×)Ñ)Ø =¸8ð *ó ˆEð 	×Ñ˜% ¨<¸ÀzÔRØˆr?   c                 óÖ   — | j                   dk(  sJ | j                   «       ‚| j                  }| j                  «       }| j                  d«       | j                  j                  ||¬«      S )NrM   rR   rA   )r[   r\   r’   r}   r(   ÚFeatureReferenceStatement)r8   rB   ÚfeatureNames      r   Úparse_feature_reference_zParser.parse_feature_reference_  s^   € Ø�‰ )Ò+Ð<¨T¯_©_Ó<Ð+Ø×+Ñ+ˆØ×&Ñ&Ó(ˆØ×Ñ˜CÔ Ø�x‰x×1Ñ1°+ÈÐ1ÓQÐQr?   c           
      ó$  — | j                   dk(  sJ | j                   «       ‚| j                  j                  || j                   | j                  ¬«      }| j	                  d«       | j
                  D ]  }|j                  «        Œ | j                  dk7  s| j                  �r,| j                  d¬«       | j                  t        j                  u rK|j                  j                  | j                  j                  | j                   | j                  ¬«      «       n”| j!                  d«      r\| j                  }| j#                  «       \  }}}}|j                  j                  | j                  j%                  ||||||¬«      «       n'| j                   dk(  r�Œt'        d	| j                  «      ‚| j                  dk7  r�Œ| j                  r�Œ,| j	                  d«       | j
                  D ]  }|j)                  «        Œ | j	                  d«       |S )
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>`_.
        ÚfeatureNamesrA   r‘  r‘   Tr   ro   rR   r  )r[   r(   ÚNestedBlockr\   r}   r0   Úenter_scoper2   r3   r7   rW   r   rX   rV   rY   rZ   r]   r‰  rŠ  r   Ú
exit_scope)	r8   r•   r!  ÚsymtabrB   r‹  rŒ  r�  rŽ  s	            r   Úparse_featureNames_z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�
˜I v¨vØ× Ñ ×'Ñ'Ø—H‘H×1Ñ1Ø˜Z¨°F¸FÈXð 2ó õð
 —‘ CÒ'Ùä%Ð&7¸×9QÑ9QÓRÐRð# ×Ñ #Ô%¨×);Ô);ð$ 	×Ñ˜CÔ Ø×)Ñ)ò 	 ˆFØ×ÑÕð	 à×Ñ˜CÔ Øˆr?   c                 óx  — | j                   dk(  sJ | j                   «       ‚| j                  j                  || j                   | j                  ¬«      }| j	                  d«       | j
                  D ]  }|j                  «        Œ |j                  }| j                  dk7  s| j                  �rJ| j                  d¬«       | j                  t        j                  u rA|j                  | j                  j                  | j                   | j                  ¬«      «       n¼| j!                  h d£«      r,|j                  | j#                  || j                   «      «       n}| j!                  d«      r!|j                  | j%                  |«      «       nK| j                   d	k(  r�Œt'        d
j)                  | j                  | j                   «      | j                  «      ‚| j                  dk7  r�Œ<| j                  r�ŒJ| j	                  d«       | j
                  D ]  }|j+                  «        Œ | j	                  d	«       |S )NÚcvParametersrA   r‘  r‘   Tr   >   ÚSampleTextNameIDÚFeatUILabelNameIDÚParamUILabelNameIDÚFeatUITooltipTextNameIDÚ	CharacterrR   zExpected statement: got {} {})r[   r(   ro  r\   r}   r0   rp  rV   r2   r3   r7   rW   r   rX   rY   rZ   r]   Úparse_cvNameIDs_Úparse_cvCharacter_r   rm   rq  )r8   r•   r!  rr  rV   s        r   Úparse_cvParameters_zParser.parse_cvParameters_7  sì  € ð �‰ .Ò0ÐA°$·/±/ÓAÐ0Ø—‘×$Ñ$Ø�—‘¨4×+CÑ+Cð %ó 
ˆð 	×Ñ˜CÔ Ø×)Ñ)ò 	!ˆFØ×ÑÕ ð	!ð ×%Ñ%ˆ
Ø×Ñ #Ò%¨×);Ó);Ø×Ñ¨ÐÔ.Ø×#Ñ#¤u§}¡}Ñ4Ø×!Ñ!Ø—H‘H×$Ñ$ T§_¡_¸t×?WÑ?WÐ$ÓXõð ×%Ñ%òôð ×!Ñ! $×"7Ñ"7¸¸T¿_¹_Ó"MÕNØ×%Ñ% kÔ2Ø×!Ñ! $×"9Ñ"9¸#Ó">Õ?Ø—‘ CÒ'Ùä%Ø3×:Ñ:Ø×,Ñ,¨d¯o©oóð ×,Ñ,ó	ð ð) ×Ñ #Ô%¨×);Ô);ð6 	×Ñ˜CÔ Ø×)Ñ)ò 	 ˆFØ×ÑÕð	 à×Ñ˜CÔ Øˆr?   c                 ó  — | j                   |k(  sJ | j                   «       ‚| j                  j                  ||| j                  ¬«      }| j	                  d«       | j
                  D ]  }|j                  «        Œ | j                  dk7  s| j                  �r-| j                  d¬«       | j                  t        j                  u rK|j                  j                  | j                  j                  | j                   | j                  ¬«      «       n•| j!                  d«      r]| j                  }| j#                  «       \  }}}}	|j                  j                  | j                  j%                  |||||	||¬«      «       n'| j                   dk(  r�Œt'        d| j                  «      ‚| j                  dk7  r�Œ| j                  r�Œ-| j	                  d«       | j
                  D ]  }|j)                  «        Œ | j	                  d«       |S )	NrA   r‘  r‘   Tr   ro   rR   r  )r[   r(   ro  r\   r}   r0   rp  r2   r3   r7   rW   r   rX   rV   rY   rZ   r]   r‰  ÚCVParametersNameStatementr   rq  )
r8   r•   Ú
block_namer!  rr  rB   r‹  rŒ  r�  rŽ  s
             r   r{  zParser.parse_cvNameIDs_d  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�
˜I v¨vØ× Ñ ×'Ñ'Ø—H‘H×6Ñ6ØØ"Ø!ØØØ"Ø!)ð 7ó õ
ð —‘ CÒ'Ùä%Ð&7¸×9QÑ9QÓRÐRð/ ×Ñ #Ô%¨×);Ô);ð0 	×Ñ˜CÔ Ø×)Ñ)ò 	 ˆFØ×ÑÕð	 à×Ñ˜CÔ Øˆr?   c                 ó*  — | j                   dk(  sJ | j                   «       ‚| j                  | j                  «       }}| j                  d«       d|cxk\  rdk\  sn t	        dj                  dd«      |«      ‚| j                  j                  |||¬«      S )Nrz  rR   iÿÿÿ r   z/Character value must be between {:#x} and {:#x}rA   )r[   r\   rÄ  r}   r   rm   r(   ÚCharacterStatement)r8   r•   rB   Ú	characters       r   r|  zParser.parse_cvCharacter_ˆ  s�   € Ø�‰ +Ò-Ð>¨t¯©Ó>Ð-Ø"×6Ñ6¸×8OÑ8OÓ8Q�)ˆØ×Ñ˜CÔ Ø˜IÔ*¨Ô*Ü!ð"ß"(¡&¨¨HÓ"5Øóð ð
 �x‰x×*Ñ*¨9°cÀHÐ*ÓMÐMr?   c                 óø   — | j                   dk(  sJ | j                   «       ‚| j                  | j                  «       }}| j                  d«       |dk  rt	        d|«      ‚| j
                  j                  ||¬«      S )Nr§  rR   r   z&Font revision numbers must be positiverA   )r[   r\   r,  r}   r   r(   ÚFontRevisionStatement)r8   rB   Úversions      r   r¨  zParser.parse_FontRevision_”  st   € ð �‰ .Ò0ÐA°$·/±/ÓAÐ0Ø ×4Ñ4°d×6HÑ6HÓ6J�'ˆØ×Ñ˜CÔ Ø�aŠ<Ü!Ð"JÈHÓUÐUØ�x‰x×-Ñ-¨gÀÐ-ÓIÐIr?   c                 ó²  — | j                  «       }i }| j                  d«       | j                  dk7  �rJ| j                  «        | j                  t
        j                  urt        d| j                  «      ‚| j                  }||v rt        d|› �| j                  «      ‚| j                  t
        j                  u r| j                  «       }n.| j                  t
        j                  u r| j                  d¬«      }| j                  t
        j                  u r| j                  «       }n.| j                  t
        j                  u r| j                  d¬«      }| j                  d«       f||<   | j                  dk7  r�ŒJ| j                  d«       | j                  «       }||k7  rt        d|z  | j                  «      ‚| j                  j!                  ||«      S )	Nr‘  r‘   úExpected an axis namezRepeated condition for axis Fr{   rR   r˜  )r   r}   r2   r7   rW   r   rj   r   r\   r[   r1   r  r,  r/  r„   r(   ÚConditionsetStatement)r8   ro   Ú
conditionsÚaxisÚ	min_valueÚ	max_valueÚ	finalnames          r   rg   zParser.parse_conditionset_ž  s¡  € Ø× Ñ Ó"ˆàˆ
Ø×Ñ˜CÔ à×Ñ #Ó%Ø×ÑÔ!Ø×#Ñ#¬5¯:©:Ñ5Ü%Ð&=¸t×?WÑ?WÓXÐXà—?‘?ˆDØ�zÑ!Ü%Ø2°4°&Ð9¸4×;SÑ;Sóð ð ×$Ñ$¬¯©Ñ3Ø ×.Ñ.Ó0‘	Ø×&Ñ&¬%¯,©,Ñ6Ø ×/Ñ/¸Ð/Ó?�	à×$Ñ$¬¯©Ñ3Ø ×.Ñ.Ó0‘	Ø×&Ñ&¬%¯,©,Ñ6Ø ×/Ñ/¸Ð/Ó?�	Ø×Ñ Ô$à )¨9Ð5ˆJ�tÑð- ×Ñ #Ô%ð0 	×Ñ˜CÔ à×%Ñ%Ó'ˆ	Ø˜ÒÜ! /°DÑ"8¸$×:RÑ:RÓSÐSØ�x‰x×-Ñ-¨d°JÓ?Ð?r?   c                 ó<  — | j                  d«       | j                  D ]  }|j                  «        Œ |j                  }| j                  dk7  s| j
                  �rá| j                  d¬«       | j                  t        j                  u rB|j                  | j                  j                  | j                  | j                  ¬«      «       �nR| j                  t        j                  u r!|j                  | j!                  «       «       �n| j#                  d«      r!|j                  | j%                  «       «       �nã| j#                  ddh«      r#|j                  | j'                  |¬	«      «       �n­| j#                  d
«      r!|j                  | j)                  «       «       �n{| j#                  d«      r!|j                  | j+                  «       «       �nI| j#                  d«      r!|j                  | j-                  «       «       �n| j#                  d«      r"|j                  | j/                  |«      «       �nä| j#                  d«      r!|j                  | j1                  «       «       �n²| j#                  d«      r!|j                  | j3                  «       «       �n€| j#                  ddh«      r$|j                  | j5                  d|¬«      «       �nI| j#                  d«      r!|j                  | j7                  «       «       �n| j#                  h d£«      r!|j                  | j9                  «       «       �nã| j#                  d«      r!|j                  | j;                  «       «       �n±| j#                  d«      r"|j                  | j=                  |«      «       �n~|r3| j#                  d«      r"|j                  | j?                  |«      «       �nI|r3| j#                  d«      r"|j                  | jA                  |«      «       �n|r1| j#                  d«      r |j                  | jC                  «       «       ná|r1| j#                  d«      r |j                  | jE                  «       «       n®| j                  t        jF                  u rG| j                  | jH                  v r/|j                   | jH                  | j                     | «      «       nK| j                  dk(  r�Œ¤tK        djM                  | j                  | j                  «      | j                  «      ‚| j                  dk7  r�ŒÓ| j
                  r�Œá| j                  d«       | j                  D ]  }|jO                  «        Œ | jQ                  «       }||jR                  jU                  «       k7  r1tK        d|jR                  jU                  «       z  | j                  «      ‚| j                  d«       d}	d}
|D ]ž  }tW        || j                  jX                  «      r.t[        |j\                  |j^                  |j`                  g«       }	ŒQtW        || j                  jb                  «      sŒrt[        |j\                  |j^                  |j`                  g«       }
Œ  |	�r|
�rg }|j                  D ]ù  }tW        || j                  jX                  «      rÆ|jd                  d   jg                  «       }|jh                  d   jg                  «       }tk        |«      d k(  r|tk        |«      z  }tm        |«      D ]a  \  }}|j                  | j                  jc                  |j\                  ||j^                  ||   g|j`                  |jn                  ¬«      «       Œc Œé|j                  |«       Œû ||_        y y y )!Nr‘  r‘   Tr   rA   rG   r¤   r¥   rJ   rM   rý   r	  rI   r#  rL   r   rÿ   Fr¦   r]  >   r÷   rb  rc  rþ   ry  rQ   rn  ru  r}  r‡  rR   z7Expected glyph class definition or statement: got {} {}r˜  r   r   )8r}   r0   rp  rV   r2   r3   r7   rW   r   rX   rY   r(   rZ   r[   r\   r_   r`   r]   rb   r©   rl  r  r  rd   r5  re   r¨   r`  rw  r{  ri   rs  r}  r…  r�  rj   rk   r   rm   rq  r   ro   r¢  rÎ   rf  rë   rì   rï   rC  rg  r    r7  rs  r$   r¥   rB   )r8   r!  rK   rf  rh  rg  rr  rV   ro   Ú
has_singleÚhas_multipler   r    rs  r¾   rÝ   s                   r   r  zParser.parse_block_Ã  s3  € ð 	×Ñ˜CÔ Ø×)Ñ)ò 	!ˆFØ×ÑÕ ð	!ð ×%Ñ%ˆ
Ø×Ñ #Ò%¨×);Ó);Ø×Ñ¨ÐÔ.Ø×#Ñ#¤u§}¡}Ñ4Ø×!Ñ!Ø—H‘H×$Ñ$ T§_¡_¸t×?WÑ?WÐ$ÓXöð ×%Ñ%¬×)9Ñ)9Ñ9Ø×!Ñ! $×"CÑ"CÓ"EÖFØ×%Ñ% kÔ2Ø×!Ñ! $×"7Ñ"7Ó"9Ö:Ø×%Ñ% v¨{Ð&;Ô<Ø×!Ñ! $×"7Ñ"7ÀÐ"7Ó"JÖKØ×%Ñ% iÔ0Ø×!Ñ! $×"?Ñ"?Ó"AÖBØ×%Ñ% hÔ/Ø×!Ñ! $×"4Ñ"4Ó"6Ö7Ø×%Ñ% jÔ1Ø×!Ñ! $×"6Ñ"6Ó"8Ö9Ø×%Ñ% hÔ/Ø×!Ñ! $×"4Ñ"4°XÓ">Ö?Ø×%Ñ% lÔ3Ø×!Ñ! $×"8Ñ"8Ó":Ö;Ø×%Ñ% kÔ2Ø×!Ñ! $×"7Ñ"7Ó"9Ö:Ø×%Ñ% u¨jÐ&9Ô:Ø×!Ñ!Ø×(Ñ(°EÀHÐ(ÓMöð ×%Ñ% hÔ/Ø×!Ñ! $×"4Ñ"4Ó"6Ö7Ø×%Ñ%Ò&QÔRØ×!Ñ! $×"8Ñ"8Ó":Ö;Ø×%Ñ% jÔ1Ø×!Ñ! $×"6Ñ"6Ó"8Ö9Ø×%Ñ%Ð&6Ô7Ø×!Ñ! $×"DÑ"DÀXÓ"NÖOÙ $×"6Ñ"6°~Ô"FØ×!Ñ! $×":Ñ":¸<Ó"HÖIÙ × 4Ñ 4°^Ô DØ×!Ñ! $×":Ñ":¸:Ó"FÖGÙ $×"6Ñ"6°|Ô"DØ×!Ñ! $×"=Ñ"=Ó"?Õ@Ù $×"6Ñ"6°~Ô"FØ×!Ñ! $×";Ñ";Ó"=Õ>à×$Ñ$¬¯
©
Ñ2Ø—O‘O t§¡Ñ6à×!Ñ!Ð"B $§/¡/°$·/±/Ñ"BÀ4Ó"HÕIØ—‘ CÒ'Ùä%ØM×TÑTØ×,Ñ,¨d¯o©oóð ×,Ñ,ó	ð ði ×Ñ #Ô%¨×);Ô);ðv 	×Ñ˜CÔ Ø×)Ñ)ò 	 ˆFØ×ÑÕð	 ð × Ñ Ó"ˆØ�5—:‘:×#Ñ#Ó%Ò%Ü!Ø %§*¡*×"2Ñ"2Ó"4Ñ4°d×6NÑ6Nóð ð 	×Ñ˜CÔ ð ˆ
ØˆØò 	KˆAÜ˜!˜TŸX™X×:Ñ:Ô;Ü!$ a§h¡h°·±¸!¿,¹,Ð%GÓ!HÐH‘
Ü˜A˜tŸx™x×>Ñ>Õ?Ü#&¨¯©°!·(±(¸A¿L¹LÐ'IÓ#JÐJ‘ð		Kò š,ØˆJØ×%Ñ%ò )�Ü˜a §¡×!>Ñ!>Ô?ØŸX™X a™[×1Ñ1Ó3�FØ#$§>¡>°!Ñ#4×#=Ñ#=Ó#?�LÜ˜<Ó(¨AÒ-Ø$¬¨F«Ñ3˜Ü$-¨fÓ$5ò 
™˜˜5Ø"×)Ñ)Ø ŸH™H×;Ñ;Ø !§¡Ø %Ø !§¡Ø!-¨a¡Ð 1Ø !§¡Ø)*¯©ð <ó õ	ñ
ð ×%Ñ% aÕ(ð%)ð&  *ˆEÕð+ 'ˆ:r?   c                 ó    — | j                   t        j                  u r2t        |t	        d«      «      r| j
                  |k(  S | j
                  |v S y)Nr   F)rW   r   rj   rÎ   Útyper[   )r8   r   s     r   r]   zParser.is_cur_keyword_7  sC   € Ø×Ñ¤5§:¡:Ñ-Ü˜!œT "›XÔ&Ø—‘¨!Ñ+Ð+à—‘¨!Ð+Ð+Ør?   c                 óž   — | j                  «        | j                  t        j                  urt	        d| j
                  «      ‚| j                  S )NzExpected @NAME)r7   rW   r   r_   r   r\   r[   rH  s    r   r8  zParser.expect_class_name_?  s@   € Ø×ÑÔØ×Ñ¤u×'7Ñ'7Ñ7Ü!Ð"2°D×4LÑ4LÓMÐMØ�‰Ðr?   c                 óž   — | j                  «        | j                  t        j                  u r| j                  S t        d| j                  «      ‚)NzExpected a CID)r7   rW   r   rÉ   r[   r   r\   rH  s    r   rØ   zParser.expect_cid_E  s>   € Ø×ÑÔØ×Ñ¤5§9¡9Ñ,Ø—?‘?Ð"ÜÐ.°×0HÑ0HÓIÐIr?   c                 óž   — | j                  «        | j                  t        j                  urt	        d| j
                  «      ‚| j                  S )NzExpected file name)r7   rW   r   ÚFILENAMEr   r\   r[   rH  s    r   r  zParser.expect_filename_K  s>   € Ø×ÑÔØ×Ñ¤u§~¡~Ñ5Ü!Ð"6¸×8PÑ8PÓQÐQØ�‰Ðr?   c                 ó  — | j                  «        | j                  t        j                  u r| j                  j                  d«      S | j                  t        j                  u rd| j                  z  S t        d| j                  «      ‚)Nú\úcid%05dzExpected a glyph name or CID)	r7   rW   r   rj   r[   ÚlstriprÉ   r   r\   rH  s    r   rË   zParser.expect_glyph_Q  sj   € Ø×ÑÔØ×Ñ¤5§:¡:Ñ-Ø—?‘?×)Ñ)¨$Ó/Ð/Ø×!Ñ!¤U§Y¡YÑ.Ø˜tŸ™Ñ.Ð.ÜÐ<¸d×>VÑ>VÓWÐWr?   c                 óš   — | j                   r?|D ]9  }|| j                   v rŒ|| j                  vsŒ!| j                  | j                  |<   Œ; yy)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'   r6   r\   )r8   r  ro   s      r   rÌ   z$Parser.check_glyph_name_in_glyph_setY  sT   € ð ×ÒØò B�Ø˜4×+Ñ+Ñ+ØØ˜tŸ|™|Ò+Ø)-×)AÑ)A�D—L‘L Ò&ñ	Bð r?   c                 ó  — | j                  «       }| j                  j                  |«      }|€t        d|z  | j                  «      ‚t        || j                  j                  «      st        d|z  | j                  «      ‚|S )NzUnknown markClass @%sz@%s is not a markClass)r8  r-   r€   r   r\   rÎ   r(   rÏ   )r8   ro   Úmcs      r   rŠ   z"Parser.expect_markClass_reference_g  s‚   € Ø×&Ñ&Ó(ˆØ×Ñ×'Ñ'¨Ó-ˆØˆ:Ü!Ø'¨$Ñ.°×0HÑ0Hóð ô ˜"˜dŸh™h×0Ñ0Ô1Ü!Ø(¨4Ñ/°×1IÑ1Ióð ð ˆ	r?   c                 ó  — | j                  «        | j                  t        j                  urt	        d| j
                  «      ‚t        | j                  «      dkD  rt	        d| j
                  «      ‚| j                  dz   d d S )NzExpected a tagr%  z'Tags cannot be longer than 4 charactersz    )r7   rW   r   rj   r   r\   r$   r[   rH  s    r   r’   zParser.expect_tag_t  su   € Ø×ÑÔØ×Ñ¤u§z¡zÑ1Ü!Ð"2°D×4LÑ4LÓMÐMÜˆt�‰Ó !Ò#Ü!Ø9¸4×;SÑ;Sóð ð —‘ &Ñ(¨"¨1Ð-Ð-r?   c                 ó\   — | j                  «       }|dk(  rt        d| j                  «      ‚|S )NÚdfltz4"dflt" is not a valid script tag; use "DFLT" instead©r’   r   r\   ©r8   r•   s     r   r^  zParser.expect_script_tag_~  s7   € Ø×ÑÓ ˆØ�&Š=Ü!ØFØ×(Ñ(óð ð ˆ
r?   c                 ó\   — | j                  «       }|dk(  rt        d| j                  «      ‚|S )NÚDFLTz6"DFLT" is not a valid language tag; use "dflt" insteadr¢  r£  s     r   r  zParser.expect_language_tag_‡  s7   € Ø×ÑÓ ˆØ�&Š=Ü!ØHØ×(Ñ(óð ð ˆ
r?   c                 ó®   — | j                  «        | j                  t        j                  u r| j                  |k(  r|S t        d|z  | j                  «      ‚)NzExpected '%s')r7   rW   r   rl   r[   r   r\   )r8   Úsymbols     r   r}   zParser.expect_symbol_�  sH   € Ø×ÑÔØ×Ñ¤5§<¡<Ñ/°D·O±OÀvÒ4MØˆMÜ˜o°Ñ6¸×8PÑ8PÓQÐQr?   c                 óÂ   — | j                  «        | j                  t        j                  u r| j                  |k(  r| j                  S t        d|z  | j                  «      ‚)Nr˜  ©r7   rW   r   rj   r[   r   r\   )r8   rp  s     r   r~   zParser.expect_keyword_–  sM   € Ø×ÑÔØ×Ñ¤5§:¡:Ñ-°$·/±/ÀWÒ2LØ—?‘?Ð"Ü˜o°Ñ7¸×9QÑ9QÓRÐRr?   c                 óž   — | j                  «        | j                  t        j                  u r| j                  S t        d| j                  «      ‚)NzExpected a namer©  rH  s    r   r   zParser.expect_name_œ  s>   € Ø×ÑÔØ×Ñ¤5§:¡:Ñ-Ø—?‘?Ð"ÜÐ/°×1IÑ1IÓJÐJr?   c                 ó  — | j                  «        | j                  t        j                  u r| j                  S |r;| j                  t        j
                  u r| j                  dk(  r| j                  «       S t        d| j                  «      ‚)NrG  zExpected a number)	r7   rW   r   r/  r[   rl   Úexpect_variable_scalar_r   r\   )r8   r|   s     r   r„   zParser.expect_number_¢  sm   € Ø×ÑÔØ×Ñ¤5§<¡<Ñ/Ø—?‘?Ð"Ù˜×,Ñ,´·±Ñ<ÀÇÁÐTWÒAWØ×/Ñ/Ó1Ð1ÜÐ1°4×3KÑ3KÓLÐLr?   c                 óâ   — | j                  «        t        «       }	 | j                  t        j                  k(  r| j
                  dk(  r	 |S | j                  «       \  }}|j                  ||«       ŒU)NrT   )r7   r   rW   r   rl   r[   Úexpect_master_Ú	add_value)r8   ÚscalarrB   r1  s       r   r¬  zParser.expect_variable_scalar_ª  si   € Ø×ÑÔÜÓ!ˆØØ×#Ñ#¤u§|¡|Ò3¸¿¹È3Ò8NØð ˆð #×1Ñ1Ó3‰OˆH�eØ×Ñ˜X uÔ-ð	 r?   c                 óì  — i }	 | j                   t        j                  urt        d| j                  «      ‚| j
                  }| j                  «        | j                   t        j                  u r| j
                  dk(  st        d| j                  «      ‚| j                  «       }|||<   | j                  t        j                  u r| j                  d   dk(  rnc| j                  «        | j                   t        j                  u r| j
                  dk(  st        d| j                  «      ‚| j                  «        �Œ6| j                  «        t        | j
                  dd  «      }| j                  «        ||fS )	Nrˆ  r´   zExpected an equals signr   ú:r¬   z#Expected an comma or an equals signr   )rW   r   rj   r   r\   r[   r7   rl   r„   r1   r2   rß  )r8   rB   r‹  r1  s       r   r®  zParser.expect_master_´  sI  € ØˆØØ×#Ñ#¬5¯:©:Ñ5Ü%Ð&=¸t×?WÑ?WÓXÐXØ—?‘?ˆDØ×ÑÔ!Ø×(Ñ(¬E¯L©LÑ8¸T¿_¹_ÐPSÒ=SÜ%Ø-¨t×/GÑ/Góð ð ×'Ñ'Ó)ˆEØ"ˆH�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Ð'Ó(ˆØ×ÑÔØ˜ˆÐr?   c                 óž   — | j                  «        | j                  t        j                  v r| j                  S t        d| j                  «      ‚)Nz/Expected a decimal, hexadecimal or octal number)r7   rW   r   rÃ  r[   r   r\   rH  s    r   rÄ  zParser.expect_any_number_Ï  sB   € Ø×ÑÔØ×Ñ¤5§=¡=Ñ0Ø—?‘?Ð"ÜØ=¸t×?WÑ?Wó
ð 	
r?   c                 óž   — | j                  «        | j                  t        j                  u r| j                  S t        d| j                  «      ‚)Nz Expected a floating-point number)r7   rW   r   r  r[   r   r\   rH  s    r   r,  zParser.expect_float_×  sB   € Ø×ÑÔØ×Ñ¤5§;¡;Ñ.Ø—?‘?Ð"ÜØ.°×0HÑ0Hó
ð 	
r?   c                 óæ   — | j                   t        j                  k(  r| j                  «       S | j                   t        j                  u r| j                  «       dz  S t        d| j                  «      ‚)Nr  ú,Expected an integer or floating-point number©r1   r   r  r,  r/  r„   r   r\   rH  s    r   r~  zParser.expect_decipoint_ß  sa   € Ø× Ñ ¤E§K¡KÒ/Ø×%Ñ%Ó'Ð'Ø×"Ñ"¤e§l¡lÑ2Ø×&Ñ&Ó(¨2Ñ-Ð-ä!Ø>À×@XÑ@Xóð r?   c                 óæ   — d}dddœ}| j                   dk7  rZ| j                   |v r| j                  «       }|||   z  }n#t        d| j                  › �| j                  «      ‚| j                   dk7  rŒZ|S )Nr   r   r$  )ÚOlderSiblingFontAttributeÚElidableAxisValueNamerR   zUnexpected STAT flag )r2   r   r   r[   r\   )r8   r1  r3  ro   s       r   r%  zParser.expect_stat_flagsé  s‰   € Øˆà)*Ø%&ñ
ˆð ×Ñ #Ò%Ø×Ñ 5Ñ(Ø×(Ñ(Ó*�Ø  d¡Ñ+‘ä%Ø+¨D¯O©OÐ+<Ð=¸t×?WÑ?Wóð ð ×Ñ #Ó%ð ˆr?   c                 óà   — | j                   t        j                  k(  r| j                  «       S | j                   t        j                  u r| j                  «       S t        d| j                  «      ‚)Nr¶  r·  rH  s    r   Úexpect_stat_values_zParser.expect_stat_values_ù  s\   € Ø× Ñ ¤E§K¡KÒ/Ø×%Ñ%Ó'Ð'Ø×"Ñ"¤e§l¡lÑ2Ø×&Ñ&Ó(Ð(ä!Ø>À×@XÑ@Xóð r?   c                 óž   — | j                  «        | j                  t        j                  u r| j                  S t        d| j                  «      ‚)NzExpected a string)r7   rW   r   ÚSTRINGr[   r   r\   rH  s    r   rÅ  zParser.expect_string_	  s>   € Ø×ÑÔØ×Ñ¤5§<¡<Ñ/Ø—?‘?Ð"ÜÐ1°4×3KÑ3KÓLÐLr?   c                 ó2  — |rJ| j                   r>t        j                  | _        | j                   j	                  d«      \  | _        | _        y | j                  | j                  | j                  c| _        | _        | _        	 	 t        | j                  «      \  | _        | _        | _	        | j                  t        j                  k7  ry | j                   j                  | j                  | j                  f«       Œy# t        $ r d\  | _        | _        Y Œjw xY w)Nr   r   )r3   r   rX   rW   r#   r[   r\   r1   r2   r4   Únextr5   ÚStopIterationrY   )r8   r    s     r   r7   z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   Â(C; Ã;DÄDc                 óH   — dj                  t        t        | «      «      «      S )z'abc' --> 'cba'r   )r%   rä  rL  )r   s    r   Úreverse_string_zParser.reverse_string_!	  s   € ð �w‰w”x¤ Q£Ó(Ó)Ð)r?   c                 óŒ   — t        «       }||kD  rt        d|«      ‚t        ||dz   «      D ]  }|j                  d|z  «       Œ |S )z>(location, 999, 1001) --> ["cid00999", "cid01000", "cid01001"]z*Bad range: start should be less than limitr   rš  )rL  r   r»   rY   )r8   rB   r¿   rÀ   rE  rÇ   s         r   rÚ   zParser.make_cid_range_&	  sS   € ä“ˆØ�5Š=Ü!Ø<¸hóð ô ˜ ¨¡	Ó*ò 	+ˆCØ�M‰M˜) c™/Õ*ð	+àˆr?   c                 ó&  — t        «       }t        |«      t        |«      k7  rt        d|›d|›d�|«      ‚| j                  }t        j
                  j                  ||g«      } |t        j
                  j                   ||«       ||«      g«      «      }t        |«      dkD  r1|t        |«      t        |«        }|t        |«      t        |«        }	n|t        |«      d }|t        |«      d }	||	k\  rt        d|«      ‚t        j                  d«      }
|
j                  |«      rP|
j                  |	«      r?t        t        |«      t        |	«      dz   «      D ]  }|j                  d	|||fz  «       Œ |S t        j                  d
«      }|j                  |«      rP|j                  |	«      r?t        t        |«      t        |	«      dz   «      D ]  }|j                  d	|||fz  «       Œ |S t        j                  d«      }|j                  |«      rm|j                  |	«      r\t        t        |d«      t        |	d«      dz   «      D ]4  }dt        |«      z   t        |«       d }|j                  |›|›|›�«       Œ6 |S t        d|›d|›d�|«      ‚)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}$r  Ú000r¸   r¹   )rL  r$   r   rÃ  ÚosÚpathÚcommonprefixrÖ  Úcompilerà  r»   ÚordrY   rß  r×   )r8   rB   r¿   rÀ   rE  Úrevrì   rï   Ústart_rangeÚlimit_rangeÚ	uppercaseÚcÚ	lowercaseÚdigitsr¾   rP  s                   r   rÔ   zParser.make_glyph_range_1	  sW  € ä“ˆÜˆu‹:œ˜U›Ò#Ý!ÚJOÒQVÐWØóð ð
 ×"Ñ"ˆÜ—‘×%Ñ% u¨e 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Üœ3˜{Ó+¬S°Ó-=ÀÑ-AÓBò >�Ø—‘˜h¨&°!°VÐ)<Ñ<Õ=ð>àˆMä—J‘J˜zÓ*ˆ	Ø�?‰?˜;Ô'¨I¯O©O¸KÔ,HÜœ3˜{Ó+¬S°Ó-=ÀÑ-AÓBò >�Ø—‘˜h¨&°!°VÐ)<Ñ<Õ=ð>àˆMä—‘˜OÓ,ˆØ�<‰<˜Ô$¨¯©°kÔ)BÜœ3˜{¨BÓ/´°[À"Ó1EÈÑ1IÓJò C�Ø¤# a£&™.¬3¨{Ó+;Ð*;Ð*=Ð>�Ø—‘©&±&¹&ÐAÕBðCð ˆMå²eºUÐCÀXÓNÐNr?   )rd  TN)F)NFN)kÚ__name__Ú
__module__Ú__qualname__Ú__doc__rk   r(   r»   rb  rc  r>   rr   r‡   rŒ   rb   ra   r¢   r©   r²   r`   rÃ   r�   rõ   rù   rû   r  r^   r  r  r  rd   r5  re   r¨   rD  rE  rF  rG  r`  rw  r{  r…  r�  rh   rš  r›  rœ  r�  rž  r‰  rË  r»  rÆ  Ústaticmethodr×  rÒ  rç  rŸ  r   r  r  r)  r$  r¡  rí  rî  r9  rñ  r…   ré   rê   ri   rc   rf   rl  rs  r}  r{  r|  r¨  rg   r  r]   r8  rØ   r  rË   rÌ   rŠ   r’   r^  r  r}   r~   r   r„   r¬  r®  rÄ  r,  r~  r%  r¼  rÅ  r7   rÃ  rÚ   rÔ   )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òxòt=ò
ò$
òò<ò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ór*òhòòJòòXòBòò.òòòRòSòKóMòòò6
ò
òòò òMóUð0 ñ*ó ð*ò	ó+OùóOH ?ùÛ>s
   —E>³Fr   c                   ó*   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zy)r+   c                 ó   — i g| _         y r   ©Úscopes_rH  s    r   r>   zSymbolTable.__init__`	  s   € Ø�tˆ�r?   c                 ó:   — | j                   j                  i «       y r   )rÛ  rY   rH  s    r   rp  zSymbolTable.enter_scopec	  s   € Ø�‰×Ñ˜BÕr?   c                 ó8   — | j                   j                  «        y r   )rÛ  r#   rH  s    r   rq  zSymbolTable.exit_scopef	  s   € Ø�‰×ÑÕr?   c                 ó(   — || j                   d   |<   y )Nrè   rÚ  )r8   ro   Úitems      r   r�   zSymbolTable.definei	  s   € Ø!%ˆ�‰�RÑ˜Òr?   c                 óf   — t        | j                  «      D ]  }|j                  |«      }|sŒ|c S  y r   )rä  rÛ  r:  )r8   ro   Úscoperß  s       r   r€   zSymbolTable.resolvel	  s4   € Ü˜dŸl™lÓ+ò 	ˆEØ—9‘9˜T“?ˆDÚØ’ð	ð r?   N)rÓ  rÔ  rÕ  r>   rp  rq  r�   r€   rd  r?   r   r+   r+   _	  s   „ òò òò&ór?   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+   rd  r?   r   ú<module>rì     s[   ðÝ 2ß KÑ KÝ :Ý 4ß <Ñ <ß "Ð "Û Û 	Û 	ð €g×Ñ˜Ó!€ôM%OˆVô M%Oô`J�&õ r?   