+
   E9Qkc                   s   R t ^ RIHt ^ RIHt ^ RIHt ^ RIHt ^ RIHt ^ RIt^ RIt^ RI	t	^ RI
t
^ RIt^ RIt^ RIHt ]! RR	4       ^ R
IHt ^ RIHt ]'       d   ^ RIHt ]P&                  ! R4      t]! ]R4      t]P.                  ! ^R7      R R l4       t]P.                  ! ^R7      R R l4       t]P.                  ! ^R7      R R l4       t]P.                  ! RR7      R R l4       t]P.                  ! RR7      R R l4       t]P.                  ! RR7      R R l4       t]P.                  ! RR7      R R l4       tR R ltR.R R  llt R! R" lt!R# R$ lt"R% R& lt# ! R' R(4      t$]%R)8X  d   ]PL                  ! ]PN                  R*7      t(]PS                  ]PT                  4       ]PW                  ](4       ^ RI,t,],PZ                  ! 4       w  t.t/]Pa                  R+]Pc                  4       4       ]Pa                  R,]Pc                  4       4       ]Pa                  R-]Pc                  4       4       ]Pd                  ! ].4       R# R# )/zFA module to find out which fonts are used by pango to render a string
)List)Tuple)Dict)Any)TYPE_CHECKINGN)require_versionPangoz1.0)r   )Gtkzibus-typing-boosterattr_fallback_new)Zmaxsizec                8    V ^8  d   QhR\         P                  /#    returnr   ZLabelformat   "2/usr/share/ibus-typing-booster/engine/itb_pango.py__annotate__r   4   s      syy     c                 s,    \         P                  ! 4       # )z3Create a reusable Gtk.Label, first call initializesr    r   r   _get_global_gtk_labelr   3   s     99;r   c                r	   r
   )r   ZContextr   r   r   r   r   9   s     7 75== 7r   c                 s2    \        4       P                  4       # )z7Create a reusable Pango.Context, first call initializes)r   Zget_pango_contextr   r   r   _get_global_pango_contextr   8   s     !"4466r   c                r	   r
   )r   Layoutr   r   r   r   r   >   s     5 5%,, 5r   c                 s>    \         P                  ! \        4       4      # )z6Create a reusable Pango.Layout, first call initializes)r   r   r   r   r   r   _get_global_pango_layoutr   =   s     <<1344r   c                0    V ^8  d   QhR\         R\         /# r   familyr   strr   r   r   r   r   L   s     " "# "# "r   c                |   Rp\         P                  ! R4      pV'       g   V#  V P                  RR4      p \        P                  ! W RR.\        P
                  RR7      pVP                  4       pV#   \         d7   p\        P                  R	Y$P                  P                  T4        R
p?T# R
p?i\        P                   d7   p\        P                  R	Y$P                  P                  T4        R
p?T# R
p?i\         d7   p\        P                  R	Y$P                  P                  T4        R
p?T# R
p?ii ; i)aM  Use Fontconfig to find the font file path for a given font family

Examples:

>>> get_font_file('Noto Color Emoji')
'/home/mfabian/.fonts/Noto-COLRv1.ttf'

>>> get_font_file('og-dcm-emoji')
'/home/mfabian/.fonts/og-dcm-emoji.ttf'

>>> get_font_file('This family does not exist.')
'/usr/share/fonts/dejavu-sans-fonts/DejaVuSans.ttf'

 fc-match-\---formatz%{file}utf-8stderrZencoding!Exception when calling %s: %s: %sNshutilwhichreplace
subprocesscheck_outputSTDOUTstripFileNotFoundErrorLOGGERwarning	__class____name__CalledProcessError	Exception)r   pathfc_match_binaryoutputerror   &    r   get_font_filer<   K   s"     Dll:.OIU+((/:y)Y0:0A0A29; ||~ K  I:&(@(@%	I 	I K (( I:&(@(@%	I 	I
 K  I:&(@(@%	I 	IKI<   AA2 2D;=+B..D;D;+C77D;D;+D66D;c                r   r   r   r   r   r   r   r   q   s      # # r   c                r   )zUse Fontconfig to find the supported languages by font family matched with fc-match

Examples:

>>> get_font_lang('Noto Color Emoji')
'und-zsye'
r   r    r!   r"   r#   z%{lang}r$   r%   r'   Nr(   )r   langr8   r9   r:   r;   r   get_font_langr?   p   s"    Dll:.OIU+((/:y)Y0:0A0A29; ||~ K  I:&(@(@%	I 	I K (( I:&(@(@%	I 	I
 K  I:&(@(@%	I 	IKIr=   c                r   r   	font_filer   r   r   r   r   r   r      s            r   c                sX   Rp\         P                  ! R4      pV'       g   V#  \        P                  ! VRV .\        P                  RR7      pVP                  4       pV#   \         d7   p\        P                  RY$P                  P                  T4        Rp?T# Rp?i\        P                   d7   p\        P                  RY$P                  P                  T4        Rp?T# Rp?i\         d7   p\        P                  RY$P                  P                  T4        Rp?T# Rp?ii ; i)a~  Use otfinfo to get the font version from a font file

Examples:

>>> get_font_version('/usr/share/fonts/google-noto-color-emoji-fonts/Noto-COLRv1.ttf')
'Version 2.048;GOOG;noto-emoji:20250612:c7a259fc809502bcb45d983f6a78f94dfceb1fbe'

>>> get_font_version('/usr/share/fonts/dejavu-sans-fonts/DejaVuSans.ttf')
'Version 2.37'

>>> get_font_version('/this-file-does-not-exist.ttf')
''
r   otfinfoz-vr$   r%   r'   N)r)   r*   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   )rA   versionotfinfo_binaryr9   r:   r;   r   get_font_versionrE      s    G\\),NH((.$	)J0:0A0A29; ,,. N  H:%'?'?	H 	H N (( H:%'?'?	H 	H
 N  H:%'?'?	H 	HNHs;   :A   D)++BD)3D)4+C%%D)2D)3+D$$D)c                sF    V ^8  d   QhR\         R\        \         ,          /# r@   )r   r    r   r   r   r   r      s     4 4s 4tCy 4r   c                s\   . p\         P                  ! R4      pV'       g   V#  \        P                  ! VRV .\        P                  RR7      p\
        P                  ! R4      pVP                  4        Fh  pVP                  VP                  4       4      pV'       g   K,  VP                  R4      pVP                  R4      pVR
9   g   KW  VP                  V4       Kj  	  V#   \         d7   p	\        P                  RY)P                  P                   T	4        R	p	?	T# R	p	?	i\        P"                   d7   p	\        P                  RY)P                  P                   T	4        R	p	?	T# R	p	?	i\$         d7   p	\        P                  RY)P                  P                   T	4        R	p	?	T# R	p	?	ii ; i)aV  Use otfinfo to get the OpenType tables in a font file

(Only those which are interesting for rendering emoji)

Examples:

>>> get_font_tables('/home/mfabian/.fonts/Noto-COLRv1.ttf')
['COLR']

>>> get_font_tables('/home/mfabian/.fonts/openmoji/OpenMoji-color-glyf_colr_1.ttf')
['COLR']

>>> get_font_tables('/home/mfabian/.fonts/openmoji/OpenMoji-black-glyf.ttf')
[]

# I do not have this font installed at the moment:
#
#>>> get_font_tables('/home/mfabian/.fonts/openmoji/OpenMoji-color-colr1_svg.ttf')
#['COLR', 'SVG']

>>> get_font_tables('/usr/share/fonts/dejavu-sans-fonts/DejaVuSans.ttf')
[]

rB   z-tr$   r%   z'\s*(?P<size>[0-9]+)\s+(?P<table>\S+)\s*Zsizetabler'   N)ZCBDTZCOLRZSVG)r)   r*   r,   r-   r.   reZcompileZ
splitlinesZmatchr/   Zgroupappendr0   r1   r2   r3   r4   r5   r6   )
rA   ZtablesrD   r9   ZpatternZlineZmatch_resultZ_sizerF   r:   s
   &         r   get_font_tablesrI      sw   8 F\\),NH((.$	)J0:0A0A29; **GH%%'D"==6L|$**62$**7333MM%( (  M  H:%'?'?	H 	H M (( H:%'?'?	H 	H
 M  H:%'?'?	H 	HMHsH   A7C"  &C" C" "F+-+DF+5F+6+E''F+4F+5+F&&F+c                s:    V ^8  d   QhR\         \        ,          /# r
   )r    r   r   r   r   r   r      s     > >$s) >r   c                 s    \        4       P                  4       p \        V  Uu. uF  qP                  4       NK  	  up4      # u upi )u  Return a list of the names of fonts available on the system

Examples:

“Sans”, “Serif”, and “Monospace” are not “real” fonts but should
always be available:

>>> 'Sans' in get_available_font_names()
True

>>> 'Serif' in get_available_font_names()
True

>>> 'Monospace' in get_available_font_names()
True

“Noto Sans” is a real font which is probably avaible on most systems:

>>> 'Noto Sans' in get_available_font_names()
True
)r   Zlist_familiesZsortedZget_name)Zfamiliesr   s     r   get_available_font_namesrJ      s7    0 *+99;H8<8??$8<==<s   Ac                s    V ^8  d   QhR\         R\         R\        R\        \        \         \        \         \
        3,          3,          ,          /# )r   fonttextfallbackr   )r   boolr    r   r   r   r   r   r   r   r     sJ     D DDD(,D8<U3SRUXCV=W8XDr   c                s|   . p\         '       g   VRR/3.# VP                  RRR7      p\        4       p\        P                  ! V 4      pVP                  V4       \        P                  ! 4       p\        P                  ! V4      pVP                  V4       VP                  V4       VP                  V4       VP                  ^ 4      p	V	P                  p
V
 EF  pVP                  pVP                  pVP                  pVP                   pVP"                  pVP$                  pVP&                  pVP)                  4       pWMW,            P+                  RRR7      pVP-                  4       p\        4       pVP                  V4       VP                  V4       VP                  V4       VP                  ^ 4      pRpVP/                  4       w  ppVP0                  ^ 8  d   VP2                  ^ 8  d   RpRVRVR	V/pV^8X  dE   \5        V4      ^8X  d5   \7        \        P8                  R
4      '       d   VP;                  V4      VR&   \=        V4      pV'       dN   VVR&   \?        V4      pV'       d   VVR&   \A        V4      pV'       d   VVR&   \C        V4      pV'       d   VVR&   VPE                  VV34       EK  	  V# )ut  Return a list of fonts which were really used to render a text

:param font: The font requested to render the text in
:param text: The text to render
:param fallback: Whether to enable font fallback. If disabled, then
                 glyphs will only be used from the closest matching
                 font on the system. No fallback will be done to other
                 fonts on the system that might contain the glyphs needed
                 for the text.

Examples:

Don’t run CI checks regularly on these examples, it depends too much
on the fonts installed on the system used to do the test. The results
are also locale dependent, the results below are with LC_ALL=en_US.UTF-8:

>>> fonts_used = get_fonts_used_for_text('DejaVu Sans Mono', '😀 ')
>>> len(fonts_used)
2
>>> fonts_used[0][0]
'😀'
>>> fonts_used[0][1]['font']
'Noto Color Emoji'
>>> fonts_used[0][1]['glyph-count']
1
>>> fonts_used[0][1]['visible']
True
>>> fonts_used[0][1]['glyph-available']
True
>>> fonts_used[0][1]['file']
'/home/mfabian/.fonts/Noto-COLRv1.ttf'
>>> fonts_used[0][1]['lang']
'und-zsye'
>>> fonts_used[0][1]['version']
'Version 2.048;GOOG;noto-emoji:20250612:c7a259fc809502bcb45d983f6a78f94dfceb1fbe'
>>> fonts_used[0][1]['opentype-tables']
['COLR']
>>> fonts_used[1][0]
' '
>>> fonts_used[1][1]['font']
'DejaVu Sans Mono'
>>> fonts_used[1][1]['glyph-count']
1
>>> fonts_used[1][1]['visible']
False
>>> fonts_used[1][1]['glyph-available']
True
>>> fonts_used[1][1]['file']
'/usr/share/fonts/dejavu-sans-mono-fonts/DejaVuSansMono.ttf'
>>> fonts_used[1][1]['lang']
'aa|af|ar|ast|av|ay|az-az|az-ir|bm|be|bg|bi|bin|br|bs|bua|ca|ce|ch|chm|co|cs|cv|cy|da|de|el|en|eo|es|et|eu|fa|fi|fj|fo|fr|ff|fur|fy|ga|gd|gl|gn|gv|ha|haw|ho|hr|hu|hy|ia|ig|id|ie|ik|io|is|it|ka|kaa|ki|kk|kl|ku-am|kum|kv|kw|ky|la|lb|lez|ln|lt|lv|mg|mh|mi|mk|mo|mt|nb|nds|nl|nn|no|nr|nso|ny|oc|om|os|pl|pt|rm|ro|ru|sah|sco|se|sel|shs|sk|sl|sm|sma|smj|smn|so|sq|sr|ss|st|sv|sw|tk|tl|tn|to|tr|ts|tt|tw|tyv|uk|uz|ve|vo|vot|wa|wen|wo|xh|yap|yo|zu|ak|an|ber-dz|crh|csb|ee|fat|fil|hsb|ht|hz|jv|kab|kj|kr|ku-tr|kwm|lg|li|mn-mn|ms|na|ng|nv|pap-an|pap-aw|qu|quz|rn|rw|sc|sg|sn|su|ty|za|agr|ayc|bem|dsb|lij|mfe|mhr|miq|mjw|nhn|niu|rif|sgs|szl|tpi|unm|wae|yuw'
>>> fonts_used[1][1]['version']
'Version 2.37'

>>> fonts_used = get_fonts_used_for_text('DejaVu Sans', '日本語 नमस्ते')
>>> fonts_used[0][0]
'日本語 '
>>> fonts_used[0][1]['font']
'Droid Sans'
>>> fonts_used[0][1]['glyph-count']
4
>>> fonts_used[0][1]['visible']
True
>>> fonts_used[0][1]['file']
'/usr/share/fonts/google-droid-sans-fonts/DroidSans.ttf'
>>> fonts_used[0][1]['lang']
'aa|ab|af|av|ay|ba|be|bg|bi|bin|br|bs|bua|ca|ce|ch|chm|co|cs|cu|cv|cy|da|de|el|en|eo|es|et|eu|fi|fj|fo|fr|fur|fy|gd|gl|gn|gv|ho|hr|hu|ia|ig|id|ie|ik|io|is|it|kaa|ki|kk|kl|kum|kv|ky|la|lb|lez|lt|lv|mg|mh|mk|mo|mt|nb|nds|nl|nn|no|nr|nso|ny|oc|om|os|pl|pt|rm|ro|ru|sah|se|sel|sh|sk|sl|sma|smj|smn|so|sq|sr|ss|st|sv|sw|tg|tk|tl|tn|tr|ts|tt|tyv|uk|uz|vo|vot|wa|wen|wo|xh|yap|zu|an|crh|csb|fil|hsb|ht|jv|kj|ku-tr|kwm|lg|li|mn-mn|ms|na|ng|pap-an|pap-aw|rn|rw|sc|sg|sn|su|ty|za|agr|ayc|bem|dsb|lij|mfe|mhr|miq|mjw|nhn|niu|szl|tpi|unm|wae|yuw'
>>> fonts_used[0][1]['version']
'Version 1.00 build 114'
>>> fonts_used[1][0]
'नमस्ते'
>>> fonts_used[1][1]['font']
'Noto Sans Devanagari'
>>> fonts_used[1][1]['glyph-count']
5
>>> fonts_used[1][1]['visible']
True
>>> fonts_used[1][1]['file']
'/usr/share/fonts/google-noto/NotoSansDevanagari-Regular.ttf'
>>> fonts_used[1][1]['lang']
'bh|bho|hi|kok|mr|ne|sa|hne|mai|brx|sat|doi|anp|bhb|hif|mag|raj|the'
>>> fonts_used[1][1]['version']
'Version 2.006; ttfautohint (v1.8.4.7-5d5b)'

>>> fonts_used = get_fonts_used_for_text('DejaVu Sans', '日本語 🕉️')
>>> fonts_used[0][0]
'日本語 '
>>> fonts_used[0][1]['font']
'Droid Sans'
>>> fonts_used[0][1]['glyph-count']
4
>>> fonts_used[0][1]['visible']
True
>>> fonts_used[0][1]['file']
'/usr/share/fonts/google-droid-sans-fonts/DroidSans.ttf'
>>> fonts_used[0][1]['lang']
'aa|ab|af|av|ay|ba|be|bg|bi|bin|br|bs|bua|ca|ce|ch|chm|co|cs|cu|cv|cy|da|de|el|en|eo|es|et|eu|fi|fj|fo|fr|fur|fy|gd|gl|gn|gv|ho|hr|hu|ia|ig|id|ie|ik|io|is|it|kaa|ki|kk|kl|kum|kv|ky|la|lb|lez|lt|lv|mg|mh|mk|mo|mt|nb|nds|nl|nn|no|nr|nso|ny|oc|om|os|pl|pt|rm|ro|ru|sah|se|sel|sh|sk|sl|sma|smj|smn|so|sq|sr|ss|st|sv|sw|tg|tk|tl|tn|tr|ts|tt|tyv|uk|uz|vo|vot|wa|wen|wo|xh|yap|zu|an|crh|csb|fil|hsb|ht|jv|kj|ku-tr|kwm|lg|li|mn-mn|ms|na|ng|pap-an|pap-aw|rn|rw|sc|sg|sn|su|ty|za|agr|ayc|bem|dsb|lij|mfe|mhr|miq|mjw|nhn|niu|szl|tpi|unm|wae|yuw'
>>> fonts_used[0][1]['version']
'Version 1.00 build 114'
>>> fonts_used[1][0]
'🕉️'
>>> fonts_used[1][1]['font']
'Noto Color Emoji'
>>> fonts_used[1][1]['glyph-count']
1
>>> fonts_used[1][1]['visible']
True
>>> fonts_used[1][1]['file']
'/home/mfabian/.fonts/Noto-COLRv1.ttf'
>>> fonts_used[1][1]['lang']
'und-zsye'
>>> fonts_used[1][1]['version']
'Version 2.048;GOOG;noto-emoji:20250612:c7a259fc809502bcb45d983f6a78f94dfceb1fbe'
>>> fonts_used[1][1]['opentype-tables']
['COLR']

>>> fonts_used = get_fonts_used_for_text('DejaVu Sans', '🕉️')
>>> fonts_used[0][0]
'🕉️'
>>> fonts_used[0][1]['font']
'Noto Color Emoji'
>>> fonts_used[0][1]['glyph-count']
1
>>> fonts_used[0][1]['visible']
True
>>> fonts_used[0][1]['file']
'/home/mfabian/.fonts/Noto-COLRv1.ttf'
>>> fonts_used[0][1]['lang']
'und-zsye'
>>> fonts_used[0][1]['version']
'Version 2.048;GOOG;noto-emoji:20250612:c7a259fc809502bcb45d983f6a78f94dfceb1fbe'
>>> fonts_used[0][1]['opentype-tables']
['COLR']
rK   z/unknown: Pango broken on this platform (RHEL8?)zUTF-8r+   )ZerrorsFTglyph-countvisiblehas_charglyph-availableZfiler>   rC   zopentype-tables)#_HAS_ATTR_FALLBACKZencoder   r   Zfont_description_from_stringZset_font_descriptionZAttrListr   ZinsertZset_attributesZset_textZget_line_readonlyZrunsZitemoffsetlengthZglyphs
num_glyphsZanalysisrK   ZdescribeZdecodeZ
get_familyZget_pixel_extentsZwidthZheightlenhasattrZFontrQ   r<   r?   rE   rI   rH   ) rK   rL   rM   
fonts_usedZ	text_utf8Zpango_layoutZpango_font_descriptionZpango_attr_listZpango_attr_fallbackZpango_layout_lineZgs_listZ
glyph_itemZ
pango_itemrT   rU   Zpango_glyph_stringrV   Zpango_analysisZ
pango_fontZfont_description_usedZrun_textZ
run_familyZpango_layout_runZpango_layout_run_linerP   Zink_rectZ_logical_rectresults_for_runr7   r>   rC   Zopen_type_tabless    &&&                             r   get_fonts_used_for_textr[     s   T 57J QRSTTGI6I+-L"??E%%&<=nn&O11(;./0$$66q9$$G
__
""""'..'22
#,,#((
 * 3 3 5FO4;;I < '*557
35--.DE''8!!(+ 0 B B1 E"7"I"I"K->>A(//A"5GJ:w  !OH"

J//1;1D1D2O-.Z(&*OF# ,D*.'&t,G-4	*.t45E 128_56W X r   c                s<    V ^8  d   QhR\         R\         R\        /# )r   rK   rL   r   )r   rN   r   r   r   r   r     s&     f fS f f fr   c                s   V '       g   R# V'       g   R# \        WRR7      pV'       g   R# \        '       g   R# \        V4      ^8  d   R# V^ ,          ^,          pVR,          ^8  g&   VR,          '       d   RV9   d@   VR,          '       g1   TpR F  pVP                  VR4      pK  	  WA8X  d   R# \	        W4      # R# )	uX  
Examples:

Twemoji does not support the emoji sequence for “head shaking vertically”
(U+1F642 U+200D U+2195, added in Unicode 15.1):

>>> emoji_font_fallback_needed('Twemoji', '🙂‍↕️')
True

Twemoji does not have the flag of Sark (U+1F1E8 U+1F1F6, added in Unicode 16.0):

>>> emoji_font_fallback_needed('Twemoji',  '🇨🇶')
True

Twemoji does not have U+1FAE9 FACE WITH BAGS UNDER EYES (added in Unicode 16.0):

>>> emoji_font_fallback_needed('Twemoji', '🫩')
True

But Twemoji has U+1F925 LYING FACE (added in Unicode 9.0):

>>> emoji_font_fallback_needed('Twemoji', '🤥')
False

>>> emoji_font_fallback_needed('Twemoji', '☺️')
False

Twemoji does support the emoji sequence for the flag of Wales
(U+1F3F4 U+E0067 U+E0062 U+E0077 U+E006C U+E0073 U+E007F):

>>> emoji_font_fallback_needed('Twemoji', '🏴󠁧󠁢󠁷󠁬󠁳󠁿')
False

Twemoji does not have regular Latin characters like “A”:

>>> emoji_font_fallback_needed('Twemoji', 'A')
True

But of course any standard font has “A”:

>>> emoji_font_fallback_needed('Sans', 'A')
False

If the text given contains more than one emoji, then we don’t know and
the result is always True because a fallback might be needed:

>>> emoji_font_fallback_needed('Twemoji', '🏴󠁧󠁢󠁷󠁬󠁳󠁿🤥')
True

>>> emoji_font_fallback_needed('OpenMoji Color', '🧗‍♀️')
False
TF)rM   rO   rP   rR   r   )u   ︎u   ️)r[   rS   rW   r+   emoji_font_fallback_needed)rK   rL   rY   rZ   Ztext_newZchars   &&    r   r\   r\     s    j (eDJ
:
  mA&O&*y))0#$566(D*  ''b1H+ ),  )$99r   c                    V ^8  d   QhRR/# r   r   Nr   r   r   r   r   r   1  s      t r   c                     R# )ZInitializationNr   r   r   r   _initr`   1      
r   c                r]   r^   r   r   r   r   r   r   5  s      d r   c                 r_   )ZCleanupNr   r   r   r   _delrb   5  ra   r   c                   sD   a  ] tR tRt o V 3R lR ltV 3R lR ltRtV tR# )__ModuleInitializeri9  c                   < V ^8  d   QhRR/# r^   r   r   __classdict__   "r   r    __ModuleInitializer.__annotate__:  s      $ r   c                s    \        4        R # N)r`   Zself   &r   __init__Z__ModuleInitializer.__init__:  s    r   c                rd   r^   r   re   rg   r   r   rh   =  s       r   c                s    R # ri   r   rj   rk   r   __del__Z__ModuleInitializer.__del__=  s    r   r   N)r4   Z
__module__Z__qualname__Z__firstlineno__rl   rm   Z__static_attributes__Z__classdictcell__)rf   s   @r   rc   rc   9  s       r   rc   Z__main__)Zstreamzget_font_file() cache info: %sz!get_font_version() cache info: %sz get_font_tables() cache info: %s)T)3Z__doc__Ztypingr    r   r   r   r   ZsysrG   r,   r)   Z	functoolsZloggingZgir   Zgi.repositoryr   Zitb_gtkr   Z	getLoggerr1   rX   rS   Z	lru_cacher   r   r   r<   r?   rE   rI   rJ   r[   r\   r`   rb   rc   r4   ZStreamHandlerr&   ZLOG_HANDLERZsetLevelZDEBUGZ
addHandlerZdoctestZtestmodZFAILEDZ
_ATTEMPTEDZinfoZ
cache_infoZexitr   r   r   <module>rn      s  (       
 	          " 
		0	1U$78 
Q   Q7  7 Q5  5 T"" #"H T" #: T"  # D T"4 #4l>6DLfP  z''szz:K
OOGMM"
k""??,VZ
KK0-2J2J2LM
KK35E5P5P5RS
KK2O4N4N4PQHHV r   