Ë
    ÚÍ:j÷|  ã                  óv  — U d Z ddlmZ ddlZddlmZmZ ddlmZ ddl	m
c mZ ddlmZmZmZmZ ddlmZ ddlmZ eeeeeeee   d	f   f   ef   f   ZdFd
„ZdGd„ZdHd„ZdFd„ZdFd„Z dId„Z!dFd„Z"dFd„Z#dFd„Z$dFd„Z%dFd„Z&dFd„Z'dJd„Z(dJd„Z)dJd„Z*dJd„Z+dJd„Z,dJd„Z-dFd„Z.dFd„Z/dFd„Z0dFd „Z1dFd!„Z2dFd"„Z3dFd#„Z4dFd$„Z5dFd%„Z6dFd&„Z7dFd'„Z8dFd(„Z9dFd)„Z:dFd*„Z;dFd+„Z<dKdLd,„Z= ee>e?fd-fe>e?fd-fe>e?fd-fed-fed-fed-f¬.«      Z@deAd/<   dFd0„ZBdKdLd1„ZC ee>e?fd-fe>e?fd-fed-fed-fed-f¬2«      ZDdeAd3<   dFd4„ZEdFd5„ZFdFd6„ZGd7ZHd8eAd9<    ee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e>e?fd-fed-f¬;«      ZIdeAd<<   d=„ ZJ	 	 	 dM	 	 	 	 	 	 	 dNd>„ZK	 	 	 	 	 	 dOd?„ZLdPd@„ZMdQdA„ZNdBZOdPdC„ZPdPdD„ZQeRdEk(  rddlSZS eSj¨                  «        yy)Rz"Various low level data validators.é    )ÚannotationsN)ÚMappingÚSequence)Úopen)ÚAnyÚTypeÚOptionalÚUnion)ÚIntFloat)ÚnumberTypes.c                óP   — t        | t        «      rydD ]  }t        | |«      rŒ y y)zY
    Some objects will likely come in that aren't
    dicts but are dict-ish enough.
    T)ÚkeysÚvaluesÚitemsF)Ú
isinstancer   Úhasattr)ÚvalueÚattrs     úp/home/mcse/projects/srt_converter/srt-converter-venv/lib/python3.12/site-packages/fontTools/ufoLib/validators.pyÚisDictEnoughr      s2   € ô
 �%œÔ!ØØ+ò ˆÜ�u˜dÕ#Ùðð ó    c                ó   — t        | |«      S )ú(
    Generic. (Added at version 2.)
    )r   )r   Útyps     r   ÚgenericTypeValidatorr   #   s   € ô �e˜SÓ!Ð!r   c                óœ   — t        | t        t        f«      syt        | «      }t        |«      }||z
  ry| D ]  }t        |t        «      rŒ y y)r   FT)r   ÚlistÚtupleÚsetÚint)r   ÚvalidValuesÚ	valuesSetÚvalidValuesSetr   s        r   ÚgenericIntListValidatorr$   *   sT   € ô �fœt¤U˜mÔ,ØÜ�F“€IÜ˜Ó%€NØ�>Ò!ØØò ˆÜ˜%¤Õ%Ùðð r   c                ó2   — t        | t        «      sy| dk  ryy©ú(
    Generic. (Added at version 3.)
    Fr   T©r   r    ©r   s    r   ÚgenericNonNegativeIntValidatorr*   :   ó   € ô �eœSÔ!ØØˆq‚yØØr   c                ó2   — t        | t        «      sy| dk  ryyr&   )r   r   r)   s    r   Ú!genericNonNegativeNumberValidatorr-   E   s   € ô �eœ[Ô)ØØˆq‚yØØr   ÚGenericDictc                ó
  — t        | t        «      sy|j                  «       D ]  \  }\  }}|sŒ|| vsŒ y | j                  «       D ]  }||vsŒ y | j                  «       D ]   \  }}||   \  }}|€|sŒt        ||«      rŒ  y y)r'   FT)r   r   r   r   )r   Ú	prototypeÚkeyr   ÚrequiredÚvÚprototypeTypes          r   ÚgenericDictValidatorr5   P   s¨   € ô
 �eœWÔ%Øà )§¡Ó 1ò Ñˆ‰_ˆc�8ÙØØ�eÒÙð	ð �z‰z‹|ò ˆØ�iÒÙðð —+‘+“-ò ‰ˆˆQØ"+¨C¡.Ñˆ�xØˆ9™XØÜ˜!˜]Õ+Ùðð r   c                ó   — g d¢}| |v S )ú
    Version 2+.
    )ÚregularÚitalicÚboldzbold italic© )r   Úoptionss     r   Ú"fontInfoStyleMapStyleNameValidatorr=   r   s   € ò ;€GØ�GÐÐr   c                ó>  — t        | t        «      syt        | «      dk(  ryg d¢}t        t        dft        df¬«      }g }| D ]J  }t        ||«      s y|d   }|d   }t        |«      }|s yt        ||«      }|s y|j                  |«       ŒL |t        |«      k7  ryy)ú
    Version 3+.
    Fr   T)r   é   é   é   )ÚrangeMaxPPEMÚrangeGaspBehaviorrC   rD   )
r   r   ÚlenÚdictr    r5   r*   r$   ÚappendÚsorted)	r   ÚvalidBehaviorsÚdictPrototypeÚ	ppemOrderÚrangeRecordÚppemÚbehaviorÚppemValidityÚbehaviorValiditys	            r   Ú)fontInfoOpenTypeGaspRangeRecordsValidatorrQ   z   s¹   € ô �eœTÔ"ØÜ
ˆ5ƒz�Q‚ØÚ!€NÜ!%Ü˜4�[´T¸4°Lô"€Mð €IØò ˆÜ# K°Ô?ÙØ˜>Ñ*ˆØÐ2Ñ3ˆÜ5°dÓ;ˆÙÙÜ2°8¸^ÓLÐÙÙØ×Ñ˜Õðð ”F˜9Ó%Ò%ØØr   c                óV  — t        | t        «      syt        | «      dk(  sy| j                  d«      dk7  ry| j	                  d«      \  }}|j                  d«      dk7  ry|j                  d«      dk7  ry|j	                  d«      \  }}}t        |«      dk7  ryt        |«      dk7  ryt        |«      dk7  ry	 t        |«      }t        |«      }t        |«      }|dk  s|d	kD  ryt        j                  ||«      d   }	|dk  s||	kD  ry|j	                  d«      \  }
}}t        |
«      dk7  ryt        |«      dk7  ryt        |«      dk7  ry	 t        |
«      }t        |«      }t        |«      }|d
k  s|dkD  ry|d
k  s|dkD  ry|d
k  s|dkD  ryy# t        $ r Y yw xY w# t        $ r Y yw xY w)r7   Fé   ú r@   ú/rA   ú:é   é   r   é   é;   T)	r   ÚstrrE   ÚcountÚsplitr    Ú
ValueErrorÚcalendarÚ
monthrange)r   ÚstrDateÚstrTimeÚstrYearÚstrMonthÚstrDayÚintYearÚintMonthÚintDayÚmonthMaxDayÚstrHourÚ	strMinuteÚ	strSecondÚintHourÚ	intMinuteÚ	intSeconds                   r   Ú$fontInfoOpenTypeHeadCreatedValidatorrp   ˜   sÉ  € ô
 �eœSÔ!Øäˆu‹:˜ÒØØ‡{�{�3Ó˜1ÒØØ—{‘{ 3Ó'Ñ€GˆWØ‡}�}�SÓ˜QÒØØ‡}�}�SÓ˜QÒØà '§¡¨cÓ 2Ñ€GˆX�vÜ
ˆ7ƒ|�qÒØÜ
ˆ8ƒ}˜ÒØÜ
ˆ6ƒ{�aÒØðÜ�g“,ˆÜ�x“=ˆÜ�V“ˆð �!‚|�x "’}ØÜ×%Ñ% g¨xÓ8¸Ñ;€KØ�‚z�V˜kÒ)Øà$+§M¡M°#Ó$6Ñ!€GˆY˜	Ü
ˆ7ƒ|�qÒØÜ
ˆ9ƒ~˜ÒØÜ
ˆ9ƒ~˜ÒØðÜ�g“,ˆÜ˜	“Nˆ	Ü˜	“Nˆ	ð �‚{�g ’lØØ�1‚}˜	 BšØØ�1‚}˜	 BšØàøô9 ò Ùðûô& ò Ùðús$   Â7!F Å
!F Æ	FÆFÆ	F(Æ'F(c                ó¬   — t        | t        «      syt        t        dft        dft        dft        dft        df¬«      }| D ]  }t        ||«      rŒ y y)r?   FT)ÚnameIDÚ
platformIDÚ
encodingIDÚ
languageIDÚstring)r   r   rF   r    r[   r5   )r   rJ   Ú
nameRecords      r   Ú$fontInfoOpenTypeNameRecordsValidatorrx   Ô   sa   € ô �eœTÔ"ØÜ!%Ü�Tˆ{Ü˜�;Ü˜�;Ü˜�;Ü�Tˆ{ô"€Mð ò ˆ
Ü# J°Õ>Ùðð r   c                ó2   — t        | t        «      sy| dk  ryy)r7   Fr   Tr(   r)   s    r   Ú'fontInfoOpenTypeOS2WeightClassValidatorrz   ç   r+   r   c                ó>   — t        | t        «      sy| dk  ry| dkD  ryy)r7   Fr@   é	   Tr(   r)   s    r   Ú&fontInfoOpenTypeOS2WidthClassValidatorr}   ò   s(   € ô �eœSÔ!ØØˆq‚yØØˆq‚yØØr   c                ó‚   — t        | t        t        f«      syt        | «      dk7  ry| D ]  }t        |t        «      rŒ y y)z
    Version 2.
    Fé
   T©r   r   r   rE   r    ©r   r   s     r   Ú*fontInfoVersion2OpenTypeOS2PanoseValidatorr‚   ÿ   sE   € ô �fœt¤U˜mÔ,ØÜ
ˆ6ƒ{�bÒØØò ˆÜ˜%¤Õ%Ùðð r   c                ó�   — t        | t        t        f«      syt        | «      dk7  ry| D ]  }t        |t        «      s y|dk  sŒ y y)r?   Fr   r   Tr€   r�   s     r   Ú*fontInfoVersion3OpenTypeOS2PanoseValidatorr„     sO   € ô �fœt¤U˜mÔ,ØÜ
ˆ6ƒ{�bÒØØò ˆÜ˜%¤Ô%ÙØ�1‹9Ùð	ð r   c                ó¸   — t        | t        t        f«      syt        | «      dk7  ry| D ]  }t        |t        «      rŒ y | \  }}|dk  s|dkD  ry|dk  s|dkD  ryy)r7   FrA   r   é   é   Tr€   )r   r   ÚclassIDÚ
subclassIDs       r   Ú'fontInfoOpenTypeOS2FamilyClassValidatorrŠ     so   € ô �fœt¤U˜mÔ,ØÜ
ˆ6ƒ{�aÒØØò ˆÜ˜%¤Õ%Ùðð !Ñ€GˆZØ�‚{�g ’lØØ�A‚~˜ bšØØr   c                ó    — t        | t        t        f«      syt        | «      dkD  ryt        | «      dz  ry| D ]  }t        |t        «      rŒ y y)r7   Fr†   rA   T©r   r   r   rE   r   r�   s     r   Ú fontInfoPostscriptBluesValidatorr�   2  óS   € ô �fœt¤U˜mÔ,ØÜ
ˆ6ƒ{�RÒØÜ
ˆ6ƒ{�Q‚ØØò ˆÜ˜%¤Õ-Ùðð r   c                ó    — t        | t        t        f«      syt        | «      dkD  ryt        | «      dz  ry| D ]  }t        |t        «      rŒ y y)r7   Fr   rA   TrŒ   r�   s     r   Ú%fontInfoPostscriptOtherBluesValidatorr�   B  rŽ   r   c                ó‚   — t        | t        t        f«      syt        | «      dkD  ry| D ]  }t        |t        «      rŒ y y)r7   FrX   TrŒ   r�   s     r   Ú fontInfoPostscriptStemsValidatorr’   R  sE   € ô �fœt¤U˜mÔ,ØÜ
ˆ6ƒ{�RÒØØò ˆÜ˜%¤Õ-Ùðð r   c                ó8   — t        t        dd«      «      }| |vryy)r7   r@   é   FT)r   Úrange)r   r!   s     r   Ú.fontInfoPostscriptWindowsCharacterSetValidatorr–   `  s"   € ô ”u˜Q “|Ó$€KØ�KÑØØr   c                óB   — t        t        df¬«      }t        | |«      syy)r?   T)ÚidF)rF   r[   r5   ©r   rJ   s     r   Ú%fontInfoWOFFMetadataUniqueIDValidatorrš   j  s"   € ô "&¬#¨t¨Ô!5€MÜ  }Ô5ØØr   c                óŒ   — t         dft         dft         dft         dfdœ}t        | |«      syd| v r| j                  d«      dvryy)r?   TF)ÚnameÚurlÚdirÚclassrž   ©ÚltrÚrtl©r[   r5   Úgetr™   s     r   Ú#fontInfoWOFFMetadataVendorValidatorr¥   t  sS   € ô
 �d�Ü�Uˆ|Ü�Uˆ|Ü�u�ñ	"€Mô    }Ô5ØØ��~˜%Ÿ)™) EÓ*°.Ñ@ØØr   c                ó  — t        t        df¬«      }t        | |«      syt        | d   «      syt        dft        dft        dft        dft        dfdœ}| d   D ]*  }t        ||«      s yd|v sŒ|j                  d«      dvsŒ* y y)r?   T)ÚcreditsFr§   )rœ   r�   Úrolerž   rŸ   rž   r    )rF   r   r5   rE   r[   r¤   )r   rJ   Úcredits      r   Ú$fontInfoWOFFMetadataCreditsValidatorrª   …  s›   € ô "&¬t°T¨lÔ!;€MÜ  }Ô5ØÜˆu�YÑÔ Øä�d�Ü�Uˆ|Ü�e�Ü�Uˆ|Ü�u�ñ€Mð ˜	Ñ"ò ˆÜ# F¨MÔ:ÙØ�FŠ?˜vŸz™z¨%Ó0¸ÒFÙð	ð
 r   c                ó~   — t        t        dft        df¬«      }t        | |«      sy| d   D ]  }t	        |«      rŒ y y)r?   FT)r�   Útextr¬   ©rF   r[   r   r5   ÚfontInfoWOFFMetadataTextValue©r   rJ   r¬   s      r   Ú(fontInfoWOFFMetadataDescriptionValidatorr°   �  sH   € ô "&¬3°¨,¼dÀD¸\Ô!J€MÜ  }Ô5ØØ�f‘ò ˆÜ,¨TÕ2Ùðð r   c                ó”   — t        t        dft        dft        df¬«      }t        | |«      syd| v r| d   D ]  }t	        |«      rŒ y y)r?   F)r�   r¬   r˜   r¬   Tr­   r¯   s      r   Ú$fontInfoWOFFMetadataLicenseValidatorr²   ª  sZ   € ô "&Ü�%ˆL¤ e˜}´#°u°ô"€Mô    }Ô5ØØ��Ø˜&‘Mò 	ˆDÜ0°Õ6Ùð	ð r   c                óp   — t        t        df¬«      }t        | |«      sy| d   D ]  }t        |«      rŒ y y©r?   T)r¬   Fr¬   ©rF   r   r5   r®   r¯   s      r   Ú&fontInfoWOFFMetadataTrademarkValidatorr¶   º  óB   € ô "&¬D°$¨<Ô!8€MÜ  }Ô5ØØ�f‘ò ˆÜ,¨TÕ2Ùðð r   c                óp   — t        t        df¬«      }t        | |«      sy| d   D ]  }t        |«      rŒ y yr´   rµ   r¯   s      r   Ú&fontInfoWOFFMetadataCopyrightValidatorr¹   Ç  r·   r   c                ó~   — t         dft         dft         dfdœ}t        | |«      syd| v r| j                  d«      dvryy)r?   TF)rœ   rž   rŸ   rž   r    r£   r™   s     r   Ú%fontInfoWOFFMetadataLicenseeValidatorr»   Ô  sL   € ô
 �d�Ü�Uˆ|Ü�u�ñ"€Mô
    }Ô5ØØ��~˜%Ÿ)™) EÓ*°.Ñ@ØØr   c                óŒ   — t         dft         dft         dft         dfdœ}t        | |«      syd| v r| j                  d«      dvryy©r?   TF)r¬   Úlanguagerž   rŸ   rž   r    r£   r™   s     r   r®   r®   ä  óS   € ô
 �d�Ü˜%�LÜ�Uˆ|Ü�u�ñ	"€Mô    }Ô5ØØ��~˜%Ÿ)™) EÓ*°.Ñ@ØØr   c                óT   — t        | t        «      sy| sy| D ]  }t        |«      rŒ y y)r?   FT)r   r   Ú&fontInfoWOFFMetadataExtensionValidator)r   Ú	extensions     r   Ú'fontInfoWOFFMetadataExtensionsValidatorrÃ   õ  s6   € ô �eœTÔ"ØÙØØò ˆ	Ü5°iÕ@Ùðð r   c                óÂ   — t        t        dft        dft        df¬«      }t        | |«      syd| v r| d   D ]  }t	        |«      rŒ y | d   D ]  }t        |«      rŒ y y)r?   FT)Únamesr   r˜   rÅ   r   )rF   r   r[   r5   Ú*fontInfoWOFFMetadataExtensionNameValidatorÚ*fontInfoWOFFMetadataExtensionItemValidator)r   rJ   rœ   Úitems       r   rÁ   rÁ     s{   € ô "&Ü�Uˆm¤D¨$ <´S¸%°Lô"€Mô    }Ô5ØØ�%ÑØ˜'‘Nò 	ˆDÜ=¸dÕCÙð	ð �g‘ò ˆÜ9¸$Õ?Ùðð r   c                óº   — t        t        dft        dft        df¬«      }t        | |«      sy| d   D ]  }t	        |«      rŒ y | d   D ]  }t        |«      rŒ y y)r?   FT)r˜   rÅ   r   rÅ   r   )rF   r[   r   r5   rÆ   Ú+fontInfoWOFFMetadataExtensionValueValidator)r   rJ   rœ   Úvals       r   rÇ   rÇ     ss   € ô "&Ü�ˆ<¤ d˜|´T¸4°Lô"€Mô    }Ô5ØØ�g‘ò ˆÜ9¸$Õ?Ùðð �X‰ò ˆÜ:¸3Õ?Ùðð r   c                óŒ   — t         dft         dft         dft         dfdœ}t        | |«      syd| v r| j                  d«      dvryy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yd| v r| j                  d«      dvryyr½   r£   r™   s     r   rÊ   rÊ   9  r¿   r   c                ó¼   — t        | t        «      sy|€
t        «       }| D ]:  }t        |«      s y|j	                  d«      }|€Œ$||v r y|j                  |«       Œ< y©r?   FÚ
identifierT)r   r   r   ÚguidelineValidatorr¤   Úadd)r   ÚidentifiersÚguiderÐ   s       r   ÚguidelinesValidatorrÕ   O  sh   € ô �eœTÔ"ØØÐÜ“eˆØò (ˆÜ! %Ô(ÙØ—Y‘Y˜|Ó,ˆ
ØÑ!Ø˜[Ñ(ÙØ�O‰O˜JÕ'ð(ð r   F)ÚxÚyÚanglerœ   ÚcolorrÐ   Ú_guidelineDictPrototypec                óà   — t        | t        «      sy| j                  d«      }|�|dk  ry|dkD  ry| j                  d«      }|�t        |«      sy| j                  d«      }|�t	        |«      syy)r?   FrØ   r   ih  rÐ   rÙ   T)r5   rÚ   r¤   ÚidentifierValidatorÚcolorValidator)r   rØ   rÐ   rÙ   s       r   rÑ   rÑ   l  sz   € ô   Ô'>Ô?Øà�I‰I�gÓ€EàÐØ�1Š9ØØ�3Š;Øà—‘˜<Ó(€JØÐÔ&9¸*Ô&EØà�I‰I�gÓ€EØÐ¤°Ô!6ØØr   c                ó¼   — t        | t        «      sy|€
t        «       }| D ]:  }t        |«      s y|j	                  d«      }|€Œ$||v r y|j                  |«       Œ< yrÏ   )r   r   r   ÚanchorValidatorr¤   rÒ   )r   rÓ   ÚanchorrÐ   s       r   ÚanchorsValidatorrá   Š  sh   € ô �eœTÔ"ØØÐÜ“eˆØò (ˆÜ˜vÔ&ÙØ—Z‘Z Ó-ˆ
ØÑ!Ø˜[Ñ(ÙØ�O‰O˜JÕ'ð(ð r   )rÖ   r×   rœ   rÙ   rÐ   Ú_anchorDictPrototypec                óð   — t        | t        «      sy| j                  d«      }| j                  d«      }|�|€y| j                  d«      }|�t        |«      sy| j                  d«      }|�t	        |«      syy)r?   FrÖ   r×   rÐ   rÙ   T)r5   râ   r¤   rÜ   rÝ   )r   rÖ   r×   rÐ   rÙ   s        r   rß   rß   ¦  sx   € ô   Ô';Ô<ØØ�	‰	�#‹€AØ�	‰	�#‹€Aà€y�A�IØà—‘˜<Ó(€JØÐÔ&9¸*Ô&EØà�I‰I�gÓ€EØÐ¤°Ô!6ØØr   c                óŽ   — d}d}t        | t        «      sy| syt        | «      dkD  ry| D ]  }t        |«      }||k  s||kD  sŒ y y)z›
    Version 3+.

    >>> identifierValidator("a")
    True
    >>> identifierValidator("")
    False
    >>> identifierValidator("a" * 101)
    False
    é    é~   Féd   T)r   r[   rE   Úord)r   ÚvalidCharactersMinÚvalidCharactersMaxÚcÚis        r   rÜ   rÜ   Á  sc   € ð ÐØÐÜ�eœSÔ!ØÙØÜ
ˆ5ƒz�CÒØØò ˆÜ�‹FˆØÐ!Ò! QÐ);Ó%;Ùðð r   c                ó8  — t        | t        «      sy| j                  d«      }t        |«      dk7  ry|D ]F  }|j	                  «       }d}	 t        |«      }d}|s	 t        |«      }d}|s ydcxk  rdk  rŒC y  y y# t        $ r Y Œ2w xY w# t        $ r Y Œ1w xY w)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ú,rW   Tr   r@   )r   r[   r]   rE   Ústripr    r^   Úfloat)r   ÚpartsÚpartÚ	convertedÚnumbers        r   rÝ   rÝ   à  sÄ   € ôV �eœSÔ!ØØ�K‰K˜Ó€EÜ
ˆ5ƒz�Q‚ØØò ˆØ�z‰z‹|ˆØˆ	ð	Ü˜“YˆFØˆIñ ðÜ˜t›�Ø �	ñ ÙØ�FÔ˜aÓÙð  Ùð%ð& øô ò 	Ùð	ûô ò Ùðús$   Á
A>ÁBÁ>	B
Â	B
Â	BÂBs   ‰PNG

ÚbytesÚpngSignatureT)ÚfileNameÚxScaleÚxyScaleÚyxScaleÚyScaleÚxOffsetÚyOffsetrÙ   Ú_imageDictPrototypec                óp   — t        | t        «      sy| d   sy| j                  d«      }|�t        |«      syy)r?   Fr÷   rÙ   T)r5   rþ   r¤   rÝ   )r   rÙ   s     r   ÚimageValidatorr   8  s>   € ô   Ô':Ô;Øà�ÒØà�I‰I�gÓ€EØÐ¤°Ô!6ØØr   c                ó
  — | €|€|€J ‚| �'t        | d«      5 }|j                  d«      }ddd«       n<|�|dd }n4|�2|j                  «       }|j                  d«      }|j                  |«       t        k7  ryy# 1 sw Y   ŒxY w)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Úseekrö   )ÚpathÚdataÚfileObjÚfÚ	signatureÚposs         r   ÚpngValidatorr  H  sœ   € ð Ð˜tÐ/°7Ð3FÐFÐFØÐÜ�$˜Óð 	" ØŸ™˜q›	ˆI÷	"ð 	"à	Ð	Ø˜˜!�H‰	Ø	Ð	Ø�l‰l‹nˆØ—L‘L “Oˆ	Ø�‰�SÔØ”LÒ ØDØ÷	"ð 	"ús   —A9Á9Bc                óè  — t        |t        j                  j                  «      r|}nt        j                  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        «      rŒd|fc c S  |\  }	}
|
dk7  r|
j                  d«      s	dd|
z  fc S t        |	«      dk(  r y|j                  |
«      s	dd	|
z  fc S |	d
k(  r|
dk7  r y|	|v r	dd|	z  fc S |j                  |	«       |
|v r	dd|
z  fc S |j                  |
«       |
||	<   Œè d|j                  «       v }|syy)zD
    Check the validity of layercontents.plist.
    Version 3+.
    z1layercontents.plist in not in the correct format.FrA   Ú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   rE   r[   Ú
startswithÚexistsrÒ   r   )r   ÚufoPathOrFileSystemÚ
fileSystemÚbogusFileMessageÚusedLayerNamesÚusedDirectoriesÚcontentsÚentryrì   Ú	layerNameÚdirectoryNameÚfoundDefaults               r   ÚlayerContentsValidatorr"  f  sÂ  € ô Ð%¤r§w¡w§z¡zÔ2Ø(‰
ä—W‘W—\‘\Ð"5Ó6ˆ
àJÐä�eœTÔ"ØÐ&Ð&Ð&ä“U€NÜ“e€OØ€HØò +,ˆä˜%¤Ô&ØÐ*Ð*Ò*Ü�5‹z˜QŠØÐ*Ð*Ò*Øò 	/ˆAÜ˜a¤Õ%ØÐ.Ð.Ô.ð	/ð $)Ñ ˆ	�=à˜HÒ$Ø ×+Ñ+¨IÔ6àØIØ#ñ$ðò ô
 ˆy‹>˜QÒÙDà× Ñ  Ô/ØÐ<¸}ÑLÐLÒLàÐ(Ò(¨]¸hÒ-Fñð
 ˜Ñ&àØCÀiÑOðò ð 	×Ñ˜9Ô%Ø˜OÑ+àØBÀ]ÑRðò ð 	×Ñ˜MÔ*à+ˆ�ÒðW+,ðZ ˜xŸ™Ó0Ð0€LÙØIØr   c                óþ  — d}t        | «      sd|fS i }i }| j                  «       D ]Õ  \  }}t        |t        «      sd|fc S t        |t        t
        f«      sd|fc S |s y|j                  d«      sŒN|j                  d«      s|j                  d«      sŒqt        d«      t        |«      k(  r y|j                  d«      r|}n|}|D ]1  }t        |t        «      sdd	|z  fc c S ||v rdd
|z  fc c S |||<   Œ3 Œ× y)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   r[   r   r   r  rE   )r   ÚbogusFormatMessageÚfirstSideMappingÚsecondSideMappingÚ	groupNameÚ	glyphListÚdÚ	glyphNames           r   ÚgroupsValidatorr+  ²  s;  € ðX HÐÜ˜ÔØÐ(Ð(Ð(Ø')ÐØ(*ÐØ %§¡£ò ")Ñˆ	�9Ü˜)¤cÔ+ØÐ,Ð,Ò,Ü˜)¤d¬E ]Ô3ØÐ,Ð,Ò,ÙÙ6Ø×Ñ 	Õ*Ø×'Ñ'¨Ô8À×AUÑAUØôBð ä�Ó'¬3¨y«>Ò9ñð ×#Ñ# OÔ4Ø$‘à%�Ø&ò )�	Ü! )¬SÔ1àØGÈ)ÑSðô ð  ‘>àØKÈiÑWðô ð  )��)’ñ)ð/")ðF r   c                óH  — d}t        | t        «      sd|fS | j                  «       D ]y  \  }}t        |t        «      sd|fc S t        |t        «      sd|fc S |j                  «       D ]5  \  }}t        |t        «      sd|fc c S t        |t        «      rŒ/d|fc c S  Œ{ y)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   r[   r   )r	  r$  ÚfirstÚ
secondDictÚsecondr   s         r   ÚkerningValidatorr0    s´   € ð. JÐÜ�dœGÔ$ØÐ(Ð(Ð(Ø!ŸZ™Z›\ò 	1ÑˆˆzÜ˜%¤Ô%ØÐ,Ð,Ò,Ü˜J¬Ô0ØÐ,Ð,Ò,Ø'×-Ñ-Ó/ò 	1‰MˆF�EÜ˜f¤cÔ*ØÐ0Ð0Ô0Ü ¤{Õ3ØÐ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 | j	                  «       D ]­  \  }} t        |t        «      sddt        |«      j                  ›d|›�fc S |dk(  sŒ;d}t        | t        t        f«      s!dt        | «      j                  z  }d||z  fc S | D ]5  }t        |t        «      rŒdt        |«      j                  z  }d||z  fc c S  Œ¯ y	)
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   r[   r   r   )r   Úreasonr1   ÚbogusGlyphOrderMessager*  s        r   ÚfontLibValidatorr8  <  s  € ôZ ˜ÔØ2´T¸%³[×5IÑ5IÑIˆØÔ,¨vÑ5Ð5Ð5Ø—k‘k“mò B‰
ˆˆUÜ˜#œsÔ#Ùä˜“9×%Ó%¡sð,ðò ð
 Ð%Ó%Ø%VÐ"Ü˜e¤d¬E ]Ô3Ø;¼dÀ5»k×>RÑ>RÑR�ØÐ4°vÑ=Ð=Ò=Ø"ò B�	Ü! )¬SÕ1Ø5¼¸Y»×8PÑ8PÑP�FØ Ð"8¸6Ñ"AÐAÔAñBðBð  r   c                óú   — t        | «      s#dt        | «      j                  z  }dt        |z  fS | j	                  «       D ]:  \  }} t        |t        «      sd|z  }dt        |z  fc S |dk(  sŒ.t        | «      rŒ: y y)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.
    r2  Fzkey (%s) should be a stringzpublic.markColor)Fz+public.markColor is not properly formatted.r  )r   r3  r4  r5  r   r   r[   rÝ   )r   r6  r1   s      r   ÚglyphLibValidatorr:  „  sŠ   € ô0 ˜ÔØ2´T¸%³[×5IÑ5IÑIˆØÔ,¨vÑ5Ð5Ð5Ø—k‘k“mò L‰
ˆˆUÜ˜#œsÔ#Ø2°SÑ8ˆFØÔ0°6Ñ9Ð9Ò9àÐ$Ó$Ü! %Õ(ÙKðLð r   Ú__main__)r   r   ÚreturnÚbool)r   r   r   z	Type[Any]r<  r=  )r   r   r!   zSequence[int]r<  r=  )r   r   r0   r.   r<  r=  )r   r   r<  r=  )N)r   r   rÓ   zOptional[set[str]]r<  r=  )NNN)r  zOptional[str]r	  zOptional[bytes]r
  zOptional[Any]r<  ztuple[bool, Any])r   r   r  zUnion[str, fs.base.FS]r<  útuple[bool, Optional[str]])r   r   r<  r>  )r	  r   r<  r>  )UÚ__doc__Ú
__future__r   r_   Úcollections.abcr   r   Úior   ÚfontTools.misc.filesystemÚmiscÚ
filesystemr  Útypingr   r   r	   r
   ÚfontTools.annotationsr   ÚfontTools.ufoLib.utilsr   rF   r[   r   r3  r=  r.   r   r   r$   r*   r-   r5   r=   rQ   rp   rx   rz   r}   r‚   r„   rŠ   r�   r�   r’   r–   rš   r¥   rª   r°   r²   r¶   r¹   r»   r®   rÃ   rÁ   rÇ   rÆ   rÊ   rÕ   r    rð   rÚ   Ú__annotations__rÑ   rá   râ   rß   rÜ   rÝ   rö   rþ   r   r  r"  r+  r0  r5  r8  r:  r4  ÚdoctestÚtestmodr;   r   r   ú<module>rL     s»  ðÚ (å "ã ß -Ý ç &Ð &ß -Ó -å *Ý .à�3˜˜e D¨%°°S±	¸3°Ñ*?Ð$?Ñ@À$ÐFÑGÐGÑH€ó
ó"óó óóóDóó<9óxó&ó
óóó"ó&ó ó óóóó"ó0
óó 
ó
óó ó"óó&ó$ó"ô,ñ& (,ØˆU€|�UÐØˆU€|�UÐØ�ˆ<˜Ð
Ø
ˆuˆØ�ˆ,Ø�Uˆ|ô(Ð ˜ó óô<ñ& %)ØˆU€|�UÐØˆU€|�UÐØ
ˆuˆØ�ˆ,Ø�Uˆ|ô%Ð �kó óó6ó>CðT +€ˆeÓ *á#'Ø�4ˆ[Ø�%ˆL˜%Ð Ø�5ˆ\˜5Ð!Ø�5ˆ\˜5Ð!Ø�%ˆL˜%Ð Ø�5ˆ\˜5Ð!Ø�5ˆ\˜5Ð!Ø�ˆ,ô	$Ð �[ó 	òð" Ø Ø!ðØ
ðà
ðð ðð ó	ð<DØðDØ%;ðDàóDóXTóx$ðV IÐ ó@óP#ðL ˆzÒÛà€G‡O�OÕð r   