§
    ‚Ûg>)  ã                   ó\   — d Z d	d„Zd„ Zd
d„Zd„ Zedk    rddlZ ej        ¦   «          dS dS )z
Conversion functions.
© c                 ór  — t          |¦  «        \  }}t          |                      ¦   «         ¦  «        D ]�\  }}||v r.||vr*|                     d¦  «        s|                     |¦  «         t          |                     ¦   «         ¦  «        D ]4}||v r.||vr*|                     d¦  «        s|                     |¦  «         Œ5ŒŽi }|D ]u}t          |                     ¦   «         ¦  «        t          |                     ¦   «         ¦  «        z   }	|                     dd¦  «        }
d|
z   }
t          |
|	¦  «        }
|
||<   Œvi }|D ]u}t          |                     ¦   «         ¦  «        t          |                     ¦   «         ¦  «        z   }	|                     dd¦  «        }
d|
z   }
t          |
|	¦  «        }
|
||<   Œvi }t          |                      ¦   «         ¦  «        D ]d\  }}|                     ||¦  «        }i }t          |                     ¦   «         ¦  «        D ] \  }}|                     ||¦  «        }|||<   Œ!|||<   Œet          |                     ¦   «         ¦  «        }|t          |                     ¦   «         ¦  «        z  }|D ]\  }}
t          ||         ¦  «        }|||
<   Œ ||t          ||¬¦  «        fS )Nzpublic.kern1.zpublic.kern2.ú@MMK_L_Ú ú@MMK_R_)Úside1Úside2)
ÚfindKnownKerningGroupsÚlistÚitemsÚ
startswithÚaddÚkeysÚreplaceÚmakeUniqueGroupNameÚgetÚdict)ÚkerningÚgroupsÚglyphSetÚfirstReferencedGroupsÚsecondReferencedGroupsÚfirstÚsecondsÚsecondÚfirstRenamedGroupsÚexistingGroupNamesÚnewNameÚsecondRenamedGroupsÚ
newKerningÚ
newSecondsÚvalueÚallRenamedGroupsÚoldNameÚgroups                     úQ/granary/edev/quantum/lib/python3.11/site-packages/fontTools/ufoLib/converters.pyÚ%convertUFO1OrUFO2KerningToUFO3Kerningr&      sù  € å4JÈ6Ñ4RÔ4RÑ1ÐÐ1å˜wŸ}š}™œÑ/Ô/ð 7ð 7‰ˆˆwØ�Fˆ?ˆ?˜u¨HÐ4Ð4Ø×#Ò# OÑ4Ô4ð 1Ø%×)Ò)¨%Ñ0Ô0Ð0Ý˜7Ÿ<š<™>œ>Ñ*Ô*ð 	7ð 	7ˆFØ˜ÐÐ F°(Ð$:Ð$:Ø×(Ò(¨Ñ9Ô9ð 7Ø*×.Ò.¨vÑ6Ô6Ð6øð	7ð
 ÐØ&ð 
,ð 
,ˆå! &§+¢+¡-¤-Ñ0Ô0µ4Ð8J×8OÒ8OÑ8QÔ8QÑ3RÔ3RÑRÐà—-’- 	¨2Ñ.Ô.ˆà! GÑ+ˆå% gÐ/AÑBÔBˆà$+Ð˜5Ñ!Ð!ØÐØ(ð 
.ð 
.ˆå! &§+¢+¡-¤-Ñ0Ô0µ4Ð8K×8PÒ8PÑ8RÔ8RÑ3SÔ3SÑSÐà—.’. ¨BÑ/Ô/ˆà! GÑ+ˆå% gÐ/AÑBÔBˆà&-Ð˜FÑ#Ð#à€JÝ˜wŸ}š}™œÑ/Ô/ð 'ð '‰ˆˆwØ"×&Ò& u¨eÑ4Ô4ˆØˆ
Ý! '§-¢-¡/¤/Ñ2Ô2ð 	'ð 	'‰MˆF�EØ(×,Ò,¨V°VÑ<Ô<ˆFØ!&ˆJ�vÑÐØ&ˆ
�5ÑÐõ Ð.×4Ò4Ñ6Ô6Ñ7Ô7ÐØ�Ð0×6Ò6Ñ8Ô8Ñ9Ô9Ñ9ÐØ,ð  ð  Ñˆ�Ý�V˜G”_Ñ%Ô%ˆØˆˆw‰ˆà�v�tÐ*<ÐDWÐXÑXÔXÐXÐXó    c                 óZ  — dg}dg}t          ¦   «         }t          ¦   «         }t          |                      ¦   «         ¦  «        D ]d}|D ].}|                     |¦  «        r|                     |¦  «          nŒ/|D ].}|                     |¦  «        r|                     |¦  «          nŒ/Œe||fS )aá  
    This will find kerning groups with known prefixes.
    In some cases not all kerning groups will be referenced
    by the kerning pairs. The algorithm for locating groups
    in convertUFO1OrUFO2KerningToUFO3Kerning will miss these
    unreferenced groups. By scanning for known prefixes
    this function will catch all of the prefixed groups.

    These are the prefixes and sides that are handled:
    @MMK_L_ - side 1
    @MMK_R_ - side 2

    >>> testGroups = {
    ...     "@MMK_L_1" : None,
    ...     "@MMK_L_2" : None,
    ...     "@MMK_L_3" : None,
    ...     "@MMK_R_1" : None,
    ...     "@MMK_R_2" : None,
    ...     "@MMK_R_3" : None,
    ...     "@MMK_l_1" : None,
    ...     "@MMK_r_1" : None,
    ...     "@MMK_X_1" : None,
    ...     "foo" : None,
    ... }
    >>> first, second = findKnownKerningGroups(testGroups)
    >>> sorted(first) == ['@MMK_L_1', '@MMK_L_2', '@MMK_L_3']
    True
    >>> sorted(second) == ['@MMK_R_1', '@MMK_R_2', '@MMK_R_3']
    True
    r   r   )Úsetr
   r   r   r   )r   ÚknownFirstGroupPrefixesÚknownSecondGroupPrefixesÚfirstGroupsÚsecondGroupsÚ	groupNameÚfirstPrefixÚsecondPrefixs           r%   r	   r	   A   sÙ   € ð>  )˜kÐØ )˜{ÐÝ‘%”%€KÝ‘5”5€LÝ˜&Ÿ+š+™-œ-Ñ(Ô(ð ð ˆ	Ø2ð 	ð 	ˆKØ×#Ò# KÑ0Ô0ð Ø—’ 	Ñ*Ô*Ð*Ø�ðð 5ð 	ð 	ˆLØ×#Ò# LÑ1Ô1ð Ø× Ò  Ñ+Ô+Ð+Ø�ðøð ˜Ð$Ð$r'   é    c                 óT   — | }|dk    rd||fz  }||v rt          | ||dz   ¦  «        S |S )Nr1   z%s%dé   )r   )ÚnameÚ
groupNamesÚcounterr   s       r%   r   r   p   sE   € à€GØ�‚{€{Ø˜G WÐ-Ñ-ˆà�*ÐÐÝ" 4¨°W¸q±[ÑAÔAÐAà€Nr'   c                  ó   — dS )a  
    No known prefixes.

    >>> testKerning = {
    ...     "A" : {
    ...         "A" : 1,
    ...         "B" : 2,
    ...         "CGroup" : 3,
    ...         "DGroup" : 4
    ...     },
    ...     "BGroup" : {
    ...         "A" : 5,
    ...         "B" : 6,
    ...         "CGroup" : 7,
    ...         "DGroup" : 8
    ...     },
    ...     "CGroup" : {
    ...         "A" : 9,
    ...         "B" : 10,
    ...         "CGroup" : 11,
    ...         "DGroup" : 12
    ...     },
    ... }
    >>> testGroups = {
    ...     "BGroup" : ["B"],
    ...     "CGroup" : ["C"],
    ...     "DGroup" : ["D"],
    ... }
    >>> kerning, groups, maps = convertUFO1OrUFO2KerningToUFO3Kerning(
    ...     testKerning, testGroups, [])
    >>> expected = {
    ...     "A" : {
    ...         "A": 1,
    ...         "B": 2,
    ...         "public.kern2.CGroup": 3,
    ...         "public.kern2.DGroup": 4
    ...     },
    ...     "public.kern1.BGroup": {
    ...         "A": 5,
    ...         "B": 6,
    ...         "public.kern2.CGroup": 7,
    ...         "public.kern2.DGroup": 8
    ...     },
    ...     "public.kern1.CGroup": {
    ...         "A": 9,
    ...         "B": 10,
    ...         "public.kern2.CGroup": 11,
    ...         "public.kern2.DGroup": 12
    ...     }
    ... }
    >>> kerning == expected
    True
    >>> expected = {
    ...     "BGroup": ["B"],
    ...     "CGroup": ["C"],
    ...     "DGroup": ["D"],
    ...     "public.kern1.BGroup": ["B"],
    ...     "public.kern1.CGroup": ["C"],
    ...     "public.kern2.CGroup": ["C"],
    ...     "public.kern2.DGroup": ["D"],
    ... }
    >>> groups == expected
    True

    Known prefixes.

    >>> testKerning = {
    ...     "A" : {
    ...         "A" : 1,
    ...         "B" : 2,
    ...         "@MMK_R_CGroup" : 3,
    ...         "@MMK_R_DGroup" : 4
    ...     },
    ...     "@MMK_L_BGroup" : {
    ...         "A" : 5,
    ...         "B" : 6,
    ...         "@MMK_R_CGroup" : 7,
    ...         "@MMK_R_DGroup" : 8
    ...     },
    ...     "@MMK_L_CGroup" : {
    ...         "A" : 9,
    ...         "B" : 10,
    ...         "@MMK_R_CGroup" : 11,
    ...         "@MMK_R_DGroup" : 12
    ...     },
    ... }
    >>> testGroups = {
    ...     "@MMK_L_BGroup" : ["B"],
    ...     "@MMK_L_CGroup" : ["C"],
    ...     "@MMK_L_XGroup" : ["X"],
    ...     "@MMK_R_CGroup" : ["C"],
    ...     "@MMK_R_DGroup" : ["D"],
    ...     "@MMK_R_XGroup" : ["X"],
    ... }
    >>> kerning, groups, maps = convertUFO1OrUFO2KerningToUFO3Kerning(
    ...     testKerning, testGroups, [])
    >>> expected = {
    ...     "A" : {
    ...         "A": 1,
    ...         "B": 2,
    ...         "public.kern2.CGroup": 3,
    ...         "public.kern2.DGroup": 4
    ...     },
    ...     "public.kern1.BGroup": {
    ...         "A": 5,
    ...         "B": 6,
    ...         "public.kern2.CGroup": 7,
    ...         "public.kern2.DGroup": 8
    ...     },
    ...     "public.kern1.CGroup": {
    ...         "A": 9,
    ...         "B": 10,
    ...         "public.kern2.CGroup": 11,
    ...         "public.kern2.DGroup": 12
    ...     }
    ... }
    >>> kerning == expected
    True
    >>> expected = {
    ...     "@MMK_L_BGroup": ["B"],
    ...     "@MMK_L_CGroup": ["C"],
    ...     "@MMK_L_XGroup": ["X"],
    ...     "@MMK_R_CGroup": ["C"],
    ...     "@MMK_R_DGroup": ["D"],
    ...     "@MMK_R_XGroup": ["X"],
    ...     "public.kern1.BGroup": ["B"],
    ...     "public.kern1.CGroup": ["C"],
    ...     "public.kern1.XGroup": ["X"],
    ...     "public.kern2.CGroup": ["C"],
    ...     "public.kern2.DGroup": ["D"],
    ...     "public.kern2.XGroup": ["X"],
    ... }
    >>> groups == expected
    True

    >>> from .validators import kerningValidator
    >>> kerningValidator(kerning)
    (True, None)

    Mixture of known prefixes and groups without prefixes.

    >>> testKerning = {
    ...     "A" : {
    ...         "A" : 1,
    ...         "B" : 2,
    ...         "@MMK_R_CGroup" : 3,
    ...         "DGroup" : 4
    ...     },
    ...     "BGroup" : {
    ...         "A" : 5,
    ...         "B" : 6,
    ...         "@MMK_R_CGroup" : 7,
    ...         "DGroup" : 8
    ...     },
    ...     "@MMK_L_CGroup" : {
    ...         "A" : 9,
    ...         "B" : 10,
    ...         "@MMK_R_CGroup" : 11,
    ...         "DGroup" : 12
    ...     },
    ... }
    >>> testGroups = {
    ...     "BGroup" : ["B"],
    ...     "@MMK_L_CGroup" : ["C"],
    ...     "@MMK_R_CGroup" : ["C"],
    ...     "DGroup" : ["D"],
    ... }
    >>> kerning, groups, maps = convertUFO1OrUFO2KerningToUFO3Kerning(
    ...     testKerning, testGroups, [])
    >>> expected = {
    ...     "A" : {
    ...         "A": 1,
    ...         "B": 2,
    ...         "public.kern2.CGroup": 3,
    ...         "public.kern2.DGroup": 4
    ...     },
    ...     "public.kern1.BGroup": {
    ...         "A": 5,
    ...         "B": 6,
    ...         "public.kern2.CGroup": 7,
    ...         "public.kern2.DGroup": 8
    ...     },
    ...     "public.kern1.CGroup": {
    ...         "A": 9,
    ...         "B": 10,
    ...         "public.kern2.CGroup": 11,
    ...         "public.kern2.DGroup": 12
    ...     }
    ... }
    >>> kerning == expected
    True
    >>> expected = {
    ...     "BGroup": ["B"],
    ...     "@MMK_L_CGroup": ["C"],
    ...     "@MMK_R_CGroup": ["C"],
    ...     "DGroup": ["D"],
    ...     "public.kern1.BGroup": ["B"],
    ...     "public.kern1.CGroup": ["C"],
    ...     "public.kern2.CGroup": ["C"],
    ...     "public.kern2.DGroup": ["D"],
    ... }
    >>> groups == expected
    True
    Nr   r   r'   r%   Útestr8   |   s   € € € r'   Ú__main__N)r   )r1   )Ú__doc__r&   r	   r   r8   Ú__name__ÚdoctestÚtestmodr   r'   r%   ú<module>r>      s“   ððð ð6Yð 6Yð 6Yð 6Yðr,%ð ,%ð ,%ð^	ð 	ð 	ð 	ðLð Lð Lð^ ˆzÒÐØ€N€N€Nà€G„OÑÔÐÐÐð Ðr'   