Ë
    £ehUx  ã                   ój  — 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 eCjˆ                  «        yy)>z"Various low level data validators.é    N)Úopen)ÚMapping)ÚnumberTypesc                 ó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     úY/var/www/skyplay_api_hub/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#   5   ó   € ô �eœSÔ!ØØˆq‚yØØr   c                 ó2   — t        | t        «      sy| dk  ryyr   )r
   r   r"   s    r   Ú!genericNonNegativeNumberValidatorr&   @   s   € ô �eœ[Ô)ØØˆq‚yØØr   c                 ó
  — 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   ÚgenericDictValidatorr-   K   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   Ú"fontInfoStyleMapStyleNameValidatorr5   m   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Ú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Ô"ØÜ
ˆ5ƒz�Q‚ØÚ!€NÜ¤s¨D kÄdÈDÀ\ÔR€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)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‹:˜ÒØØ‡{�{�3Ó˜1ÒØØ—‘˜SÓ!�J€Dˆ$Ø‡z�z�#ƒ˜!ÒØØ‡z�z�#ƒ˜!ÒØà—z‘z #“Ñ€Dˆ%�Ü
ˆ4ƒy�A‚~ØÜ
ˆ5ƒz�Q‚ØÜ
ˆ3ƒx�1‚}ØðÜ�4‹yˆÜ�E“
ˆÜ�#‹hˆð ˆq‚y�E˜B’JØÜ×%Ñ% d¨EÓ2°1Ñ5€KØ
ˆQ‚w�#˜Ò#ØàŸ:™: c›?Ñ€Dˆ&�&Ü
ˆ4ƒy�A‚~ØÜ
ˆ6ƒ{�aÒØÜ
ˆ6ƒ{�aÒØðÜ�4‹yˆÜ�V“ˆÜ�V“ˆð ˆa‚x�4˜"’9ØØ�‚z�V˜b’[ØØ�‚z�V˜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)r7   FT)ÚnameIDÚ
platformIDÚ
encodingIDÚ
languageIDÚstring)r
   r   r>   r   rS   r-   )r   rB   Ú
nameRecords      r   Ú$fontInfoOpenTypeNameRecordsValidatorrj   Í   sa   € ô �eœTÔ"ØÜÜ�Tˆ{Ü˜�;Ü˜�;Ü˜�;Ü�Tˆ{ô€Mð ò ˆ
Ü# J°Õ>Ùðð r   c                 ó2   — t        | t        «      sy| dk  ryy)r/   Fr   Tr!   r"   s    r   Ú'fontInfoOpenTypeOS2WeightClassValidatorrl   à   r$   r   c                 ó>   — t        | t        «      sy| dk  ry| dkD  ryy)r/   Fr8   é	   Tr!   r"   s    r   Ú&fontInfoOpenTypeOS2WidthClassValidatorro   ë   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   r=   r   ©r   r   s     r   Ú*fontInfoVersion2OpenTypeOS2PanoseValidatorrt   ø   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)r7   Frq   r   Trr   rs   s     r   Ú*fontInfoVersion3OpenTypeOS2PanoseValidatorrv     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)r/   Fr9   r   é   é   Trr   )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)r/   Frx   r9   T©r
   r   r   r=   r   rs   s     r   Ú fontInfoPostscriptBluesValidatorr   +  ó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)r/   Frq   r9   Tr~   rs   s     r   Ú%fontInfoPostscriptOtherBluesValidatorr‚   ;  r€   r   c                 ó‚   — t        | t        t        f«      syt        | «      dkD  ry| D ]  }t        |t        «      rŒ y y)r/   FrP   Tr~   rs   s     r   Ú fontInfoPostscriptStemsValidatorr„   K  sE   € ô �fœt¤U˜mÔ,ØÜ
ˆ6ƒ{�RÒØØò ˆÜ˜%¤Õ-Ùðð r   c                 ó8   — t        t        dd«      «      }| |vryy)r/   r8   é   FT)r   Úrange)r   r   s     r   Ú.fontInfoPostscriptWindowsCharacterSetValidatorrˆ   Y  s"   € ô ”u˜Q “|Ó$€KØ�KÑØØr   c                 óB   — t        t        df¬«      }t        | |«      syy)r7   T)ÚidF)r>   rS   r-   ©r   rB   s     r   Ú%fontInfoWOFFMetadataUniqueIDValidatorrŒ   c  s"   € ô œS $˜KÔ(€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)r7   TF)ÚnameÚurlÚdirÚclassr�   ©ÚltrÚrtl©rS   r-   Úgetr‹   s     r   Ú#fontInfoWOFFMetadataVendorValidatorr—   m  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)r7   T)ÚcreditsFr™   )rŽ   r�   Úroler�   r‘   r�   r’   )r>   r   r-   r=   rS   r–   )r   rB   Úcredits      r   Ú$fontInfoWOFFMetadataCreditsValidatorrœ   ~  s›   € ô ¤$¨ Ô.€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)r7   FT)r�   Útextrž   ©r>   rS   r   r-   ÚfontInfoWOFFMetadataTextValue©r   rB   rž   s      r   Ú(fontInfoWOFFMetadataDescriptionValidatorr¢   –  sH   € ô œc 5˜\´°t°Ô=€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)r7   F)r�   rž   rŠ   rž   TrŸ   r¡   s      r   Ú$fontInfoWOFFMetadataLicenseValidatorr¤   £  sU   € ô œc 5˜\´°u°Ä3ÈÀ,ÔO€MÜ  }Ô5ØØ��Ø˜&‘Mò 	ˆDÜ0°Õ6Ùð	ð r   c                 óp   — t        t        df¬«      }t        | |«      sy| d   D ]  }t        |«      rŒ y y©r7   T)rž   Frž   ©r>   r   r-   r    r¡   s      r   Ú&fontInfoWOFFMetadataTrademarkValidatorr¨   ±  óB   € ô œt T˜lÔ+€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)r7   TF)rŽ   r�   r‘   r�   r’   r•   r‹   s     r   Ú%fontInfoWOFFMetadataLicenseeValidatorr­   Ë  sF   € ô " 4˜[´#°u°ÌÈeÈÑ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©r7   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)r7   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)r7   FT)Únamesr	   rŠ   r·   r	   )r>   r   rS   r-   Ú*fontInfoWOFFMetadataExtensionNameValidatorÚ*fontInfoWOFFMetadataExtensionItemValidator)r   rB   rŽ   Úitems       r   r³   r³   ö  sv   € ô ¤ e˜}´T¸4°LÄcÈ5À\ÔR€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)r7   FT)rŠ   r·   r   r·   r   )r>   rS   r   r-   r¸   Ú+fontInfoWOFFMetadataExtensionValueValidator)r   rB   rŽ   Úvals       r   r¹   r¹     sn   € ô œS %˜L´°t°ÄdÈDÀ\ÔR€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¼   (  r±   r   c                 ó¼   — t        | t        «      sy|€
t        «       }| D ]:  }t        |«      s y|j	                  d«      }|€Œ$||v r y|j                  |«       Œ< y©r7   FÚ
identifierT)r
   r   r   ÚguidelineValidatorr–   Úadd)r   ÚidentifiersÚguiderÂ   s       r   ÚguidelinesValidatorrÇ   >  sh   € ô �eœTÔ"ØØÐÜ“eˆØò (ˆÜ! %Ô(ÙØ—Y‘Y˜|Ó,ˆ
ØÑ!Ø˜[Ñ(ÙØ�O‰O˜JÕ'ð(ð r   F)ÚxÚyÚanglerŽ   ÚcolorrÂ   c                 óJ  — t        | t        «      sy| j                  d«      }| j                  d«      }| j                  d«      }|€|€y|�|€|�y|�|�|€y|�|dk  ry|dkD  ry| j                  d«      }|�t        |«      sy| j                  d«      }|�t	        |«      syy	)
r7   FrÈ   rÉ   rÊ   r   ih  rÂ   rË   T)r-   Ú_guidelineDictPrototyper–   ÚidentifierValidatorÚcolorValidator)r   rÈ   rÉ   rÊ   rÂ   rË   s         r   rÃ   rÃ   [  sÂ   € ô   Ô'>Ô?ØØ�	‰	�#‹€AØ�	‰	�#‹€AØ�I‰I�gÓ€Eà€y�Q�YØà€y�A�IØÐØà€}˜˜¨5¨=ØàÐØ�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Â   c                 óð   — t        | t        «      sy| j                  d«      }| j                  d«      }|�|€y| j                  d«      }|�t        |«      sy| j                  d«      }|�t	        |«      syy)r7   FrÈ   rÉ   rÂ   rË   T)r-   Ú_anchorDictPrototyper–   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
   rS   r=   Úord)r   ÚvalidCharactersMinÚvalidCharactersMaxÚcs       r   rÎ   rÎ   »  sc   € ð ÐØÐÜ�eœSÔ!ØÙØÜ
ˆ5ƒz�CÒØØò ˆÜ�‹FˆØÐ!Ò! QÐ);Ó%;Ùðð r   c                 ó4  — t        | t        «      sy| j                  d«      }t        |«      dk7  ry|D ]D  }|j	                  «       }d}	 t        |«      }d}|s	 t        |«      }d}|s y|dk  r y|dkD  sŒD y y# t        $ r Y Œ0w xY w# t        $ r Y Œ/w 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ú,rO   Tr   r8   )r
   rS   rU   r=   Ústripr   rV   Úfloat)r   ÚpartsÚpartÚ	converteds       r   rÏ   rÏ   Ú  sÀ   € ôV �eœSÔ!ØØ�K‰K˜Ó€EÜ
ˆ5ƒz�Q‚ØØò ˆØ�z‰z‹|ˆØˆ	ð	Ü�t“9ˆDØˆIñ ðÜ˜T“{�Ø �	ñ ÙØ�!Š8ÙØ�!‹8Ùð'ð( øô ò 	Ùð	ûô ò Ùðús$   Á
A<ÁBÁ<	BÂBÂ	BÂBs   ‰PNG

T)ÚfileNameÚxScaleÚxyScaleÚyxScaleÚyScaleÚxOffsetÚyOffsetrË   c                 óp   — t        | t        «      sy| d   sy| j                  d«      }|�t        |«      syy)r7   Frå   rË   T)r-   Ú_imageDictPrototyper–   rÏ   )r   rË   s     r   ÚimageValidatorrî   3  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ÚseekÚpngSignature)ÚpathÚdataÚfileObjÚfÚ	signatureÚposs         r   ÚpngValidatorrý   C  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.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  ]  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
   rS   r   r   r  r=   )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	   rS   r   )rø   r  ÚfirstÚ
secondDictra   r   s         r   ÚkerningValidatorr    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
   rS   r   r   )r   Úreasonr)   ÚbogusGlyphOrderMessager  s        r   ÚfontLibValidatorr'  1  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.
    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 ˜ÔØ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__)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òxò&ò
òòò"ò&ò ò òòòò"ò0
òò
ò
ò	òò"òò"ò ò"ó,ñ& ØˆU€|�UÐØˆU€|�UÐØ�ˆ<˜Ð
Ø
ˆuˆØ�ˆ,Ø�Uˆ|ôÐ ò!óRñ& ØˆU€|�UÐØˆU€|�UÐØ
ˆuˆØ�ˆ,Ø�Uˆ|ôÐ òò6ò>DðV $€áØ�4ˆ[Ø�%ˆL˜%Ð Ø�5ˆ\˜5Ð!Ø�5ˆ\˜5Ð!Ø�%ˆL˜%Ð Ø�5ˆ\˜5Ð!Ø�5ˆ\˜5Ð!Ø�ˆ,ô	Ð òó ò4BòTTòx$ðV IÐ ò@òP#ðL ˆzÒÛà€G‡O�OÕð r   