§
    ‚ÛgUx  ã                   ó~  — d Z ddlZddlmZ ddlZddlZddlmZ ddl	m
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!„ Z&d"„ Z'd#„ Z(d$„ Z)d%„ Z*d&„ Z+d<d'„Z, e-e.e/fd(fe.e/fd(fe.e/fd(fe0d(fe0d(fe0d(f¬)¦  «        Z1d*„ Z2d<d+„Z3 e-e.e/fd(fe.e/fd(fe0d(fe0d(fe0d(f¬,¦  «        Z4d-„ Z5d.„ Z6d/„ Z7d0Z8 e-e0d1fe.e/fd(fe.e/fd(fe.e/fd(fe.e/fd(fe.e/fd(fe.e/fd(fe0d(f¬2¦  «        Z9d3„ Z:d=d4„Z;d5„ Z<d6„ Z=d7„ Z>d8Z?d9„ Z@d:„ ZAeBd;k    rddlCZC eCjD        ¦   «          dS dS )>z"Various low level data validators.é    N)Úopen)ÚMapping)ÚnumberTypesc                 ód   — t          | t          ¦  «        rdS dD ]}t          | |¦  «        s dS ŒdS )zY
    Some objects will likely come in that aren't
    dicts but are dict-ish enough.
    T)ÚkeysÚvaluesÚitemsF)Ú
isinstancer   Úhasattr)ÚvalueÚattrs     úQ/granary/edev/quantum/lib/python3.11/site-packages/fontTools/ufoLib/validators.pyÚisDictEnoughr      sM   € õ
 �%�Ñ!Ô!ð ØˆtØ+ð ð ˆÝ�u˜dÑ#Ô#ð 	Ø�5�5ð	àˆ4ó    c                 ó"   — t          | |¦  «        S )ú(
    Generic. (Added at version 2.)
    )r
   )r   Útyps     r   ÚgenericTypeValidatorr      s   € õ �e˜SÑ!Ô!Ð!r   c                 óÆ   — t          | t          t          f¦  «        sdS t          | ¦  «        }t          |¦  «        }||z
  rdS | D ]}t          |t          ¦  «        s dS ŒdS )r   FT)r
   ÚlistÚtupleÚsetÚint)r   ÚvalidValuesÚ	valuesSetÚvalidValuesSetr   s        r   ÚgenericIntListValidatorr   %   s{   € õ �f�t¥U˜mÑ,Ô,ð ØˆuÝ�F‘”€IÝ˜Ñ%Ô%€NØ�>Ñ!ð ØˆuØð ð ˆÝ˜%¥Ñ%Ô%ð 	Ø�5�5ð	àˆ4r   c                 óD   — t          | t          ¦  «        sdS | dk     rdS dS ©ú(
    Generic. (Added at version 3.)
    Fr   T©r
   r   ©r   s    r   ÚgenericNonNegativeIntValidatorr#   5   ó.   € õ �e�SÑ!Ô!ð ØˆuØˆq‚y€yØˆuØˆ4r   c                 óD   — t          | t          ¦  «        sdS | dk     rdS dS r   )r
   r   r"   s    r   Ú!genericNonNegativeNumberValidatorr&   @   s.   € õ �e�[Ñ)Ô)ð ØˆuØˆq‚y€yØˆuØˆ4r   c                 ó8  — t          | t          ¦  «        sdS |                     ¦   «         D ]\  }\  }}|sŒ|| vr dS Œ|                      ¦   «         D ]	}||vr dS Œ
|                      ¦   «         D ](\  }}||         \  }}|€|sŒt          ||¦  «        s dS Œ)dS )r    FNT)r
   r   r	   r   )r   Ú	prototypeÚkeyr   ÚrequiredÚvÚprototypeTypes          r   ÚgenericDictValidatorr-   K   sé   € õ
 �e�WÑ%Ô%ð Øˆuà )§¢Ñ 1Ô 1ð ð Ñˆ‰_ˆc�8Øð 	ØØ�eÐÐØ�5�5ð ð �zŠz‰|Œ|ð ð ˆØ�iÐÐØ�5�5ð  ð —+’+‘-”-ð ð ‰ˆˆQØ"+¨C¤.Ñˆ�xØˆ9˜Xˆ9ØÝ˜!˜]Ñ+Ô+ð 	Ø�5�5ð	àˆ4r   c                 ó   — g d¢}| |v S )ú
    Version 2+.
    )ÚregularÚitalicÚboldzbold italic© )r   Úoptionss     r   Ú"fontInfoStyleMapStyleNameValidatorr5   m   s   € ð ;Ð:Ð:€GØ�GÐÐr   c                 óž  — t          | t          ¦  «        sdS t          | ¦  «        dk    rdS g d¢}t          t          dft          df¬¦  «        }g }| D ]c}t          ||¦  «        s dS |d         }|d         }t          |¦  «        }|s dS t          ||¦  «        }|s dS |                     |¦  «         Œd|t          |¦  «        k    rdS dS )ú
    Version 3+.
    Fr   T)r   é   é   é   )ÚrangeMaxPPEMÚrangeGaspBehaviorr;   r<   )
r
   r   ÚlenÚdictr   r-   r#   r   ÚappendÚsorted)	r   ÚvalidBehaviorsÚdictPrototypeÚ	ppemOrderÚrangeRecordÚppemÚbehaviorÚppemValidityÚbehaviorValiditys	            r   Ú)fontInfoOpenTypeGaspRangeRecordsValidatorrI   u   s  € õ �e�TÑ"Ô"ð ØˆuÝ
ˆ5�z„z�Q‚€ØˆtØ!�\�\€NÝ¥s¨D kÅdÈDÀ\ÐRÑRÔR€MØ€IØð ð ˆÝ# K°Ñ?Ô?ð 	Ø�5�5Ø˜>Ô*ˆØÐ2Ô3ˆÝ5°dÑ;Ô;ˆØð 	Ø�5�5Ý2°8¸^ÑLÔLÐØð 	Ø�5�5Ø×Ò˜ÑÔÐÐØ•F˜9Ñ%Ô%Ò%Ð%ØˆuØˆ4r   c                 óR  — t          | t          ¦  «        sdS t          | ¦  «        dk    sdS |                      d¦  «        dk    rdS |                      d¦  «        \  }}|                     d¦  «        dk    rdS |                     d¦  «        dk    rdS |                     d¦  «        \  }}}t          |¦  «        dk    rdS t          |¦  «        dk    rdS t          |¦  «        dk    rdS 	 t          |¦  «        }t          |¦  «        }t          |¦  «        }n# t          $ r Y dS w xY w|dk     s|d	k    rdS t          j        ||¦  «        d         }|dk     s||k    rdS |                     d¦  «        \  }}}	t          |¦  «        dk    rdS t          |¦  «        dk    rdS t          |	¦  «        dk    rdS 	 t          |¦  «        }t          |¦  «        }t          |	¦  «        }	n# t          $ r Y dS w xY w|d
k     s|dk    rdS |d
k     s|dk    rdS |	d
k     s|	dk    rdS dS )r/   Fé   ú r8   ú/r9   ú:é   é   r   é   é;   T)	r
   Ústrr=   ÚcountÚsplitr   Ú
ValueErrorÚcalendarÚ
monthrange)
r   ÚdateÚtimeÚyearÚmonthÚdayÚmonthMaxDayÚhourÚminuteÚseconds
             r   Ú$fontInfoOpenTypeHeadCreatedValidatorrb   ‘   s^  € õ
 �e�SÑ!Ô!ð Øˆuåˆu‰:Œ:˜ÒÐØˆuØ‡{‚{�3ÑÔ˜1ÒÐØˆuØ—’˜SÑ!Ô!�J€Dˆ$Ø‡z‚z�#�„˜!ÒÐØˆuØ‡z‚z�#�„˜!ÒÐØˆuà—z’z #‘”Ñ€Dˆ%�Ý
ˆ4�y„y�A‚~€~ØˆuÝ
ˆ5�z„z�Q‚€ØˆuÝ
ˆ3�x„x�1‚}€}ØˆuðÝ�4‰yŒyˆÝ�E‘
”
ˆÝ�#‰hŒhˆˆøÝð ð ð Øˆuˆuðøøøàˆq‚y€y�E˜B’J�JØˆuÝÔ% d¨EÑ2Ô2°1Ô5€KØ
ˆQ‚w€w�#˜Ò#Ð#ØˆuàŸ:š: c™?œ?Ñ€Dˆ&�&Ý
ˆ4�y„y�A‚~€~ØˆuÝ
ˆ6�{„{�aÒÐØˆuÝ
ˆ6�{„{�aÒÐØˆuðÝ�4‰yŒyˆÝ�V‘”ˆÝ�V‘”ˆˆøÝð ð ð Øˆuˆuðøøøàˆa‚x€x�4˜"’9�9ØˆuØ�‚z€z�V˜b’[�[ØˆuØ�‚z€z�V˜b’[�[Øˆuàˆ4s$   Ã/-D Ä
D+Ä*D+Æ>-G, Ç,
G:Ç9G:c                 óÒ   — t          | t          ¦  «        sdS t          t          dft          dft          dft          dft          df¬¦  «        }| D ]}t          ||¦  «        s dS ŒdS )r7   FT)ÚnameIDÚ
platformIDÚ
encodingIDÚ
languageIDÚstring)r
   r   r>   r   rS   r-   )r   rB   Ú
nameRecords      r   Ú$fontInfoOpenTypeNameRecordsValidatorrj   Í   s†   € õ �e�TÑ"Ô"ð ØˆuÝÝ�Tˆ{Ý˜�;Ý˜�;Ý˜�;Ý�Tˆ{ðñ ô €Mð ð ð ˆ
Ý# J°Ñ>Ô>ð 	Ø�5�5ð	àˆ4r   c                 óD   — t          | t          ¦  «        sdS | dk     rdS dS )r/   Fr   Tr!   r"   s    r   Ú'fontInfoOpenTypeOS2WeightClassValidatorrl   à   r$   r   c                 óT   — t          | t          ¦  «        sdS | dk     rdS | dk    rdS dS )r/   Fr8   é	   Tr!   r"   s    r   Ú&fontInfoOpenTypeOS2WidthClassValidatorro   ë   s<   € õ �e�SÑ!Ô!ð ØˆuØˆq‚y€yØˆuØˆq‚y€yØˆuØˆ4r   c                 ó¦   — t          | t          t          f¦  «        sdS t          | ¦  «        dk    rdS | D ]}t          |t          ¦  «        s dS ŒdS )z
    Version 2.
    Fé
   T©r
   r   r   r=   r   ©r   r   s     r   Ú*fontInfoVersion2OpenTypeOS2PanoseValidatorrt   ø   si   € õ �f�t¥U˜mÑ,Ô,ð ØˆuÝ
ˆ6�{„{�bÒÐØˆuØð ð ˆÝ˜%¥Ñ%Ô%ð 	Ø�5�5ð	ð ˆ4r   c                 ó¸   — t          | t          t          f¦  «        sdS t          | ¦  «        dk    rdS | D ]#}t          |t          ¦  «        s dS |dk     r dS Œ$dS )r7   Frq   r   Trr   rs   s     r   Ú*fontInfoVersion3OpenTypeOS2PanoseValidatorrv     sy   € õ �f�t¥U˜mÑ,Ô,ð ØˆuÝ
ˆ6�{„{�bÒÐØˆuØð ð ˆÝ˜%¥Ñ%Ô%ð 	Ø�5�5Ø�1Š9ˆ9Ø�5�5ð ð ˆ4r   c                 óè   — t          | t          t          f¦  «        sdS t          | ¦  «        dk    rdS | D ]}t          |t          ¦  «        s dS Œ| \  }}|dk     s|dk    rdS |dk     s|dk    rdS dS )r/   Fr9   r   é   é   Trr   )r   r   ÚclassIDÚ
subclassIDs       r   Ú'fontInfoOpenTypeOS2FamilyClassValidatorr|     s�   € õ �f�t¥U˜mÑ,Ô,ð ØˆuÝ
ˆ6�{„{�aÒÐØˆuØð ð ˆÝ˜%¥Ñ%Ô%ð 	Ø�5�5ð	à Ñ€GˆZØ�‚{€{�g ’l�lØˆuØ�A‚~€~˜ bš˜ØˆuØˆ4r   c                 óÎ   — t          | t          t          f¦  «        sdS t          | ¦  «        dk    rdS t          | ¦  «        dz  rdS | D ]}t          |t          ¦  «        s dS ŒdS )r/   Frx   r9   T©r
   r   r   r=   r   rs   s     r   Ú fontInfoPostscriptBluesValidatorr   +  ó~   € õ �f�t¥U˜mÑ,Ô,ð ØˆuÝ
ˆ6�{„{�RÒÐØˆuÝ
ˆ6�{„{�Q�ð ØˆuØð ð ˆÝ˜%¥Ñ-Ô-ð 	Ø�5�5ð	àˆ4r   c                 óÎ   — t          | t          t          f¦  «        sdS t          | ¦  «        dk    rdS t          | ¦  «        dz  rdS | D ]}t          |t          ¦  «        s dS ŒdS )r/   Frq   r9   Tr~   rs   s     r   Ú%fontInfoPostscriptOtherBluesValidatorr‚   ;  r€   r   c                 ó¦   — t          | t          t          f¦  «        sdS t          | ¦  «        dk    rdS | D ]}t          |t          ¦  «        s dS ŒdS )r/   FrP   Tr~   rs   s     r   Ú fontInfoPostscriptStemsValidatorr„   K  sg   € õ �f�t¥U˜mÑ,Ô,ð ØˆuÝ
ˆ6�{„{�RÒÐØˆuØð ð ˆÝ˜%¥Ñ-Ô-ð 	Ø�5�5ð	àˆ4r   c                 óL   — t          t          dd¦  «        ¦  «        }| |vrdS dS )r/   r8   é   FT)r   Úrange)r   r   s     r   Ú.fontInfoPostscriptWindowsCharacterSetValidatorrˆ   Y  s.   € õ •u˜Q ‘|”|Ñ$Ô$€KØ�KÐÐØˆuØˆ4r   c                 óX   — t          t          df¬¦  «        }t          | |¦  «        sdS dS )r7   T)ÚidF)r>   rS   r-   ©r   rB   s     r   Ú%fontInfoWOFFMetadataUniqueIDValidatorrŒ   c  s4   € õ �S $˜KÐ(Ñ(Ô(€MÝ  }Ñ5Ô5ð ØˆuØˆ4r   c                 óª   — t           dft           dft           dft           dfdœ}t          | |¦  «        sdS d| v r|                      d¦  «        dvrdS dS )r7   TF)ÚnameÚurlÚdirÚclassr�   ©ÚltrÚrtl©rS   r-   Úgetr‹   s     r   Ú#fontInfoWOFFMetadataVendorValidatorr—   m  sn   € õ
 �d�Ý�Uˆ|Ý�Uˆ|Ý�u�ð	ð €Mõ    }Ñ5Ô5ð ØˆuØ�€~€~˜%Ÿ)š) EÑ*Ô*°.Ð@Ð@ØˆuØˆ4r   c                 óT  — t          t          df¬¦  «        }t          | |¦  «        sdS t          | d         ¦  «        sdS t          dft          dft          dft          dft          dfdœ}| d         D ]3}t          ||¦  «        s dS d|v r|                     d¦  «        dvr dS Œ4dS )r7   T)ÚcreditsFr™   )rŽ   r�   Úroler�   r‘   r�   r’   )r>   r   r-   r=   rS   r–   )r   rB   Úcredits      r   Ú$fontInfoWOFFMetadataCreditsValidatorrœ   ~  sÓ   € õ ¥$¨ Ð.Ñ.Ô.€MÝ  }Ñ5Ô5ð ØˆuÝˆu�YÔÑ Ô ð Øˆuå�d�Ý�Uˆ|Ý�e�Ý�Uˆ|Ý�u�ðð €Mð ˜	Ô"ð ð ˆÝ# F¨MÑ:Ô:ð 	Ø�5�5Ø�Fˆ?ˆ?˜vŸzšz¨%Ñ0Ô0¸ÐFÐFØ�5�5øØˆ4r   c                 ó¢   — t          t          dft          df¬¦  «        }t          | |¦  «        sdS | d         D ]}t	          |¦  «        s dS ŒdS )r7   FT)r�   Útextrž   ©r>   rS   r   r-   ÚfontInfoWOFFMetadataTextValue©r   rB   rž   s      r   Ú(fontInfoWOFFMetadataDescriptionValidatorr¢   –  si   € õ �c 5˜\µ°t°Ð=Ñ=Ô=€MÝ  }Ñ5Ô5ð ØˆuØ�f”ð ð ˆÝ,¨TÑ2Ô2ð 	Ø�5�5ð	àˆ4r   c                 óº   — t          t          dft          dft          df¬¦  «        }t          | |¦  «        sdS d| v r| d         D ]}t	          |¦  «        s dS ŒdS )r7   F)r�   rž   rŠ   rž   TrŸ   r¡   s      r   Ú$fontInfoWOFFMetadataLicenseValidatorr¤   £  sx   € õ �c 5˜\µ°u°Å3ÈÀ,ÐOÑOÔO€MÝ  }Ñ5Ô5ð ØˆuØ�€€Ø˜&”Mð 	ð 	ˆDÝ0°Ñ6Ô6ð Ø�u�uðàˆ4r   c                 ó’   — t          t          df¬¦  «        }t          | |¦  «        sdS | d         D ]}t          |¦  «        s dS ŒdS ©r7   T)rž   Frž   ©r>   r   r-   r    r¡   s      r   Ú&fontInfoWOFFMetadataTrademarkValidatorr¨   ±  óc   € õ �t T˜lÐ+Ñ+Ô+€MÝ  }Ñ5Ô5ð ØˆuØ�f”ð ð ˆÝ,¨TÑ2Ô2ð 	Ø�5�5ð	àˆ4r   c                 ó’   — t          t          df¬¦  «        }t          | |¦  «        sdS | d         D ]}t          |¦  «        s dS ŒdS r¦   r§   r¡   s      r   Ú&fontInfoWOFFMetadataCopyrightValidatorr«   ¾  r©   r   c                 óš   — t           dft           dft           dfdœ}t          | |¦  «        sdS d| v r|                      d¦  «        dvrdS dS )r7   TF)rŽ   r�   r‘   r�   r’   r•   r‹   s     r   Ú%fontInfoWOFFMetadataLicenseeValidatorr­   Ë  s_   € õ " 4˜[µ#°u°ÍÈeÈÐUÐU€MÝ  }Ñ5Ô5ð ØˆuØ�€~€~˜%Ÿ)š) EÑ*Ô*°.Ð@Ð@ØˆuØˆ4r   c                 óª   — t           dft           dft           dft           dfdœ}t          | |¦  «        sdS d| v r|                      d¦  «        dvrdS dS ©r7   TF)rž   Úlanguager�   r‘   r�   r’   r•   r‹   s     r   r    r    ×  ón   € õ
 �d�Ý˜%�LÝ�Uˆ|Ý�u�ð	ð €Mõ    }Ñ5Ô5ð ØˆuØ�€~€~˜%Ÿ)š) EÑ*Ô*°.Ð@Ð@ØˆuØˆ4r   c                 ój   — t          | t          ¦  «        sdS | sdS | D ]}t          |¦  «        s dS ŒdS )r7   FT)r
   r   Ú&fontInfoWOFFMetadataExtensionValidator)r   Ú	extensions     r   Ú'fontInfoWOFFMetadataExtensionsValidatorrµ   è  sX   € õ �e�TÑ"Ô"ð ØˆuØð ØˆuØð ð ˆ	Ý5°iÑ@Ô@ð 	Ø�5�5ð	àˆ4r   c                 óô   — t          t          dft          dft          df¬¦  «        }t          | |¦  «        sdS d| v r| d         D ]}t	          |¦  «        s dS Œ| d         D ]}t          |¦  «        s dS ŒdS )r7   FT)Únamesr	   rŠ   r·   r	   )r>   r   rS   r-   Ú*fontInfoWOFFMetadataExtensionNameValidatorÚ*fontInfoWOFFMetadataExtensionItemValidator)r   rB   rŽ   Úitems       r   r³   r³   ö  s©   € õ ¥ e˜}µT¸4°LÅcÈ5À\ÐRÑRÔR€MÝ  }Ñ5Ô5ð ØˆuØ�%ÐÐØ˜'”Nð 	ð 	ˆDÝ=¸dÑCÔCð Ø�u�uðà�g”ð ð ˆÝ9¸$Ñ?Ô?ð 	Ø�5�5ð	àˆ4r   c                 óì   — t          t          dft          dft          df¬¦  «        }t          | |¦  «        sdS | d         D ]}t	          |¦  «        s dS Œ| d         D ]}t          |¦  «        s dS ŒdS )r7   FT)rŠ   r·   r   r·   r   )r>   rS   r   r-   r¸   Ú+fontInfoWOFFMetadataExtensionValueValidator)r   rB   rŽ   Úvals       r   r¹   r¹     sž   € õ �S %˜Lµ°t°ÅdÈDÀ\ÐRÑRÔR€MÝ  }Ñ5Ô5ð ØˆuØ�g”ð ð ˆÝ9¸$Ñ?Ô?ð 	Ø�5�5ð	à�XŒð ð ˆÝ:¸3Ñ?Ô?ð 	Ø�5�5ð	àˆ4r   c                 óª   — t           dft           dft           dft           dfdœ}t          | |¦  «        sdS d| v r|                      d¦  «        dvrdS dS r¯   r•   r‹   s     r   r¸   r¸     r±   r   c                 óª   — t           dft           dft           dft           dfdœ}t          | |¦  «        sdS d| v r|                      d¦  «        dvrdS dS r¯   r•   r‹   s     r   r¼   r¼   (  r±   r   c                 óè   — t          | t          ¦  «        sdS |€t          ¦   «         }| D ]G}t          |¦  «        s dS |                     d¦  «        }|�||v r dS |                     |¦  «         ŒHdS ©r7   FNÚ
identifierT)r
   r   r   ÚguidelineValidatorr–   Úadd)r   ÚidentifiersÚguiderÂ   s       r   ÚguidelinesValidatorrÇ   >  s‘   € õ �e�TÑ"Ô"ð ØˆuØÐÝ‘e”eˆØð (ð (ˆÝ! %Ñ(Ô(ð 	Ø�5�5Ø—Y’Y˜|Ñ,Ô,ˆ
ØÐ!Ø˜[Ð(Ð(Ø�u�uØ�OŠO˜JÑ'Ô'Ð'øØˆ4r   F)ÚxÚyÚanglerŽ   ÚcolorrÂ   c                 ó¢  — t          | t          ¦  «        sdS |                      d¦  «        }|                      d¦  «        }|                      d¦  «        }|€|€dS |�|€|�dS |�|�|€dS |�|dk     rdS |dk    rdS |                      d¦  «        }|�t          |¦  «        sdS |                      d	¦  «        }|�t	          |¦  «        sdS d
S )r7   FrÈ   rÉ   rÊ   Nr   ih  rÂ   rË   T)r-   Ú_guidelineDictPrototyper–   ÚidentifierValidatorÚcolorValidator)r   rÈ   rÉ   rÊ   rÂ   rË   s         r   rÃ   rÃ   [  sù   € õ   Õ'>Ñ?Ô?ð ØˆuØ�	Š	�#‰Œ€AØ�	Š	�#‰Œ€AØ�IŠI�gÑÔ€Eà€y�Q�YØˆuà€y�A�IØÐØ�5à€}˜˜¨5¨=ØˆuàÐØ�1Š9ˆ9Ø�5Ø�3Š;ˆ;Ø�5à—’˜<Ñ(Ô(€JØÐÕ&9¸*Ñ&EÔ&EÐØˆuà�IŠI�gÑÔ€EØÐ¥°Ñ!6Ô!6ÐØˆuØˆ4r   c                 óè   — t          | t          ¦  «        sdS |€t          ¦   «         }| D ]G}t          |¦  «        s dS |                     d¦  «        }|�||v r dS |                     |¦  «         ŒHdS rÁ   )r
   r   r   ÚanchorValidatorr–   rÄ   )r   rÅ   ÚanchorrÂ   s       r   ÚanchorsValidatorrÓ   „  s‘   € õ �e�TÑ"Ô"ð ØˆuØÐÝ‘e”eˆØð (ð (ˆÝ˜vÑ&Ô&ð 	Ø�5�5Ø—Z’Z Ñ-Ô-ˆ
ØÐ!Ø˜[Ð(Ð(Ø�u�uØ�OŠO˜JÑ'Ô'Ð'øØˆ4r   )rÈ   rÉ   rŽ   rË   rÂ   c                 ó4  — t          | t          ¦  «        sdS |                      d¦  «        }|                      d¦  «        }|�|€dS |                      d¦  «        }|�t          |¦  «        sdS |                      d¦  «        }|�t	          |¦  «        sdS dS )r7   FrÈ   rÉ   NrÂ   rË   T)r-   Ú_anchorDictPrototyper–   rÎ   rÏ   )r   rÈ   rÉ   rÂ   rË   s        r   rÑ   rÑ      s    € õ   Õ';Ñ<Ô<ð ØˆuØ�	Š	�#‰Œ€AØ�	Š	�#‰Œ€Aà€y�A�IØˆuà—’˜<Ñ(Ô(€JØÐÕ&9¸*Ñ&EÔ&EÐØˆuà�IŠI�gÑÔ€EØÐ¥°Ñ!6Ô!6ÐØˆuØˆ4r   c                 ó´   — d}d}t          | t          ¦  «        sdS | sdS t          | ¦  «        dk    rdS | D ] }t          |¦  «        }||k     s||k    r dS Œ!dS )z›
    Version 3+.

    >>> identifierValidator("a")
    True
    >>> identifierValidator("")
    False
    >>> identifierValidator("a" * 101)
    False
    é    é~   Féd   T)r
   rS   r=   Úord)r   ÚvalidCharactersMinÚvalidCharactersMaxÚcs       r   rÎ   rÎ   »  sŒ   € ð ÐØÐÝ�e�SÑ!Ô!ð ØˆuØð ØˆuÝ
ˆ5�z„z�CÒÐØˆuØð ð ˆÝ�‰FŒFˆØÐ!Ò!Ð! QÐ);Ò%;Ð%;Ø�5�5ð &<àˆ4r   c                 ó|  — t          | t          ¦  «        sdS |                      d¦  «        }t          |¦  «        dk    rdS |D ]w}|                     ¦   «         }d}	 t          |¦  «        }d}n# t          $ r Y nw xY w|s#	 t          |¦  «        }d}n# t          $ r Y nw xY w|s dS |dk     r dS |dk    r dS ŒxdS )a  
    Version 3+.

    >>> colorValidator("0,0,0,0")
    True
    >>> colorValidator(".5,.5,.5,.5")
    True
    >>> colorValidator("0.5,0.5,0.5,0.5")
    True
    >>> colorValidator("1,1,1,1")
    True

    >>> colorValidator("2,0,0,0")
    False
    >>> colorValidator("0,2,0,0")
    False
    >>> colorValidator("0,0,2,0")
    False
    >>> colorValidator("0,0,0,2")
    False

    >>> colorValidator("1r,1,1,1")
    False
    >>> colorValidator("1,1g,1,1")
    False
    >>> colorValidator("1,1,1b,1")
    False
    >>> colorValidator("1,1,1,1a")
    False

    >>> colorValidator("1 1 1 1")
    False
    >>> colorValidator("1 1,1,1")
    False
    >>> colorValidator("1,1 1,1")
    False
    >>> colorValidator("1,1,1 1")
    False

    >>> colorValidator("1, 1, 1, 1")
    True
    Fú,rO   Tr   r8   )r
   rS   rU   r=   Ústripr   rV   Úfloat)r   ÚpartsÚpartÚ	converteds       r   rÏ   rÏ   Ú  s  € õV �e�SÑ!Ô!ð ØˆuØ�KŠK˜ÑÔ€EÝ
ˆ5�z„z�Q‚€ØˆuØð ð ˆØ�zŠz‰|Œ|ˆØˆ	ð	Ý�t‘9”9ˆDØˆIˆIøÝð 	ð 	ð 	ØˆDð	øøøàð 	ðÝ˜T‘{”{�Ø �	�	øÝð ð ð Ø�ðøøøàð 	Ø�5�5Ø�!Š8ˆ8Ø�5�5Ø�!Š8ˆ8Ø�5�5ð àˆ4s$   ÁA/Á/
A<Á;A<ÂBÂ
B!Â B!s   ‰PNG

T)ÚfileNameÚxScaleÚxyScaleÚyxScaleÚyScaleÚxOffsetÚyOffsetrË   c                 ó˜   — t          | t          ¦  «        sdS | d         sdS |                      d¦  «        }|�t          |¦  «        sdS dS )r7   Frå   rË   NT)r-   Ú_imageDictPrototyper–   rÏ   )r   rË   s     r   ÚimageValidatorrî   3  s\   € õ   Õ':Ñ;Ô;ð Øˆuà�Ôð Øˆuà�IŠI�gÑÔ€EØÐ¥°Ñ!6Ô!6ÐØˆuØˆ4r   c                 óJ  — | €|€|€J ‚| �>t          | d¦  «        5 }|                     d¦  «        }ddd¦  «         n# 1 swxY w Y   nM|�|dd…         }n@|�>|                     ¦   «         }|                     d¦  «        }|                     |¦  «         |t          k    rdS dS )zG
    Version 3+.

    This checks the signature of the image data.
    NÚrbé   )Fz,Image does not begin with the PNG signature.©TN)r   ÚreadÚtellÚseekÚpngSignature)ÚpathÚdataÚfileObjÚfÚ	signatureÚposs         r   ÚpngValidatorrý   C  sñ   € ð Ð˜tÐ/°7Ð3FÐ3FÐ3FØÐÝ�$˜ÑÔð 	" ØŸš˜q™	œ	ˆIð	"ð 	"ð 	"ñ 	"ô 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"øøøð 	"ð 	"ð 	"ð 	"øà	Ð	Ø˜˜!˜”Hˆ	ˆ	Ø	Ð	Ø�lŠl‰nŒnˆØ—L’L ‘O”Oˆ	Ø�Š�SÑÔÐØ•LÒ Ð ØDÐDØˆ:s   ›=½AÁAc                 óR  — t          |t          j        j        ¦  «        r|}nt          j                             |¦  «        }d}t          | t          ¦  «        sd|fS t          ¦   «         }t          ¦   «         }i }| D �]}t          |t          ¦  «        sd|fc S t          |¦  «        dk    sd|fc S |D ]}t          |t          ¦  «        sd|fc c S Œ |\  }	}
|
dk    r|
 
                    d¦  «        s	dd|
z  fc S t          |	¦  «        dk    r dS |                     |
¦  «        s	dd	|
z  fc S |	d
k    r	|
dk    r dS |	|v r	dd|	z  fc S |                     |	¦  «         |
|v r	dd|
z  fc S |                     |
¦  «         |
||	<   �Œd|                     ¦   «         v }|sdS dS )zD
    Check the validity of layercontents.plist.
    Version 3+.
    z1layercontents.plist in not in the correct format.Fr9   Úglyphszglyphs.z3Invalid directory name (%s) in layercontents.plist.r   )Fz(Empty layer name in layercontents.plist.z A glyphset does not exist at %s.zpublic.default)FzIThe name public.default is being used by a layer that is not the default.z1The layer name %s is used by more than one layer.z0The directory %s is used by more than one layer.)Fz1The required default glyph set is not in the UFO.rò   )r
   ÚfsÚbaseÚFSÚosfsÚOSFSr   r   r=   rS   Ú
startswithÚexistsrÄ   r   )r   ÚufoPathOrFileSystemÚ
fileSystemÚbogusFileMessageÚusedLayerNamesÚusedDirectoriesÚcontentsÚentryÚiÚ	layerNameÚdirectoryNameÚfoundDefaults               r   ÚlayerContentsValidatorr  ]  sv  € õ
 Ð%¥r¤w¤zÑ2Ô2ð 7Ø(ˆ
ˆ
å”W—\’\Ð"5Ñ6Ô6ˆ
àJÐå�e�TÑ"Ô"ð 'ØÐ&Ð&Ð&å‘U”U€NÝ‘e”e€OØ€HØð +,ñ +,ˆå˜%¥Ñ&Ô&ð 	+ØÐ*Ð*Ð*Ð*Ð*Ý�5‰zŒz˜QŠˆØÐ*Ð*Ð*Ð*Ð*Øð 	/ð 	/ˆAÝ˜a¥Ñ%Ô%ð /ØÐ.Ð.Ð.Ð.Ð.Ð.Ð.ð/à#(Ñ ˆ	�=à˜HÒ$Ð$Ø ×+Ò+¨IÑ6Ô6ð àØIØ#ñ$ðð ð ð õ
 ˆy‰>Œ>˜QÒÐØDÐDÐDà× Ò  Ñ/Ô/ð 	MØÐ<¸}ÑLÐLÐLÐLÐLàÐ(Ò(Ð(¨]¸hÒ-FÐ-Fðð ð ð
 ˜Ð&Ð&àØCÀiÑOðð ð ð ð 	×Ò˜9Ñ%Ô%Ð%Ø˜OÐ+Ð+àØBÀ]ÑRðð ð ð ð 	×Ò˜MÑ*Ô*Ð*à+ˆ�ÑÑà˜xŸšÑ0Ô0Ð0€LØð JØIÐIØˆ:r   c                 ó\  — d}t          | ¦  «        sd|fS i }i }|                      ¦   «         D ]ý\  }}t          |t          ¦  «        sd|fc S t          |t          t
          f¦  «        sd|fc S |s dS |                     d¦  «        r¡|                     d¦  «        s|                     d¦  «        sŒ‡t          d¦  «        t          |¦  «        k    r dS |                     d¦  «        r|}n|}|D ]6}t          |t          ¦  «        sdd	|z  fc c S ||v rdd
|z  fc c S |||<   Œ7ŒþdS )aª  
    Check the validity of the groups.
    Version 3+ (though it's backwards compatible with UFO 1 and UFO 2).

    >>> groups = {"A" : ["A", "A"], "A2" : ["A"]}
    >>> groupsValidator(groups)
    (True, None)

    >>> groups = {"" : ["A"]}
    >>> valid, msg = groupsValidator(groups)
    >>> valid
    False
    >>> print(msg)
    A group has an empty name.

    >>> groups = {"public.awesome" : ["A"]}
    >>> groupsValidator(groups)
    (True, None)

    >>> groups = {"public.kern1." : ["A"]}
    >>> valid, msg = groupsValidator(groups)
    >>> valid
    False
    >>> print(msg)
    The group data contains a kerning group with an incomplete name.
    >>> groups = {"public.kern2." : ["A"]}
    >>> valid, msg = groupsValidator(groups)
    >>> valid
    False
    >>> print(msg)
    The group data contains a kerning group with an incomplete name.

    >>> groups = {"public.kern1.A" : ["A"], "public.kern2.A" : ["A"]}
    >>> groupsValidator(groups)
    (True, None)

    >>> groups = {"public.kern1.A1" : ["A"], "public.kern1.A2" : ["A"]}
    >>> valid, msg = groupsValidator(groups)
    >>> valid
    False
    >>> print(msg)
    The glyph "A" occurs in too many kerning groups.
    z,The group data is not in the correct format.F)FzA group has an empty name.zpublic.zpublic.kern1.zpublic.kern2.zpublic.kernN.)Fz@The group data contains a kerning group with an incomplete name.z-The group data %s contains an invalid member.z1The glyph "%s" occurs in too many kerning groups.rò   )r   r	   r
   rS   r   r   r  r=   )r   ÚbogusFormatMessageÚfirstSideMappingÚsecondSideMappingÚ	groupNameÚ	glyphListÚdÚ	glyphNames           r   ÚgroupsValidatorr  §  s×  € ðX HÐÝ˜ÑÔð )ØÐ(Ð(Ð(ØÐØÐØ %§¢¡¤ð ")ð ")Ñˆ	�9Ý˜)¥cÑ+Ô+ð 	-ØÐ,Ð,Ð,Ð,Ð,Ý˜)¥d­E ]Ñ3Ô3ð 	-ØÐ,Ð,Ð,Ð,Ð,Øð 	7Ø6Ð6Ð6Ø×Ò 	Ñ*Ô*ð 	)Ø×'Ò'¨Ñ8Ô8ð 
À×AUÒAUØñBô Bð 
ð å�Ñ'Ô'­3¨y©>¬>Ò9Ð9ðð ð ð ×#Ò# OÑ4Ô4ð &Ø$��à%�Ø&ð )ð )�	Ý! )­SÑ1Ô1ð àØGÈ)ÑSðð ð ð ð ð ð  �>�>àØKÈiÑWðð ð ð ð ð ð  )��)‘�øØˆ:r   c                 ó„  — d}t          | t          ¦  «        sd|fS |                      ¦   «         D ]�\  }}t          |t          ¦  «        sd|fc S t          |t          ¦  «        sd|fc S |                     ¦   «         D ]?\  }}t          |t          ¦  «        sd|fc c S t          |t          ¦  «        sd|fc c S Œ@Œ�dS )aA  
    Check the validity of the kerning data structure.
    Version 3+ (though it's backwards compatible with UFO 1 and UFO 2).

    >>> kerning = {"A" : {"B" : 100}}
    >>> kerningValidator(kerning)
    (True, None)

    >>> kerning = {"A" : ["B"]}
    >>> valid, msg = kerningValidator(kerning)
    >>> valid
    False
    >>> print(msg)
    The kerning data is not in the correct format.

    >>> kerning = {"A" : {"B" : "100"}}
    >>> valid, msg = kerningValidator(kerning)
    >>> valid
    False
    >>> print(msg)
    The kerning data is not in the correct format.
    z.The kerning data is not in the correct format.Frò   )r
   r   r	   rS   r   )rø   r  ÚfirstÚ
secondDictra   r   s         r   ÚkerningValidatorr    s  € ð. JÐÝ�d�GÑ$Ô$ð )ØÐ(Ð(Ð(Ø!ŸZšZ™\œ\ð 	1ð 	1ÑˆˆzÝ˜%¥Ñ%Ô%ð 	-ØÐ,Ð,Ð,Ð,Ð,Ý˜J­Ñ0Ô0ð 	-ØÐ,Ð,Ð,Ð,Ð,Ø'×-Ò-Ñ/Ô/ð 	1ð 	1‰MˆF�EÝ˜f¥cÑ*Ô*ð 1ØÐ0Ð0Ð0Ð0Ð0Ð0Ð0Ý ¥{Ñ3Ô3ð 1ØÐ0Ð0Ð0Ð0Ð0Ð0Ð0ð1ð	1ð
 ˆ:r   z-The lib data is not in the correct format: %sc                 ó  — t          | ¦  «        s#dt          | ¦  «        j        z  }dt          |z  fS |                      ¦   «         D ]¸\  }} t          |t          ¦  «        sddt          |¦  «        j        ›d|›�fc S |dk    rzd}t          | t          t          f¦  «        s dt          | ¦  «        j        z  }d||z  fc S | D ]9}t          |t          ¦  «        s"dt          |¦  «        j        z  }d||z  fc c S Œ:Œ¹d	S )
aÎ  
    Check the validity of the lib.
    Version 3+ (though it's backwards compatible with UFO 1 and UFO 2).

    >>> lib = {"foo" : "bar"}
    >>> fontLibValidator(lib)
    (True, None)

    >>> lib = {"public.awesome" : "hello"}
    >>> fontLibValidator(lib)
    (True, None)

    >>> lib = {"public.glyphOrder" : ["A", "C", "B"]}
    >>> fontLibValidator(lib)
    (True, None)

    >>> lib = "hello"
    >>> valid, msg = fontLibValidator(lib)
    >>> valid
    False
    >>> print(msg)  # doctest: +ELLIPSIS
    The lib data is not in the correct format: expected a dictionary, ...

    >>> lib = {1: "hello"}
    >>> valid, msg = fontLibValidator(lib)
    >>> valid
    False
    >>> print(msg)
    The lib key is not properly formatted: expected str, found int: 1

    >>> lib = {"public.glyphOrder" : "hello"}
    >>> valid, msg = fontLibValidator(lib)
    >>> valid
    False
    >>> print(msg)  # doctest: +ELLIPSIS
    public.glyphOrder is not properly formatted: expected list or tuple,...

    >>> lib = {"public.glyphOrder" : ["A", 1, "B"]}
    >>> valid, msg = fontLibValidator(lib)
    >>> valid
    False
    >>> print(msg)  # doctest: +ELLIPSIS
    public.glyphOrder is not properly formatted: expected str,...
    úexpected a dictionary, found %sFz;The lib key is not properly formatted: expected str, found z: zpublic.glyphOrderz/public.glyphOrder is not properly formatted: %sz expected list or tuple, found %szexpected str, found %srò   )	r   ÚtypeÚ__name__Ú_bogusLibFormatMessager	   r
   rS   r   r   )r   Úreasonr)   ÚbogusGlyphOrderMessager  s        r   ÚfontLibValidatorr'  1  sR  € õZ ˜ÑÔð 6Ø2µT¸%±[´[Ô5IÑIˆØÕ,¨vÑ5Ð5Ð5Ø—k’k‘m”mð Bð B‰
ˆˆUÝ˜#�sÑ#Ô#ð 	Ø�5å˜‘9”9Ô%Ð%Ð% s sð,ðð ð ð ð
 Ð%Ò%Ð%Ø%VÐ"Ý˜e¥d­E ]Ñ3Ô3ð >Ø;½dÀ5¹k¼kÔ>RÑR�ØÐ4°vÑ=Ð=Ð=Ð=Ð=Ø"ð Bð B�	Ý! )­SÑ1Ô1ð BØ5½¸Y¹¼Ô8PÑP�FØ Ð"8¸6Ñ"AÐAÐAÐAÐAÐAÐAðBøð ˆ:r   c                 ó  — t          | ¦  «        s#dt          | ¦  «        j        z  }dt          |z  fS |                      ¦   «         D ]E\  }} t          |t          ¦  «        sd|z  }dt          |z  fc S |dk    rt          | ¦  «        s dS ŒFdS )a,  
    Check the validity of the lib.
    Version 3+ (though it's backwards compatible with UFO 1 and UFO 2).

    >>> lib = {"foo" : "bar"}
    >>> glyphLibValidator(lib)
    (True, None)

    >>> lib = {"public.awesome" : "hello"}
    >>> glyphLibValidator(lib)
    (True, None)

    >>> lib = {"public.markColor" : "1,0,0,0.5"}
    >>> glyphLibValidator(lib)
    (True, None)

    >>> lib = {"public.markColor" : 1}
    >>> valid, msg = glyphLibValidator(lib)
    >>> valid
    False
    >>> print(msg)
    public.markColor is not properly formatted.
    r!  Fzkey (%s) should be a stringzpublic.markColor)Fz+public.markColor is not properly formatted.rò   )r   r"  r#  r$  r	   r
   rS   rÏ   )r   r%  r)   s      r   ÚglyphLibValidatorr)  y  s´   € õ0 ˜ÑÔð 6Ø2µT¸%±[´[Ô5IÑIˆØÕ,¨vÑ5Ð5Ð5Ø—k’k‘m”mð Lð L‰
ˆˆUÝ˜#�sÑ#Ô#ð 	:Ø2°SÑ8ˆFØÕ0°6Ñ9Ð9Ð9Ð9Ð9àÐ$Ò$Ð$Ý! %Ñ(Ô(ð LØKÐKÐKøØˆ:r   Ú__main__)N)NNN)EÚ__doc__rW   Úior   Úfs.baser   Úfs.osfsÚcollections.abcr   ÚfontTools.ufoLib.utilsr   r   r   r   r#   r&   r-   r5   rI   rb   rj   rl   ro   rt   rv   r|   r   r‚   r„   rˆ   rŒ   r—   rœ   r¢   r¤   r¨   r«   r­   r    rµ   r³   r¹   r¸   r¼   rÇ   r>   r   rá   rS   rÍ   rÃ   rÓ   rÕ   rÑ   rÎ   rÏ   rö   rí   rî   rý   r  r  r  r$  r'  r)  r#  ÚdoctestÚtestmodr3   r   r   ú<module>r3     s{  ðØ (Ð (à €€€Ø Ð Ð Ð Ð Ð Ø €€€Ø €€€à #Ð #Ð #Ð #Ð #Ð #Ø .Ð .Ð .Ð .Ð .Ð .ð
ð 
ð 
ð"ð "ð "ðð ð ð ð ð ðð ð ðð ð ðDð ð ðð ð ð89ð 9ð 9ðxð ð ð&ð ð ð
ð 
ð 
ðð ð ðð ð ð"ð ð ð&ð ð ð ð ð ð ð ð ðð ð ðð ð ðð ð ð"ð ð ð0
ð 
ð 
ðð ð ð
ð 
ð 
ð
ð 
ð 
ð	ð 	ð 	ðð ð ð"ð ð ðð ð ð"ð ð ð ð ð ð"ð ð ð,ð ð ð ð& ˜$ØˆU€|�UÐØˆU€|�UÐØ�ˆ<˜Ð
Ø
ˆuˆØ�ˆ,Ø�Uˆ|ðñ ô Ð ð!ð !ð !ðRð ð ð ð& �tØˆU€|�UÐØˆU€|�UÐØ
ˆuˆØ�ˆ,Ø�Uˆ|ðñ ô Ð ðð ð ð6ð ð ð>Dð Dð DðV $€à�dØ�4ˆ[Ø�%ˆL˜%Ð Ø�5ˆ\˜5Ð!Ø�5ˆ\˜5Ð!Ø�%ˆL˜%Ð Ø�5ˆ\˜5Ð!Ø�5ˆ\˜5Ð!Ø�ˆ,ð	ñ 	ô 	Ð ðð ð ð ð ð ð ð4Bð Bð BðTTð Tð Tðx$ð $ð $ðV IÐ ð@ð @ð @ðP#ð #ð #ðL ˆzÒÐØ€N€N€Nà€G„OÑÔÐÐÐð Ðr   