Ë
    W¨œjN  ã                   ó®  — d Z ddlmZmZmZ ddlZddlZddlmc m	Z ddlm
Z
mZmZ ddlmZ ddlZddlmZ ddlmZ ddlmZ ddlZd	d
lmZ d	dlmZ d	dlmZmZmZmZmZm Z  d	dl!m"Z" d	dl#m$Z$m%Z%m&Z& 	 e'Z(	 ddlm+Z+ ddiZ- edd«       eeeeeee dœZ.deiZ/dZ0d„ d„ e.e0dfd„Z1dd„ d„ e.e0dfd„Z2 G d„ d«      Z3y# e)$ r e*Z(Y ŒOw xY w# e,$ r e(Z+Y ŒUw xY w)aJ  (Experimental) replacement for import/export functionality.

This module contains the `Document` class, a container for a DOM-style 
document (e.g. svg, html, xml, etc.) designed to replace and improve 
upon the IO functionality of svgpathtools (i.e. the svg2paths and 
disvg/wsvg functions). 

An Historic Note:
     The functionality in this module is meant to replace and improve 
     upon the IO functionality previously provided by the the 
     `svg2paths` and `disvg`/`wsvg` functions. 

Example:
    Typical usage looks something like the following.

        >> from svgpathtools import Document
        >> doc = Document('my_file.html')
        >> for path in doc.paths():
        >>     # Do something with the transformed Path object.
        >>     foo(path)
        >>     # Inspect the raw SVG element, e.g. change its attributes
        >>     foo(path.element)
        >>     transform = result.transform
        >>     # Use the transform that was applied to the path.
        >>     foo(path.transform)
        >> foo(doc.tree)  # do stuff using ElementTree's functionality
        >> doc.display()  # display doc in OS's default application
        >> doc.save('my_new_file.html')

A Big Problem:  
    Derivatives and other functions may be messed up by 
    transforms unless transforms are flattened (and not included in 
    css)
é    )ÚdivisionÚabsolute_importÚprint_functionN)ÚElementÚ
SubElementÚregister_namespace)ÚparseString)ÚStringIO)Ú
gettempdir)Útimeé   )Ú
parse_path)Úparse_transform)Ú
path2pathdÚellipse2pathdÚ
line2pathdÚpolyline2pathdÚpolygon2pathdÚ
rect2pathd)Úopen_in_browser)Ú	transformÚPathÚis_path_segment)ÚPathLikeÚsvgzhttp://www.w3.org/2000/svg)ÚpathÚcircleÚellipseÚlineÚpolylineÚpolygonÚrectr   zsvg:gc                  ó   — y©NT© ©Úxs    úf/workspace/moltex-experiments/.pixi/envs/default/lib/python3.12/site-packages/svgpathtools/document.pyÚ<lambda>r)   U   s   € °$ó    c                  ó   — yr$   r%   r&   s    r(   r)   r)   V   s   € ¨$r*   Fc           	      ón  ‡‡‡‡‡— t        | t        «      s#t        dj                  t	        | «      «      «      ‚ ‰| «      s6t        j                  dj                  | | j                  d«      «      «       g S t        j                  dddg«      Šˆˆfd„Šˆˆˆfd„} ‰| t        j                  d	«      «      g}g }|rø|j                  «       }	|j                  «       D ]¦  \  }
}t        ||	j                  j!                  d
|
z   t"        «      «      D ]q  }|	j$                  j'                  t)        |j                  d«      ‰¬«      «      }t%        t+         ||«      «      |«      }||_        ||_        |j/                  |«       Œs Œ¨ |j1                   ||	j                  |	j$                  «      «       |rŒø|S )a  Returns the paths inside a group (recursively), expressing the
    paths in the base coordinates.

    Note that if the group being passed in is nested inside some parent
    group(s), we cannot take the parent group(s) into account, because
    xml.etree.Element has no pointer to its parent. You should use
    Document.flattened_paths_from_group(group) to flatten a specific nested group into
    the root coordinates.

    Args:
        group is an Element
        path_conversions (dict):
            A dictionary to convert from an SVG element to a path data
            string. Any element tags that are not included in this
            dictionary will be ignored (including the `path` tag). To
            only convert explicit path elements, pass in
            `path_conversions=CONVERT_ONLY_PATHS`.
        strict_transform_parsing (bool): If true, a ValueError is
            raised when a transform attribute contains invalid syntax;
            by default invalid transform substrings are skipped with
            an SVGSyntaxWarning.
    zBMust provide an xml.etree.Element object. Instead you provided {0}zHThe input group [{}] (id attribute: {}) was rejected by the group filterÚidÚStackElementÚgroupr   c           
      óh   •—  ‰| |j                  t        | j                  d«      ‰¬«      «      «      S )Nr   ©Ústrict)Údotr   Úget)ÚelementÚlast_tfr.   Ústrict_transform_parsings     €€r(   Únew_stack_elementz*flattened_paths.<locals>.new_stack_element�   s3   ø€ Ù˜G W§[¡[Ü˜GŸK™K¨Ó4Ø#;ô=ó&>ó ?ð 	?r*   c                 ó†   •— g }t        ‰| j                  ‰t        «      «      D ]  }|j                   ‰||«      «       Œ |S ©N)ÚfilterÚiterfindÚSVG_NAMESPACEÚappend)Úparentr6   ÚchildrenÚelemÚgroup_filterÚgroup_search_xpathr8   s       €€€r(   Úget_relevant_childrenz.flattened_paths.<locals>.get_relevant_children†   sE   ø€ ØˆÜ˜<Ø!Ÿ?™?Ð+=¼}ÓMöOˆDà�O‰OÑ-¨d°GÓ<Õ=ðOð ˆr*   é   úsvg:r1   )Ú
isinstancer   Ú	TypeErrorÚformatÚtypeÚwarningsÚwarnr4   ÚcollectionsÚ
namedtupleÚnpÚidentityÚpopÚitemsr;   r/   r<   r=   r   r3   r   r   r5   r>   Úextend)r/   rB   Úpath_filterÚpath_conversionsrC   r7   rD   ÚstackÚpathsÚtopÚkeyÚ	converterÚ	path_elemÚpath_tfr   r.   r8   s    `  ``         @@r(   Úflattened_pathsr]   U   s‚  ü€ ô4 �eœWÔ%Üð 3ß39±6¼$¸u»+Ó3FóHð 	Hñ ˜ÔÜ�‰Ð`ß‘v˜e U§Y¡Y¨t£_Ó5ô	7àˆ	ô ×)Ñ)¨.Ø+2°KÐ*@óB€Lõ?ö
ñ ˜u¤b§k¡k°!£nÓ5Ð6€Eà€EÙ
Ø�i‰i‹kˆð
 /×4Ñ4Ö6‰NˆC�Ü# K°·±×1CÑ1CØ˜3‘J¤ó2/ö 0�	àŸ-™-×+Ñ+Ü# I§M¡M°+Ó$>Ø+CôEóF�ô !¤©I°iÓ,@Ó!AÀ7ÓK�Ø(�”Ø!(�”Ø—‘˜TÕ"ñ0ð 7ð 	�‰Ñ*¨3¯9©9°c·m±mÓDÔEò# ð& €Lr*   Tc                  ó   — yr$   r%   r&   s    r(   r)   r)   §   s   € °dr*   c                  ó   — yr$   r%   r&   s    r(   r)   r)   ¨   s   € °Tr*   c                 ó^  ‡ ‡‡‡‡— t        ˆ fd„|j                  «       D «       «      st        j                  d«       g S t	        «       Š|r0‰ j                  «       D ]  }‰j                  t        |«      «       Œ n‰j                  t        ‰ «      «       t	        «       Š|‰ urï|gg}	d}
|	rÚ|	j                  d«      }|d   }|j                  |t        «      D ]7  }|‰ u r|}
 n/t        |«      }|j                  |«       |	j                  |«       Œ9 |
�o|
D ]i  }‰j                  t        |«      «       |j                  «       D ]:  }|j                  d|z   t        «      D ]  }‰j                  t        |«      «       Œ Œ< Œk n|	rŒÚ|
€t        d«      ‚ˆˆfd„}ˆˆfd	„}t        ||||||¬
«      S )aª  Flatten all the paths in a specific group.

    The paths will be flattened into the 'root' frame. Note that root
    needs to be an ancestor of the group that is being flattened.
    Otherwise, no paths will be returned.

    If `strict_transform_parsing` is true, a ValueError is raised when
    a transform attribute contains invalid syntax; by default invalid
    transform substrings are skipped with an SVGSyntaxWarning.c              3   ó&   •K  — | ]  }‰|u –— Œ
 y ­wr:   r%   )Ú.0Ú
descendantÚgroup_to_flattens     €r(   Ú	<genexpr>z-flattened_paths_from_group.<locals>.<genexpr>¶   s   øè ø€ ÐLÁ°*Ð :Ô-Áùó   ƒz:The requested group_to_flatten is not a descendant of rootNr   éÿÿÿÿrF   z5The group_to_flatten is not a descendant of the root!c                 ó2   •— t        | «      ‰v xr  ‰| «      S r:   ©r-   )r'   Údesired_groupsrB   s    €€r(   Údesired_group_filterz8flattened_paths_from_group.<locals>.desired_group_filterê   s   ø€ Ü�1“˜Ð'Ò<©\¸!«_Ð<r*   c                 ó2   •— t        | «      ‰vxr  ‰| «      S r:   ri   )r'   Úignore_pathsrT   s    €€r(   Údesired_path_filterz7flattened_paths_from_group.<locals>.desired_path_filterí   s   ø€ Ü�1“˜\Ð)Ò=©{¸1«~Ð=r*   ©r7   )ÚanyÚiterrK   rL   ÚsetÚaddr-   rQ   r<   r=   Úlistr>   ÚkeysÚ
ValueErrorr]   )rd   ÚrootÚ	recursiverB   rT   rU   rC   r7   r/   ÚsearchÚrouterX   ÚfrontierÚchildÚ
future_toprY   r[   rk   rn   rj   rm   s   `  ``              @@r(   Úflattened_paths_from_groupr~   ¦   s¬  ü€ ô  ÓLÀÇ	Á	ÄÓLÔLÜ�‰ð +ô 	,ð ˆ	ô
 “U€NÙØ%×*Ñ*Ö,ˆEØ×Ñœr %›yÕ)ñ -ð 	×Ñœ2Ð.Ó/Ô0ä“5€LàÐ#Ñ#Ø�&�ˆØˆÙØ—*‘*˜Q“-ˆCØ˜2‘wˆHØ!×*Ñ*Ð+=¼}ÖM�ØÐ,Ñ,Ø�EÙÜ! #›Y�
Ø×!Ñ! %Ô(Ø—‘˜jÕ)ð Nð Ð Û"�Eð
 #×&Ñ&¤r¨%£yÔ1Ø/×4Ñ4Ö6˜Ø).¯©¸¸s¹
ÄMÖ)R˜Ið
 )×,Ñ,¬R°	«]Õ;ñ *Sñ  7ð #ð ò3 ð6 ˆ=ÜÐTÓUÐUõ=õ>ô ˜4Ð!5Ð7JØ+Ð-?Ø4LôNð Nr*   c                   óŽ   — e Zd Zdd„Zedd„«       Zd„ d„ efd„Zdd„ d	„ efd
„Zdd„Z	d„ Z
dd„Zdd„Zdd„Zd„ Zd„ Zdd„Zdd„Zy)ÚDocumentNc                 ód  — || _         t        |t        «      xs t        |t        «      }|rt        j
                  j                  |«      nd| _        |€$t        j                  t        d«      «      | _        nt        j                  |«      | _        | j                  j                  «       | _        y)aÌ  
        A container for a DOM-style SVG document.

        The `Document` class provides a simple interface to modify and analyze
        the path elements in a DOM-style document.  The DOM-style document is
        parsed into an ElementTree object (stored in the `tree` attribute).

        This class provides functions for extracting SVG data into Path objects.
        The output Path objects will be transformed based on their parent groups.

        Args:
            filepath (str or file-like): The filepath of the
                DOM-style object or a file-like object containing it.
            strict_transform_parsing (bool): If true, a ValueError is
                raised when a transform attribute containing invalid
                syntax is parsed (transforms are parsed lazily, by
                `paths()` and `paths_from_group()`); by default invalid
                transform substrings are skipped with an
                SVGSyntaxWarning.
        Nr   )r7   rG   Ústringr   Úosr   ÚabspathÚoriginal_filepathÚetreeÚElementTreer   ÚtreeÚparseÚgetrootrw   )ÚselfÚfilepathr7   Úfrom_filepaths       r(   Ú__init__zDocument.__init__ö   sƒ   € ð* )AˆÔ%ô # 8¬VÓ4ÒV¼
À8ÌXÓ8VˆÙ>K¤§¡§¡°Ô!:ÐQUˆÔàÐÜ×)Ñ)¬'°%«.Ó9ˆD�Iô Ÿ™ HÓ-ˆDŒIà—I‘I×%Ñ%Ó'ˆ�	r*   c                 ó2   — t        |«      }t        ||¬«      S )z9Constructor for creating a Document object from a string.ro   )r
   r€   )ÚclsÚ
svg_stringr7   Úsvg_file_objs       r(   Úfrom_svg_stringzDocument.from_svg_string  s"   € ô   
Ó+ˆä˜Ø1IôKð 	Kr*   c                  ó   — yr$   r%   r&   s    r(   r)   zDocument.<lambda>#  s   € ¨4r*   c                  ó   — yr$   r%   r&   s    r(   r)   zDocument.<lambda>$  s   €  Dr*   c                 óf   — t        | j                  j                  «       |||| j                  ¬«      S )z‘Returns a list of all paths in the document.

        Note that any transform attributes are applied before returning
        the paths.
        ro   )r]   rˆ   rŠ   r7   )r‹   rB   rT   rU   s       r(   rW   zDocument.paths#  s3   € ô Ø�I‰I×ÑÓ ¨{Ð<LØ%)×%BÑ%BôDð 	Dr*   Tc                  ó   — yr$   r%   r&   s    r(   r)   zDocument.<lambda>.  s   € ÈTr*   c                  ó   — yr$   r%   r&   s    r(   r)   zDocument.<lambda>/  s   € ¨tr*   c           	      ó8  — t        d„ |D «       «      r| j                  |«      }n*t        |t        «      st	        dj                  |«      «      ‚|€t        j                  d«       g S t        || j                  j                  «       ||||| j                  ¬«      S )Nc              3   ó<   K  — | ]  }t        |t        «      –— Œ y ­wr:   )rG   r‚   )rb   Úss     r(   re   z,Document.paths_from_group.<locals>.<genexpr>0  s   è ø€ Ð4©e¨Œz˜!œV×$©eùó   ‚zƒMust provide a list of strings that represent a nested group name, or provide an xml.etree.Element object. Instead you provided {0}z#Could not find the requested group!ro   )ÚallÚ	get_grouprG   r   rH   rI   rK   rL   r~   rˆ   rŠ   r7   )r‹   r/   rx   rB   rT   rU   s         r(   Úpaths_from_groupzDocument.paths_from_group.  s‘   € äÑ4©eÓ4Ô4ð —N‘N 5Ó)‰EÜ˜E¤7Ô+Üð+ç+1©6°%«=ó:ð :ð
 ˆ=Ü�M‰MÐ?Ô@ØˆIä)Ø�4—9‘9×$Ñ$Ó&¨	°<ÀØØ%)×%BÑ%BôDð 	Dr*   c                 ót  — |€| j                   j                  «       }n‚t        |«      dkD  r$t        d„ |D «       «      r| j	                  |«      }nPt        |t        «      st        dj                  |«      «      ‚| j                  |«      st        j                  d«       t        |t        «      r|j                  «       }nRt        |«      rt        |«      j                  «       }n-t        |t        «      r|}nt        dj                  |«      «      ‚|€i }n|j!                  «       }||d<   t#        |d|«      S )zAdd a new path to the SVG.r   c              3   ó<   K  — | ]  }t        |t        «      –— Œ y ­wr:   )rG   Ústr)rb   rA   s     r(   re   z$Document.add_path.<locals>.<genexpr>L  s   è ø€ Ð#LÁe¸d¤J¨t´S×$9Áeùrœ   zWMust provide a list of strings or an xml.etree.Element object. Instead you provided {0}z4The requested group does not belong to this Documentz`Must provide a Path, a path segment type, or a valid SVG path d-string. Instead you provided {0}Údr   )rˆ   rŠ   Úlenr�   Úget_or_add_grouprG   r   rH   rI   Úcontains_grouprK   rL   r   r£   r   r‚   Úcopyr   )r‹   r   Úattribsr/   Úpath_svgs        r(   Úadd_pathzDocument.add_pathC  s  € ð ˆ=Ø—I‘I×%Ñ%Ó'‰Eô �‹Z˜!Š^¤Ñ#LÁeÓ#LÔ LØ×)Ñ)¨%Ó0‰Eä˜E¤7Ô+Üð3ß39±6¸%³=óBð Bð ×&Ñ& uÔ-Ü—‘ð .ô /ô �dœDÔ!Ø—v‘v“x‰HÜ˜TÔ"Ü˜D“z—|‘|“~‰HÜ˜œfÔ%ð ‰Häð>ß>D¹fÀT»lóLð Lð ˆ?Ø‰Gà—l‘l“nˆGàˆ�‰ä˜% ¨Ó1Ð1r*   c                 ó\   ‡— t        ˆfd„| j                  j                  «       D «       «      S )Nc              3   ó&   •K  — | ]  }‰|u –— Œ
 y ­wr:   r%   )rb   Úownedr/   s     €r(   re   z*Document.contains_group.<locals>.<genexpr>r  s   øè ø€ Ð@Ñ/? e�5˜E”>Ñ/?ùrf   )rp   rˆ   rq   )r‹   r/   s    `r(   r¦   zDocument.contains_groupq  s   ø€ ÜÓ@¨t¯y©y¯~©~Ô/?Ó@Ó@Ð@r*   c                 ó  — | j                   j                  «       }t        |«      r[|}|j                  d«      }|j	                  t
        t        «      D ]  }|j                  |«      |k(  sŒ|} n ||u ryt        |«      rŒ[|S )a�  Get a group from the tree, or None if the requested group
        does not exist. Use get_or_add_group(~) if you want a new group
        to be created if it did not already exist.

        `nested_names` is a list of strings which represent group names.
        Each group name will be nested inside of the previous group name.

        `name_attr` is the group attribute that is being used to
        represent the group's name. Default is 'id', but some SVGs may
        contain custom name labels, like 'inkscape:label'.

        Returns the request group. If the requested group did not
        exist, this function will return a None value.
        r   N)rˆ   rŠ   r¤   rQ   r<   ÚSVG_GROUP_TAGr=   r4   ©r‹   Únested_namesÚ	name_attrr/   Ú
prev_groupÚ	next_namerA   s          r(   rž   zDocument.get_groupt  s€   € ð —	‘	×!Ñ!Ó#ˆä�,ÔØˆJØ$×(Ñ(¨Ó+ˆIØŸ™¤}´mÖD�Ø—8‘8˜IÓ&¨)Ó3Ø �EÙð Eð
 ˜UÑ"àô �,Õð ˆr*   c                 ó|  — | j                   j                  «       }t        |«      r–|}|j                  d«      }|j	                  t
        t        «      D ]  }|j                  |«      |k(  sŒ|} n ||u r<|j                  d|«       |r(|j                  d«      }| j                  d|i|«      }|rŒ(t        |«      rŒ–|S )aœ  Get a group from the tree, or add a new one with the given
        name structure.

        `nested_names` is a list of strings which represent group names.
        Each group name will be nested inside of the previous group name.

        `name_attr` is the group attribute that is being used to
        represent the group's name. Default is 'id', but some SVGs may
        contain custom name labels, like 'inkscape:label'.

        Returns the requested group. If the requested group did not
        exist, this function will create it, as well as all parent
        groups that it requires. All created groups will be left with
        blank attributes.

        r   r-   )
rˆ   rŠ   r¤   rQ   r<   r¯   r=   r4   ÚinsertÚ	add_groupr°   s          r(   r¥   zDocument.get_or_add_group“  s¼   € ð" —	‘	×!Ñ!Ó#ˆä�,ÔØˆJØ$×(Ñ(¨Ó+ˆIØŸ™¤}´mÖD�Ø—8‘8˜IÓ&¨)Ó3Ø �EÙð Eð
 ˜UÑ"ð ×#Ñ# A yÔ1á"Ø ,× 0Ñ 0°Ó 3�IØ ŸN™N¨D°)Ð+<¸eÓD�Eò #ô �,Õð$ ˆr*   c                 ó  — |€| j                   j                  «       }n5| j                  |«      s$t        j                  dj                  |«      «       |€i }n|j                  «       }t        |dj                  t        d   «      |«      S )z&Add an empty group element to the SVG.z8The requested group {0} does not belong to this Documentz{{{0}}}gr   )	rˆ   rŠ   r¦   rK   rL   rI   r§   r   r=   )r‹   Úgroup_attribsr?   s      r(   r·   zDocument.add_groupº  sƒ   € àˆ>Ø—Y‘Y×&Ñ&Ó(‰FØ×$Ñ$ VÔ,Ü�M‰Mð *ß*0©&°«.ô:ð Ð Ø‰Mà)×.Ñ.Ó0ˆMä˜& *×"3Ñ"3Ü˜%Ñ ó#"Ø#0ó2ð 	2r*   c                 óx   — t        j                  | j                  j                  «       «      j	                  «       S r:   )r†   Útostringrˆ   rŠ   Údecode)r‹   s    r(   Ú__repr__zDocument.__repr__Ê  s'   € Ü�~‰~˜dŸi™i×/Ñ/Ó1Ó2×9Ñ9Ó;Ð;r*   c                 óJ   —  t        t        | «      «      j                  di |¤ŽS )Nr%   )r	   ÚreprÚtoprettyxml)r‹   Úkwargss     r(   ÚprettyzDocument.prettyÍ  s!   € Ø2Œ{œ4 ›:Ó&×2Ñ2Ñ<°VÑ<Ð<r*   c                 óÂ   — t        |d«      5 }|r"|j                   | j                  di |¤Ž«       n|j                  t        | «      «       d d d «       y # 1 sw Y   y xY w)Nzw+r%   )ÚopenÚwriterÂ   r¿   )r‹   rŒ   ÚprettifyrÁ   Ú
output_svgs        r(   ÚsavezDocument.saveÐ  sK   € Ü�(˜DÔ! ZÙØ× Ñ   §¡Ñ!6¨vÑ!6Õ7à× Ñ ¤ d£Ô,÷	 "×!Ñ!ús   �?AÁAc                 óò  — |€¯| j                   €d\  }}nIt        j                  j                  t        j                  j	                  | j                   «      «      \  }}|dz   t        t        «       «      j                  dd«      z   |z   }t        j                  j                  t        «       |«      }t        |d«      5 }|j                  t        | «      «       ddd«       t        |«       y# 1 sw Y   ŒxY w)z:Displays/opens the doc using the OS's default application.N)Úunnamedz.svgÚ_Ú.Ú-Úw)r…   rƒ   r   ÚsplitextÚbasenamer¢   r   ÚreplaceÚjoinr   rÄ   rÅ   r¿   r   )r‹   rŒ   Ú	orig_nameÚextÚtmp_namerÇ   s         r(   ÚdisplayzDocument.display×  sÅ   € ð ÐØ×%Ñ%Ð-Ø!2‘�	™3ô —G‘G×$Ñ$¤R§W¡W×%5Ñ%5°d×6LÑ6LÓ%MÓNñ �	˜3à  3‘¬¬T«V«×)<Ñ)<¸SÀ#Ó)FÑFÈÑLˆHÜ—w‘w—|‘|¤J£L°(Ó;ˆHô �(˜CÔ  JØ×ÑœT $›ZÔ(÷ !ô 	˜Õ!÷ !Ð ús   Â>C-Ã-C6)NF)F)NNri   r:   )Ú__name__Ú
__module__Ú__qualname__rŽ   Úclassmethodr“   ÚCONVERSIONSrW   rŸ   rª   r¦   rž   r¥   r·   r½   rÂ   rÈ   rÖ   r%   r*   r(   r€   r€   õ   sp   „ ó"(ðH òKó ðKñ "0Ù(¸;ó	Dð 15Á>Ù%3ÀkóDó*,2ò\Aóó>%óN2ò <ò=ó-ô"r*   r€   )4Ú__doc__Ú
__future__r   r   r   rƒ   rM   Úxml.etree.ElementTreer†   r‡   r   r   r   Úxml.dom.minidomr	   rK   Úior
   Útempfiler   r   ÚnumpyrO   Úparserr   r   Úsvg_to_pathsr   r   r   r   r   r   Ú	misctoolsr   r   r   r   r   Ú
basestringr‚   Ú	NameErrorr¢   r   ÚImportErrorr=   rÛ   ÚCONVERT_ONLY_PATHSr¯   r]   r~   r€   r%   r*   r(   Ú<module>rê      s  ðñ!÷H AÑ @Û 	Û ß %Ð %ß IÑ IÝ 'Û Ý Ý Ý Û õ Ý #÷F÷ Få &ß 2Ñ 2ðØ€FðÝð
 Ð4Ð5€Ù �5Ð6Ô 7ð "Ø&Ø'Ø!Ø)Ø'Ø!ñ#€ð ˜jÐ)Ð à€ñ )7Ù .ÀØ'4Ø-2óNðb BFÙ,:Ù+9Ø0;Ø2?Ø8=óLN÷^r"ò r"øðs ò Ø‚Fðûð ò Ø‚Hðús$   Á5B= Á8C
 Â=CÃCÃ
CÃC