Ë
    }D™jŠ–  ã                   óº  — d Z ddlmZ ddlmZmZ ddlmZmZm	Z	m
Z
mZmZmZmZmZmZmZmZmZmZmZ ddddd	d
dddddddœZdefd„Zdefd„Zdedefd„Zdedefd„Zdedefd„Zdedefd„Zdedefd„Zdedefd„ZdDdede d e defd!„Z!d"edefd#„Z"dEd$ed e defd%„Z#d&edefd'„Z$d&edefd(„Z%	 dEd)ee	e
ef   d*e defd+„Z&d,edefd-„Z'd,edefd.„Z(d/edefd0„Z)d1edefd2„Z*d3edefd4„Z+d5eeee	e
eeeeeeeeeeef   defd6„Z,g d7¢Z-e.d8k(  rQdd9l/m0Z0 dd:l1m2Z2 e0jf                  ji                  d;d<d=d>d?d@¬A«      Z5 e2jl                  e5¬B«      Z7 e,e7«      Z8 e9e8«       yCyC)Fa¯  
This is part of Kerykeion (C) 2025 Giacomo Battaglia

Context Serializer Module

This module provides functionality to transform Kerykeion Pydantic models
into XML representations suitable for AI consumption. The output is strictly
non-qualitative and non-interpretive, providing factual representations
of astrological data in semantic XML format.

Optional/None fields are omitted from the output rather than rendered as empty.
é    )ÚUnion)ÚescapeÚ	quoteattr)ÚKerykeionPointModelÚLunarPhaseModelÚAstrologicalSubjectModelÚCompositeSubjectModelÚPlanetReturnModelÚAspectModelÚSingleChartDataModelÚDualChartDataModelÚElementDistributionModelÚQualityDistributionModelÚTransitMomentModelÚTransitsTimeRangeModelÚPointInHouseModelÚHouseComparisonModelÚMoonPhaseOverviewModelÚAriesÚTaurusÚGeminiÚCancerÚLeoÚVirgoÚLibraÚScorpioÚSagittariusÚ	CapricornÚAquariusÚPisces)ÚAriÚTauÚGemÚCanr   ÚVirÚLibÚScoÚSagÚCapÚAquÚPisÚreturnc                 ó*   — t        t        | «      «      S )z+Escape a value for use as XML text content.)r   Ústr)Úvalues    úh/var/www/html/Astrologybackend/backend/venv/lib/python3.12/site-packages/kerykeion/context_serializer.pyÚ_xer1   :   s   € ä”#�e“*ÓÐó    c            
      óº   — g }| j                  «       D ]0  \  }}|€Œ	|j                  |› dt        t        |«      «      › �«       Œ2 |syddj	                  |«      z   S )z¿Format keyword arguments as XML attributes, omitting None values.

    Returns a string with a leading space if any attributes are present,
    or an empty string if all values are None.
    ú=Ú ú )ÚitemsÚappendr   r.   Újoin)ÚkwargsÚpartsÚkeyr/   s       r0   Ú_attrsr=   ?   sd   € ð €EØ—l‘l“nò ;‰
ˆˆUØÑØ�L‰L˜C˜5 ¤)¬C°«JÓ"7Ð!8Ð9Õ:ð;ñ ØØ�—‘˜%“Ñ Ð r2   Útagc                 ó$   — d| › t        di |¤Ž› d�S )z7Create a self-closing XML tag: ``<tag key="value" />``.ú<z />© ©r=   ©r>   r:   s     r0   Ú_scrD   N   s   € àˆsˆe”FÑ$˜VÑ$Ð% SÐ)Ð)r2   c                 ó$   — d| › t        di |¤Ž› d�S )z1Create an opening XML tag: ``<tag key="value">``.r@   ú>rA   rB   rC   s     r0   Ú_orG   S   s   € àˆsˆe”FÑ$˜VÑ$Ð% QÐ'Ð'r2   c                 ó   — d| › d�S )z%Create a closing XML tag: ``</tag>``.z</rF   rA   )r>   s    r0   Ú_crI   X   s   € à�ˆu�Aˆ;Ðr2   c                 óP   — |€yt        | fi |¤Ž› t        |«      › t        | «      › �S )zoCreate an XML element with text content: ``<tag>text</tag>``.

    Returns empty string if *text* is None.
    r5   )rG   r1   rI   )r>   Útextr:   s      r0   Ú_elrL   ]   s2   € ð
 €|ØÜ�Ñ˜ÑÐ ¤ T£ ¬B¨s«G¨9Ð5Ð5r2   Úpointc                 ó  — t         j                  | j                  | j                  «      }| j                  | j                  d›|| j
                  d›| j                  | j                  dœ}| j                  �(t        | j                  «      j                  dd«      |d<   | j                  �| j                  rdnd|d<   | j                  �| j                  d	›|d
<   | j                  �| j                  d›|d<   t        di |¤ŽS )a¤  
    Transform a KerykeionPointModel into an XML ``<point />`` element.

    Provides a non-qualitative description of an astrological point including
    its position, sign, element, quality, house placement, and motion status.

    Args:
        point: A KerykeionPointModel representing a planet, axis, or house cusp.

    Returns:
        A self-closing XML string describing the point.

    Example:
        >>> point = subject.sun
        >>> kerykeion_point_to_context(point)
        '<point name="Sun" position="10.81" sign="Capricorn" abs_pos="280.81" quality="Cardinal" element="Earth" house="First House" motion="direct" speed="1.0195" declination="-23.00" />'
    ú.2f)ÚnameÚpositionÚsignÚabs_posÚqualityÚelementÚ_r6   ÚhouseÚ
retrogradeÚdirectÚmotionú.4fÚspeedÚdeclination)rM   )ÚSIGN_FULL_NAMESÚgetrR   rP   rQ   rS   rT   rU   rW   r.   ÚreplacerX   r\   r]   rD   )rM   Úfull_sign_nameÚattrss      r0   Úkerykeion_point_to_contextrc   l   sì   € ô$ %×(Ñ(¨¯©°U·Z±ZÓ@€Nð —
‘
Ø—~‘~ cÐ*ØØ—m‘m CÐ(Ø—=‘=Ø—=‘=ñ€Eð ‡{�{ÐÜ˜UŸ[™[Ó)×1Ñ1°#°sÓ;ˆˆg‰à×ÑÐ#Ø*/×*:Ò*:™,Àˆˆh‰à‡{�{ÐØ!ŸK™K¨Ð,ˆˆg‰à×ÑÐ$Ø"'×"3Ñ"3°CÐ!8ˆˆmÑäÑ ˜%Ñ Ð r2   Úlunar_phasec                 óˆ   — t        d| j                  t        | j                  «      | j                  d›| j
                  ¬«      S )a�  
    Transform a LunarPhaseModel into an XML ``<lunar_phase />`` element.

    Args:
        lunar_phase: A LunarPhaseModel containing lunar phase information.

    Returns:
        A self-closing XML string describing the lunar phase.

    Example:
        >>> lunar_phase_to_context(subject.lunar_phase)
        '<lunar_phase name="Waning Gibbous" phase="20" degrees_between="254.32" emoji="\U0001f316" />'
    rd   rO   )rP   ÚphaseÚdegrees_betweenÚemoji)rD   Úmoon_phase_namer.   Ú
moon_phaseÚdegrees_between_s_mÚ
moon_emoji)rd   s    r0   Úlunar_phase_to_contextrm   ˜   sB   € ô ØØ×(Ñ(Ü�+×(Ñ(Ó)Ø&×:Ñ:¸3Ð?Ø×$Ñ$ôð r2   ÚaspectÚis_synastryÚ
is_transitc                 ó¨  — |rj|rdn| j                   }t        d| j                  | j                  | j                  | j
                  || j                  d›t        | j                  «      ¬«      S t        d| j                  | j                  | j
                  | j                  d›t        | j                  «      | j                  j                  «       ¬«      S )aK  
    Transform an AspectModel into an XML ``<aspect />`` element.

    Args:
        aspect: An AspectModel representing an aspect between two points.
        is_synastry: True for synastry/dual charts (adds ownership attributes).
        is_transit: True for transit charts (uses "Transit" as second owner).

    Returns:
        A self-closing XML string describing the aspect.

    Examples:
        Natal chart::

            <aspect type="conjunction" p1="Mercury" p2="Saturn" orb="10.02" angle="0" movement="applying" />

        Synastry chart::

            <aspect type="opposition" p1_name="Sun" p1_owner="John" p2_name="Mercury" p2_owner="Jane" orb="6.42" angle="180" />

        Transit chart::

            <aspect type="opposition" p1_name="Sun" p1_owner="John" p2_name="Jupiter" p2_owner="Transit" orb="6.42" angle="180" />
    ÚTransitrn   rO   )ÚtypeÚp1_nameÚp1_ownerÚp2_nameÚp2_ownerÚorbÚangle)rs   Úp1Úp2rx   ry   Úmovement)rw   rD   rn   rt   ru   rv   Úorbitr.   Úaspect_degreesÚaspect_movementÚlower)rn   ro   rp   rw   s       r0   Úaspect_to_contextr�   ¯   s°   € ñ2 Ù *‘9°·±ˆÜØØ—‘Ø—N‘NØ—_‘_Ø—N‘NØØ—<‘< Ð$Ü�f×+Ñ+Ó,ô	
ð 		
ô ØØ—‘Ø�~‰~Ø�~‰~Ø—<‘< Ð$Ü�f×+Ñ+Ó,Ø×+Ñ+×1Ñ1Ó3ô
ð 	
r2   Úpoint_in_housec                 óì   — | j                   | j                  | j                  d›| j                  dœ}| j                  r| j                  |d<   | j
                  |d<   | j                  |d<   t        di |¤ŽS )aä  
    Transform a PointInHouseModel into an XML ``<point_in_house />`` element.

    Args:
        point_in_house: A PointInHouseModel representing a point's house placement.

    Returns:
        A self-closing XML string describing the point's house placement.

    Example::

        <point_in_house point_name="Sun" point_owner="John" degree="15.32"
            sign="Aries" owner_house="First House" projected_house="Seventh House"
            projected_house_owner="Jane" />
    rO   )Ú
point_nameÚpoint_ownerÚdegreerR   Úowner_houseÚprojected_houseÚprojected_house_owner)r‚   )r„   Úpoint_owner_nameÚpoint_degreeÚ
point_signÚpoint_owner_house_nameÚprojected_house_nameÚprojected_house_owner_namerD   )r‚   rb   s     r0   Úpoint_in_house_to_contextr�   à   s   € ð" %×/Ñ/Ø%×6Ñ6Ø#×0Ñ0°Ð5Ø×)Ñ)ñ	€Eð ×,Ò,Ø-×DÑDˆˆmÑà-×BÑB€EÐ
ÑØ%3×%NÑ%N€EÐ
!Ñ"äÑ) 5Ñ)Ð)r2   Úhouse_comparisonc                 óF  — t        d«      g}| j                  r|j                  dt        d| j                  | j                  ¬«      › �«       | j                  D ]  }|j                  dt        |«      › �«       Œ! |j                  dt        d«      › �«       | j                  r”|rd| j                  }}n| j                  | j                  }}|j                  dt        d||¬«      › �«       | j                  D ]  }|j                  dt        |«      › �«       Œ! |j                  dt        d«      › �«       | j                  r”|r| j                  d}}n| j                  | j                  }}|j                  dt        d||¬«      › �«       | j                  D ]  }|j                  dt        |«      › �«       Œ! |j                  dt        d«      › �«       | j                  r”|rd| j                  }}n| j                  | j                  }}|j                  dt        d	||¬«      › �«       | j                  D ]  }|j                  dt        |«      › �«       Œ! |j                  dt        d	«      › �«       |j                  t        d«      «       d
j                  |«      S )a†  
    Transform a HouseComparisonModel into an XML ``<house_overlay>`` element.

    Provides bidirectional house overlay analysis between two subjects.

    Args:
        house_comparison: A HouseComparisonModel with bidirectional house placements.
        is_transit: If True, handles transit chart logic.

    Returns:
        A multi-line XML string describing the house comparison.
    Úhouse_overlayú  Úfirst_points_in_second)ÚsubjectÚtargetú    rr   Úsecond_points_in_firstÚfirst_cusps_in_secondÚsecond_cusps_in_firstú
)rG   Úfirst_points_in_second_housesr8   Úfirst_subject_nameÚsecond_subject_namer�   rI   Úsecond_points_in_first_housesÚfirst_cusps_in_second_housesÚsecond_cusps_in_first_housesr9   )r‘   rp   ÚlinesrM   ÚsubjÚtgtÚcusps          r0   Úhouse_comparison_to_contextr§      sŸ  € ô �Ó Ð!€Eð ×5Ò5Ø�‰Ø”Ð,Ð6F×6YÑ6YÐbr÷  cGñ  cGô  Hð  Ið  Jô	
ð &×CÑCò 	DˆEØ�L‰L˜4Ô 9¸%Ó @ÐAÐBÕCð	Dà�‰�rœ"Ð5Ó6Ð7Ð8Ô9ð ×5Ò5ÙØ!Ð#3×#FÑ#F�#‰Dà(×<Ñ<Ð>N×>aÑ>a�#ˆDØ�‰�rœ"Ð5¸tÈCÔPÐQÐRÔSØ%×CÑCò 	DˆEØ�L‰L˜4Ô 9¸%Ó @ÐAÐBÕCð	Dà�‰�rœ"Ð5Ó6Ð7Ð8Ô9ð ×4Ò4ÙØ(×;Ñ;¸Y�#‰Dà(×;Ñ;Ð=M×=aÑ=a�#ˆDØ�‰�rœ"Ð4¸dÈ3ÔOÐPÐQÔRØ$×AÑAò 	CˆDØ�L‰L˜4Ô 9¸$Ó ?Ð@ÐAÕBð	Cà�‰�rœ"Ð4Ó5Ð6Ð7Ô8ð ×4Ò4ÙØ!Ð#3×#FÑ#F�#‰Dà(×<Ñ<Ð>N×>aÑ>a�#ˆDØ�‰�rœ"Ð4¸dÈ3ÔOÐPÐQÔRØ$×AÑAò 	CˆDØ�L‰L˜4Ô 9¸$Ó ?Ð@ÐAÕBð	Cà�‰�rœ"Ð4Ó5Ð6Ð7Ô8à	‡L�L”�OÓ$Ô%Ø�9‰9�UÓÐr2   Údistributionc                 óŠ   — t        d| j                  › d�| j                  › d�| j                  › d�| j                  › d�¬«      S )ak  
    Transform an ElementDistributionModel into an XML ``<element_distribution />`` element.

    Args:
        distribution: An ElementDistributionModel with element percentages.

    Returns:
        A self-closing XML string describing the element distribution.

    Example::

        <element_distribution fire="25%" earth="20%" air="30%" water="25%" />
    Úelement_distributionú%)ÚfireÚearthÚairÚwater)rD   Úfire_percentageÚearth_percentageÚair_percentageÚwater_percentage©r¨   s    r0   Úelement_distribution_to_contextrµ   =  sX   € ô ØØ×,Ñ,Ð-¨QÐ/Ø×.Ñ.Ð/¨qÐ1Ø×*Ñ*Ð+¨1Ð-Ø×.Ñ.Ð/¨qÐ1ôð r2   c                 ón   — t        d| j                  › d�| j                  › d�| j                  › d�¬«      S )ae  
    Transform a QualityDistributionModel into an XML ``<quality_distribution />`` element.

    Args:
        distribution: A QualityDistributionModel with quality percentages.

    Returns:
        A self-closing XML string describing the quality distribution.

    Example::

        <quality_distribution cardinal="33%" fixed="40%" mutable="27%" />
    Úquality_distributionr«   )ÚcardinalÚfixedÚmutable)rD   Úcardinal_percentageÚfixed_percentageÚmutable_percentager´   s    r0   Úquality_distribution_to_contextr¾   T  sG   € ô ØØ ×4Ñ4Ð5°QÐ7Ø×.Ñ.Ð/¨qÐ1Ø×2Ñ2Ð3°1Ð5ô	ð r2   r–   Úis_transit_subjectc                 óZ  — t        d| j                  ¬«      g}t        | t        «      r¸|rdnd}| j                  dk  rdnd}|j                  dt        || j                  › d	| j                  d
›d	| j                  d
›d| j                  d
›d| j                  d
›�	| j                  | j                  | j                  d›| j                  d›|| j                  ¬«      › �«       | j                   | j"                  | j$                  dœ}| j&                  r| j&                  |d<   |j                  dt        d!i |¤Ž› �«       t        | t(        «      rS|j                  dt        d| j*                  | j,                  j                  | j.                  j                  ¬«      › �«       t        | t0        «      r)|j                  dt        d| j2                  ¬«      › �«       g d¢}g }|D ]/  }t5        | |d«      }	|	€Œ|j                  dt7        |	«      › �«       Œ1 |rK|j                  dt        d«      › �«       |j9                  |«       |j                  dt;        d«      › �«       g d¢}
g }|
D ]/  }t5        | |d«      }|€Œ|j                  dt7        |«      › �«       Œ1 dD ]/  }t5        | |d«      }|€Œ|j                  dt7        |«      › �«       Œ1 |rK|j                  dt        d«      › �«       |j9                  |«       |j                  dt;        d«      › �«       g d¢}|j                  dt        d«      › �«       |D ]q  }t5        | |d«      }|€Œ|j                  dt        d|j                  |j<                  d›t>        jA                  |jB                  |jB                  «      ¬«      › �«       Œs |j                  dt;        d«      › �«       | jD                  �'|j                  dtG        | jD                  «      › �«       |j                  t;        d«      «       d jI                  |«      S )"aó  
    Transform an AstrologicalSubjectModel into a comprehensive XML ``<chart>`` element.

    Provides a complete description of an astrological chart including metadata,
    planetary positions, house cusps, and lunar phase.

    Args:
        subject: An AstrologicalSubjectModel, CompositeSubjectModel, or PlanetReturnModel.
        is_transit_subject: If True, uses ``<transit_data>`` instead of ``<birth_data>``.

    Returns:
        A multi-line XML string describing the complete chart.
    Úchart)rP   Útransit_dataÚ
birth_datar   ÚWÚEr”   ú-Ú02dr6   ú:rO   )ÚdateÚcityÚnationÚlatÚlngÚlng_dirÚtz)ÚzodiacÚhouse_systemÚperspectiveÚsidereal_modeÚcomposite_info)rs   Úfirst_subjectÚsecond_subjectÚreturn_info©rs   )ÚsunÚmoonÚmercuryÚvenusÚmarsÚjupiterÚsaturnÚuranusÚneptuneÚplutoÚchironÚmean_lilithÚtrue_lilithÚceresÚpallasÚjunoÚvestaNr˜   Úplanets)Ú	ascendantÚ
descendantÚmedium_coeliÚ
imum_coeliÚvertexÚanti_vertex)Útrue_north_lunar_nodeÚtrue_south_lunar_nodeÚaxes)Úfirst_houseÚsecond_houseÚthird_houseÚfourth_houseÚfifth_houseÚsixth_houseÚseventh_houseÚeighth_houseÚninth_houseÚtenth_houseÚeleventh_houseÚtwelfth_houseÚhousesrW   )rP   r¦   rR   rœ   )Úconfig)%rG   rP   Ú
isinstancer   rÍ   r8   rD   ÚyearÚmonthÚdayÚhourÚminuterÊ   rË   rÌ   Útz_strÚzodiac_typeÚhouses_system_nameÚperspective_typerÓ   r	   Úcomposite_chart_typerÕ   rÖ   r
   Úreturn_typeÚgetattrrc   ÚextendrI   rQ   r^   r_   rR   rd   rm   r9   )r–   r¿   r£   Údata_tagrÎ   Úconfig_attrsÚcelestial_point_namesÚplanet_linesr„   rM   ró   Ú
axes_linesÚ	axis_nameÚaxisÚ	node_nameÚnodeÚhouse_namesÚ
house_namerW   s                      r0   Úastrological_subject_to_contextr  j  s£  € ô  �˜gŸl™lÔ+Ð,€Eô �'Ô3Ô4Ù%7‘>¸\ˆØ Ÿ™ qš‘#¨cˆØ�‰Ø”�X w§|¡| n°A°g·m±mÀCÐ5HÈÈ'Ï+É+ÐVYÐIZÐZ[Ð\c×\hÑ\hÐilÐ[mÐmnÐov×o}Ño}ð  Bð  oCð  %Dð  KR÷  KWñ  KWð  `g÷  `nñ  `nð  w~÷  wBñ  wBð  CFð  vGð  QX÷  Q\ñ  Q\ð  ]`ð  Pað  lsð  x÷  xFñ  xFô  Gð  Hð  Iô	
ð ×%Ñ%Ø×2Ñ2Ø×/Ñ/ñ€Lð
 ×ÒØ(/×(=Ñ(=ˆ�_Ñ%Ø	‡L�L�2”cÑ3 lÑ3Ð4Ð5Ô6ô �'Ô0Ô1Ø�‰Ø”Ð%¨G×,HÑ,HÐX_×XmÑXm×XrÑXrð  DK÷  DZñ  DZ÷  D_ñ  D_ô  `ð  að  bô	
ô
 �'Ô,Ô-Ø�‰�rœ#˜m°'×2EÑ2EÔFÐGÐHÔIòÐð& €LØ+ò Lˆ
Ü˜ ¨TÓ2ˆØÑØ×Ñ $Ô'AÀ%Ó'HÐ&IÐ JÕKðLñ
 Ø�‰�rœ"˜Y›-˜Ð)Ô*Ø�‰�\Ô"Ø�‰�rœ"˜Y›-˜Ð)Ô*ò ^€DØ€JØò Iˆ	Ü�w 	¨4Ó0ˆØÑØ×Ñ Ô%?ÀÓ%EÐ$FÐGÕHðIð
 Hò Iˆ	Ü�w 	¨4Ó0ˆØÑØ×Ñ Ô%?ÀÓ%EÐ$FÐGÕHðIñ
 Ø�‰�rœ"˜V›*˜Ð&Ô'Ø�‰�ZÔ Ø�‰�rœ"˜V›*˜Ð&Ô'ò€Kð 
‡L�L�2”b˜“l�^Ð$Ô%Ø!ò ˆ
Ü˜ ¨TÓ2ˆØÑØ�L‰LØ”s˜7¨¯©¸U¿^¹^ÈCÐ<PÔXg×XkÑXkÐlq×lvÑlvÐx}÷  yCñ  yCó  YDô  Eð  Fð  Gõðð 
‡L�L�2”b˜“l�^Ð$Ô%ð ×ÑÐ&Ø�‰�rÔ0°×1DÑ1DÓEÐFÐGÔHà	‡L�L”�G“ÔØ�9‰9�UÓÐr2   Ú
chart_datac                 óè  — t        d| j                  ¬«      g}t        | j                  «      }|j	                  d«      D ]  }|j                  d|› �«       Œ |j                  dt        | j                  «      › �«       |j                  dt        | j                  «      › �«       | j                  rˆ|j                  dt        dt        t        | j                  «      «      ¬«      › �«       | j                  D ]!  }|j                  dt        |d¬	«      › �«       Œ# |j                  dt        d«      › �«       |j                  dt        d
dj!                  | j"                  «      «      › �«       dj!                  | j$                  D �cg c]  }|d   › d|d   › d�‘Œ c}«      }|j                  dt        d|«      › �«       |j                  t        d«      «       dj!                  |«      S c c}w )zó
    Transform a SingleChartDataModel into an XML ``<chart_analysis>`` element.

    Args:
        chart_data: A SingleChartDataModel containing complete chart data.

    Returns:
        A multi-line XML string describing the chart data.
    Úchart_analysisrØ   rœ   r”   Úaspects©Úcountr˜   F)ro   Úactive_pointsú, rP   ú (rx   ú)Úactive_aspects)rG   Ú
chart_typer  r–   Úsplitr8   rµ   rª   r¾   r·   r  r.   Úlenr�   rI   rL   r9   r"  r&  )r  r£   Úsubject_xmlÚlinern   ÚaÚactive_aspects_strs          r0   Úsingle_chart_data_to_contextr.  é  s¿  € ô Ð  z×'<Ñ'<Ô=Ð>€Eô 2°*×2DÑ2DÓE€KØ×!Ñ! $Ó'ò "ˆØ�‰�r˜$˜�[Õ!ð"ð 
‡L�L�2Ô5°j×6UÑ6UÓVÐWÐXÔYØ	‡L�L�2Ô5°j×6UÑ6UÓVÐWÐXÔYð ×ÒØ�‰�rœ"˜Y¬c´#°j×6HÑ6HÓ2IÓ.JÔKÐLÐMÔNØ ×(Ñ(ò 	PˆFØ�L‰L˜4Ô 1°&ÀeÔ LÐMÐNÕOð	Pà�‰�rœ"˜Y›-˜Ð)Ô*ð 
‡L�L�2”c˜/¨4¯9©9°Z×5MÑ5MÓ+NÓOÐPÐQÔRØŸ™È×IbÑIbÖ#cÀA q¨¡y k°°A°e±H°:¸QÒ$?Ò#cÓdÐØ	‡L�L�2”cÐ*Ð,>Ó?Ð@ÐAÔBà	‡L�L”Ð$Ó%Ô&Ø�9‰9�UÓÐùò	 $ds   Æ
G/c                 ó(  — g }| j                   dk(  }|j                  t        d| j                   ¬«      «       |j                  dt        d«      › �«       t        | j                  «      }|j                  d«      D ]  }|j                  d|› �«       Œ |j                  dt        d«      › �«       |rdnd	}|j                  dt        |«      › �«       t        | j                  |¬
«      }|j                  d«      D ]  }|j                  d|› �«       Œ |j                  dt        |«      › �«       | j                  r‰|j                  dt        dt        t        | j                  «      «      ¬«      › �«       | j                  D ]"  }|j                  dt        |d|¬«      › �«       Œ$ |j                  dt        d«      › �«       | j                  �At        | j                  |¬«      }|j                  d«      D ]  }|j                  d|› �«       Œ | j                  �l| j                  }	|j                  dt        dt        |	j                   «      d|	j"                  t        |	j$                  «      j'                  «       ¬«      › �«       |j                  dt)        | j*                  «      › �«       |j                  dt-        | j.                  «      › �«       |j                  dt1        ddj3                  | j4                  «      «      › �«       dj3                  | j6                  D �
cg c]  }
|
d   › d|
d   › d�‘Œ c}
«      }|j                  dt1        d|«      › �«       |j                  t        d«      «       dj3                  |«      S c c}
w )zð
    Transform a DualChartDataModel into an XML ``<chart_analysis>`` element.

    Args:
        chart_data: A DualChartDataModel containing dual chart data.

    Returns:
        A multi-line XML string describing the dual chart data.
    rr   r  rØ   r”   rÕ   rœ   r˜   Útransit_subjectrÖ   )r¿   r  r   T©ro   rp   )rp   Úrelationship_scoreÚ44)r/   ÚmaxÚdescriptionÚdestiny_signr"  r#  rP   r$  rx   r%  r&  )r'  r8   rG   r  rÕ   r(  rI   rÖ   r  r.   r)  r�   r‘   r§   r2  rD   Úscore_valueÚscore_descriptionÚis_destiny_signr€   rµ   rª   r¾   r·   rL   r9   r"  r&  )r  r£   rp   Ú	first_xmlr+  Úwrapper_tagÚ
second_xmlrn   Úhc_xmlÚscorer,  r-  s               r0   Údual_chart_data_to_contextr?    sa  € ð €EØ×&Ñ&¨)Ñ3€Jà	‡L�L”Ð$¨:×+@Ñ+@ÔAÔBð 
‡L�L�2”b˜Ó)Ð*Ð+Ô,Ü/°
×0HÑ0HÓI€IØ—‘ Ó%ò $ˆØ�‰�t˜D˜6�]Õ#ð$à	‡L�L�2”b˜Ó)Ð*Ð+Ô,ñ (2Ñ#Ð7G€KØ	‡L�L�2”b˜“oÐ&Ð'Ô(Ü0°×1JÑ1JÐ_iÔj€JØ× Ñ  Ó&ò $ˆØ�‰�t˜D˜6�]Õ#ð$à	‡L�L�2”b˜“oÐ&Ð'Ô(ð ×ÒØ�‰�rœ"˜Y¬c´#°j×6HÑ6HÓ2IÓ.JÔKÐLÐMÔNØ ×(Ñ(ò 	fˆFØ�L‰L˜4Ô 1°&ÀdÐWaÔ bÐcÐdÕeð	fà�‰�rœ"˜Y›-˜Ð)Ô*ð ×"Ñ"Ð.Ü,¨Z×-HÑ-HÐU_Ô`ˆØ—L‘L Ó&ò 	&ˆDØ�L‰L˜2˜d˜V˜Õ%ð	&ð ×$Ñ$Ð0Ø×-Ñ-ˆØ�‰Ø”Ð)´°U×5FÑ5FÓ1GÈTÐ_d×_vÑ_vô  FIð  JO÷  J_ñ  J_ó  F`÷  Ffñ  Ffó  Fhô  ið  jð  kô	
ð
 
‡L�L�2Ô5°j×6UÑ6UÓVÐWÐXÔYØ	‡L�L�2Ô5°j×6UÑ6UÓVÐWÐXÔYð 
‡L�L�2”c˜/¨4¯9©9°Z×5MÑ5MÓ+NÓOÐPÐQÔRØŸ™È×IbÑIbÖ#cÀA q¨¡y k°°A°e±H°:¸QÒ$?Ò#cÓdÐØ	‡L�L�2”cÐ*Ð,>Ó?Ð@ÐAÔBà	‡L�L”Ð$Ó%Ô&Ø�9‰9�UÓÐùò	 $ds   Ì*NÚtransitc                 óâ  — | j                   rÌt        d| j                  ¬«      g}|j                  dt        dt	        t        | j                   «      «      ¬«      › �«       | j                   D ]"  }|j                  dt        |dd¬«      › �«       Œ$ |j                  dt        d«      › �«       |j                  t        d«      «       d	j                  |«      S t        d| j                  d
¬«      S )zç
    Transform a TransitMomentModel into an XML ``<transit_moment>`` element.

    Args:
        transit: A TransitMomentModel representing a transit snapshot.

    Returns:
        An XML string describing the transit moment.
    Útransit_moment)rÉ   r”   r  r   r˜   Tr1  rœ   Ú0)rÉ   r  )
r  rG   rÉ   r8   r.   r)  r�   rI   r9   rD   )r@  r£   rn   s      r0   Útransit_moment_to_contextrD  M  sÈ   € ð ‡‚ÜÐ$¨7¯<©<Ô8Ð9ˆØ�‰�rœ"˜Y¬c´#°g·o±oÓ2FÓ.GÔHÐIÐJÔKØ—o‘oò 	`ˆFØ�L‰L˜4Ô 1°&ÀdÐW[Ô \Ð]Ð^Õ_ð	`à�‰�rœ"˜Y›-˜Ð)Ô*Ø�‰”RÐ(Ó)Ô*Ø�y‰y˜ÓÐäÐ#¨'¯,©,ÀÔDÐDr2   Útransitsc                 ó  — g }dt        t        | j                  «      «      i}| j                  r| j                  j                  |d<   | j
                  r$| j
                  d   |d<   | j
                  d   |d<   |j                  t        d
i |¤Ž«       | j                  D ]7  }t        |«      }|j                  d«      D ]  }|j                  d	|› �«       Œ Œ9 |j                  t        d«      «       dj                  |«      S )a  
    Transform a TransitsTimeRangeModel into an XML ``<transit_analysis>`` element.

    Args:
        transits: A TransitsTimeRangeModel containing multiple transit moments.

    Returns:
        A multi-line XML string describing the transit time range.
    Úmomentsr–   r   Ú	from_dateéÿÿÿÿÚto_dateÚtransit_analysisrœ   r”   )rK  )r.   r)  rE  r–   rP   Údatesr8   rG   rD  r(  rI   r9   )rE  r£   rb   r@  Útransit_xmlr+  s         r0   Útransits_time_range_to_contextrN  c  sñ   € ð €Eàœc¤# h×&7Ñ&7Ó"8Ó9Ð:€EØ×ÒØ#×+Ñ+×0Ñ0ˆˆiÑØ‡~‚~Ø%Ÿ^™^¨AÑ.ˆˆkÑØ#Ÿ>™>¨"Ñ-ˆˆiÑà	‡L�L”Ñ0¨%Ñ0Ô1à×$Ñ$ò &ˆÜ/°Ó8ˆØ×%Ñ% dÓ+ò 	&ˆDØ�L‰L˜2˜d˜V˜Õ%ñ	&ð&ð
 
‡L�L”Ð&Ó'Ô(Ø�9‰9�UÓÐr2   Úoverviewc           
      ó¾  — t        dt        | j                  «      | j                  ¬«      g}| j                  }|j                  dt        d«      › �«       |j                  �*|j                  dt        d|j                  d›«      › �«       |j                  �(|j                  dt        d|j                  «      › �«       |j                  �(|j                  dt        d	|j                  «      › �«       |j                  �(|j                  dt        d
|j                  «      › �«       |j                  �(|j                  dt        d|j                  «      › �«       |j                  �1|j                  dt        dt        |j                  «      «      › �«       |j                  �(|j                  dt        d|j                  «      › �«       |j                  �(|j                  dt        d|j                  «      › �«       |j                  �H|j                  dt!        d|j                  j"                  |j                  j$                  ¬«      › �«       |j&                  �(|j                  dt        d|j&                  «      › �«       |j(                  �1|j                  dt        dt        |j(                  «      «      › �«       |j*                  �(|j                  dt        d|j*                  «      › �«       |j,                  �1|j                  dt        dt        |j,                  «      «      › �«       |j.                  � |j.                  }i }|j                  �t        |j                  «      |d<   |j                  �|j                  |d<   |j0                  �|j0                  |d<   |j2                  �|j2                  |d<   |j                  dt!        dRi |¤Ž› �«       |j4                  ��g|j4                  }|j                  dt        d«      › �«       |j6                  �¼|j6                  }i }|j8                  �|j8                  d›|d<   |j:                  �|j:                  d›|d<   |j<                  �|j<                  d›|d<   |j>                  �|j>                  d›|d<   |j@                  �|j@                  d›|d<   |j                  d t!        dSi |¤Ž› �«       |jB                  ��ê|jB                  }i }	|jD                  �|jD                  d!›|	d"<   |jF                  �|jF                  |	d#<   |jH                  �|jH                  |	d$<   |j                  �|j                  |	d<   |jJ                  ��D|j                  d t        dTi |	¤Ž› �«       |jJ                  }
i }|
jL                  �|
jL                  |d&<   |
jN                  �·|j                  d't        dUi |¤Ž› �«       |
jN                  }i }|jP                  �|jP                  |d)<   |jR                  �|jR                  |d*<   |jT                  �|jT                  |d+<   |j                  d,t!        dVi |¤Ž› �«       |j                  d'tW        d(«      › �«       n|j                  d't!        dUi |¤Ž› �«       |j                  d tW        d%«      › �«       n|j                  d t!        dTi |	¤Ž› �«       |jX                  ��Ç|jX                  }|j                  d t        d-«      › �«       d.|jZ                  fd/|j\                  fd0|j^                  fd1|j`                  ffD �]G  \  }}|€Œ
|j                  d't        |«      › �«       d2|jb                  fd3|jd                  ffD ]å  \  }}|€Œ	i }|j                  �t        |j                  «      |d<   |j                  �|j                  |d<   |jf                  �t        |jf                  «      |d4<   |jh                  �t        |jh                  «      |d5<   |jj                  �|jj                  |d6<   |jl                  �|jl                  |d7<   |j                  d,t!        |fi |¤Ž› �«       Œç |j                  d'tW        |«      › �«       �ŒJ |j                  d tW        d-«      › �«       |jn                  �‚|jn                  }i }|jp                  �|jp                  d!›|d8<   |jr                  �|jr                  d9›|d:<   |j@                  �|j@                  d›|d<   |j                  d t!        dWi |¤Ž› �«       |j                  dtW        d«      › �«       |jt                  ��þ|jt                  }i }|jv                  �&t        |jv                  «      jy                  «       |d;<   |jz                  �&t        |jz                  «      jy                  «       |d<<   |j|                  ��b|j                  dt        dXi |¤Ž› �«       |j|                  }i }|j~                  �|j~                  |d><   |j€                  �|j€                  |d?<   |j‚                  �|j‚                  d!›|d@<   |j„                  �|j„                  |dA<   |j†                  r‚t‰        |j†                  «      dBkD  rj|j                  d t        dYi |¤Ž› �«       |j†                  D ]   }|j                  d't        dD|«      › �«       Œ" |j                  d tW        dC«      › �«       n|j                  d t!        dYi |¤Ž› �«       |j                  dtW        d=«      › �«       n|j                  dt!        dXi |¤Ž› �«       |j                  dtW        d«      › �«       | jŠ                  ��Ê| jŠ                  }|j                  dt        dE«      › �«       |jŒ                  �1|j                  dt        dFt        |jŒ                  «      «      › �«       |jŽ                  �(|j                  dt        dG|jŽ                  «      › �«       |j�                  �1|j                  dt        dHt        |j�                  «      «      › �«       |j’                  �(|j                  dt        dI|j’                  «      › �«       |j”                  �(|j                  dt        dJ|j”                  «      › �«       |j–                  �(|j                  dt        dK|j–                  «      › �«       |j6                  �‚|j6                  }i }|j8                  �|j8                  d›|d<   |j:                  �|j:                  d›|d<   |j<                  �|j<                  d›|d<   |j                  dt!        dSi |¤Ž› �«       |j˜                  � |j˜                  }i }|j                  �t        |j                  «      |d<   |j                  �|j                  |d<   |j0                  �|j0                  |d<   |j2                  �|j2                  |d<   |j                  dt!        dZi |¤Ž› �«       |j                  dtW        dE«      › �«       | jš                  �Ò| jš                  }i }|jœ                  �|jœ                  |dL<   |jž                  �|jž                  |dM<   |j                   �t        |j                   «      |dN<   |j¢                  �&t        |j¢                  «      jy                  «       |dO<   |j¤                  �|j¤                  |dP<   |j                  dt!        d[i |¤Ž› �«       |j                  tW        d«      «       dQj§                  |«      S )\a’  
    Transform a MoonPhaseOverviewModel into an XML ``<moon_phase_overview>`` element.

    Provides a comprehensive description of the current lunar phase, sun info,
    and location context. All optional/None fields are omitted.

    Args:
        overview: A MoonPhaseOverviewModel containing moon phase details.

    Returns:
        A multi-line XML string describing the moon phase overview.
    Úmoon_phase_overview)Ú	timestampÚ	datestampr”   rÚ   r˜   rf   z.3fÚ
phase_nameÚmajor_phaseÚstageÚilluminationÚage_daysÚlunar_cyclerh   rÐ   )Úsun_signÚ	moon_signÚmoonriseÚmoonrise_timestampÚmoonsetÚmoonset_timestamprR  rS  rs   Úvisibility_regionsÚdetailedrO   ÚaltitudeÚazimuthÚdistanceÚparallactic_angleÚphase_anglez      z.1fÚvisible_hoursÚbest_viewing_timeÚvisibility_ratingÚ
visibilityÚphase_qualityz        Úviewing_conditionsÚfiltersÚ	telescopeÚbest_magnificationz
          Úupcoming_phasesÚnew_moonÚfirst_quarterÚ	full_moonÚlast_quarterÚlastÚnextÚdays_agoÚ
days_aheadrP   r5  Ú
percentager[   Úvisible_fractionÚmoonrise_visibleÚmoonset_visibleÚeventsÚ
start_timeÚend_timeÚduration_hoursÚviewing_qualityr   Úoptimal_viewing_periodÚrecommendationrÙ   ÚsunriseÚsunrise_timestampÚsunsetÚsunset_timestampÚ
solar_noonÚ
day_lengthÚlatitudeÚ	longitudeÚ	precisionÚusing_default_locationÚnoterœ   )Únext_lunar_eclipse)rQ   )rj  )rl  )Úrecommended_equipment)Úillumination_details)r}  )r‚  )Únext_solar_eclipse)Úlocation)TrG   r.   rR  rS  rÚ   r8   rf   rL   rT  rU  rV  rW  rX  rY  rh   rÐ   rD   rZ  r[  r\  r]  r^  r_  r�  rs   r`  ra  rQ   rb  rc  rd  re  rf  rj  rg  rh  ri  rl  rk  r�  rm  rn  ro  rI   rp  rq  rr  rs  rt  ru  rv  rw  rx  rP   r5  r‘  ry  rz  r}  r{  r€   r|  r‚  r~  r  r€  r�  Úrecommendationsr)  rÙ   r„  r…  r†  r‡  rˆ  r‰  r’  r“  rŠ  r‹  rŒ  r�  rŽ  r9   ) rO  r£   rÚ   ÚeclÚ	ecl_attrsra  ÚposÚ	pos_attrsÚvisÚ	vis_attrsÚvcÚvc_attrsÚeqÚeq_attrsÚupÚ	phase_tagÚphase_windowÚ
moment_tagÚmomentÚm_attrsÚillÚ	ill_attrsÚevÚev_attrsÚovpÚ	ovp_attrsÚrecrÙ   Úsp_attrsÚse_attrsÚlocÚ	loc_attrss                                    r0   Úmoon_phase_overview_to_contextr°  �  s%  € ô Ð%´°X×5GÑ5GÓ1HÐT\×TfÑTfÔgÐh€Eð �=‰=€DØ	‡L�L�2”b˜“j�\Ð"Ô#ð ‡z�zÐØ�‰�tœC ¨D¯J©J°sÐ+;Ó=Ð>Ð?Ô@Ø‡�Ð"Ø�‰�tœC ¨d¯o©oÓ>Ð?Ð@ÔAØ×ÑÐ#Ø�‰�tœC ¨t×/?Ñ/?Ó@ÐAÐBÔCØ‡z�zÐØ�‰�tœC ¨¯©Ó4Ð5Ð6Ô7Ø×ÑÐ$Ø�‰�tœC °×0AÑ0AÓBÐCÐDÔEØ‡}�}Ð Ø�‰�tœC 
¬C°·±Ó,>Ó?Ð@ÐAÔBØ×ÑÐ#Ø�‰�tœC ¨t×/?Ñ/?Ó@ÐAÐBÔCØ‡z�zÐØ�‰�tœC ¨¯©Ó4Ð5Ð6Ô7ð ‡{�{ÐØ�‰�tœC °4·;±;×3GÑ3GÐSW×S^ÑS^×ShÑShÔiÐjÐkÔlð ‡}�}Ð Ø�‰�tœC 
¨D¯M©MÓ:Ð;Ð<Ô=Ø×ÑÐ*Ø�‰�tœCÐ 4´c¸$×:QÑ:QÓ6RÓSÐTÐUÔVØ‡|�|ÐØ�‰�tœC 	¨4¯<©<Ó8Ð9Ð:Ô;Ø×ÑÐ)Ø�‰�tœCÐ 3´S¸×9OÑ9OÓ5PÓQÐRÐSÔTð ×ÑÐ*Ø×%Ñ%ˆØˆ	Ø�=‰=Ð$Ü%(¨¯©Ó%7ˆI�kÑ"Ø�=‰=Ð$Ø%(§]¡]ˆI�kÑ"Ø�8‰8ÐØ #§¡ˆI�fÑØ×!Ñ!Ð-Ø.1×.DÑ.DˆIÐ*Ñ+Ø�‰�tœCÑB¸	ÑBÐCÐDÔEð ‡}�}Ñ Ø—=‘=ˆØ�‰�tœB˜z›NÐ+Ð,Ô-ð ×ÑÐ(Ø×#Ñ#ˆCØ ˆIØ�|‰|Ð'Ø+.¯<©<¸Ð*<�	˜*Ñ%Ø�{‰{Ð&Ø*-¯+©+°cÐ):�	˜)Ñ$Ø�|‰|Ð'Ø+.¯<©<¸Ð*<�	˜*Ñ%Ø×$Ñ$Ð0Ø47×4IÑ4IÈ#Ð3N�	Ð-Ñ.Ø�‰Ð*Ø.1¯o©o¸cÐ-B�	˜-Ñ(Ø�L‰L˜6¤#Ñ">°IÑ">Ð!?Ð@ÔAð ×ÑÑ*Ø×%Ñ%ˆCØ ˆIØ× Ñ Ð,Ø03×0AÑ0AÀ#Ð/F�	˜/Ñ*Ø×$Ñ$Ð0Ø14×1FÑ1F�	Ð-Ñ.Ø×$Ñ$Ð0Ø14×1FÑ1F�	Ð-Ñ.Ø×ÑÐ+Ø,/×,<Ñ,<�	˜.Ñ)à×%Ñ%Ñ1Ø—‘˜v¤bÑ&C¸Ñ&CÐ%DÐEÔFØ×+Ñ+�Ø!#�Ø×#Ñ#Ð/Ø02×0@Ñ0@�H˜_Ñ-à×+Ñ+Ð7Ø—L‘L 8¬BÑ,PÀxÑ,PÐ+QÐ!RÔSØ×1Ñ1�BØ%'�HØ—z‘zÐ-Ø.0¯j©j˜ Ñ+Ø—|‘|Ð/Ø02·±˜ Ñ-Ø×,Ñ,Ð8Ø9;×9NÑ9N˜Ð!5Ñ6Ø—L‘L :¬cÑ.VÈXÑ.VÐ-WÐ!XÔYØ—L‘L 8¬BÐ/CÓ,DÐ+EÐ!FÕGà—L‘L 8¬CÑ,QÈÑ,QÐ+RÐ!SÔTØ—‘˜v¤b¨Ó&6Ð%7Ð8Õ9à—‘˜v¤cÑ&D¸)Ñ&DÐ%EÐFÔGð ×#Ñ#Ñ/Ø×)Ñ)ˆBØ�L‰L˜6¤"Ð%6Ó"7Ð!8Ð9Ô:à˜RŸ[™[Ð)Ø  "×"2Ñ"2Ð3Ø˜bŸl™lÐ+Ø §¡Ð1ð	,ó =Ñ'�	˜<ð  Ñ+Ø—L‘L 8¬B¨y«M¨?Ð!;Ô<Ø06¸×8IÑ8IÐ/JÈVÐUa×UfÑUfÐLgÐ.hò TÑ*˜
 FØ!Ñ-Ø,.˜GØ%×/Ñ/Ð;Ü7:¸6×;KÑ;KÓ7L ¨Ñ 4Ø%×/Ñ/Ð;Ø7=×7GÑ7G ¨Ñ 4Ø%Ÿ™Ð:Ü69¸&¿/¹/Ó6J ¨
Ñ 3Ø%×0Ñ0Ð<Ü8;¸F×<MÑ<MÓ8N ¨Ñ 5Ø%Ÿ{™{Ð6Ø28·+±+ ¨¡Ø%×1Ñ1Ð=Ø9?×9KÑ9K ¨Ñ 6Ø!ŸL™L¨:´c¸*Ñ6PÈÑ6PÐ5QÐ)RÕSðTð  —L‘L 8¬B¨y«M¨?Ð!;Ö<ð1=ð2 �L‰L˜6¤"Ð%6Ó"7Ð!8Ð9Ô:ð ×(Ñ(Ð4Ø×/Ñ/ˆCØ ˆIØ�~‰~Ð)Ø-0¯^©^¸CÐ,@�	˜,Ñ'Ø×#Ñ#Ð/Ø36×3GÑ3GÈÐ2L�	Ð,Ñ-Ø�‰Ð*Ø.1¯o©o¸cÐ-B�	˜-Ñ(Ø�L‰L˜6¤#Ñ"JÀ	Ñ"JÐ!KÐLÔMà�‰�tœB˜z›NÐ+Ð,Ô-ð ‡{�{ÑØ�[‰[ˆØˆØ×ÑÐ*Ü+.¨r×/BÑ/BÓ+C×+IÑ+IÓ+KˆHÐ'Ñ(Ø×ÑÐ)Ü*-¨b×.@Ñ.@Ó*A×*GÑ*GÓ*IˆHÐ&Ñ'à×$Ñ$Ñ0Ø�L‰L˜4¤Ñ 8¨xÑ 8Ð9Ð:Ô;Ø×+Ñ+ˆCØ ˆIØ�~‰~Ð)Ø*-¯.©.�	˜,Ñ'Ø�|‰|Ð'Ø(+¯©�	˜*Ñ%Ø×!Ñ!Ð-Ø14×1CÑ1CÀCÐ0H�	Ð*Ñ+Ø×"Ñ"Ð.Ø/2×/BÑ/B�	Ð+Ñ,à×"Ò"¤s¨3×+>Ñ+>Ó'?À!Ò'CØ—‘˜v¤bÑ&OÀYÑ&OÐ%PÐQÔRØ×.Ñ.ò J�CØ—L‘L 8¬CÐ0@À#Ó,FÐ+GÐ!HÕIðJà—‘˜v¤bÐ)AÓ&BÐ%CÐDÕEà—‘˜v¤cÑ&PÀiÑ&PÐ%QÐRÔSØ�L‰L˜4¤ 8£˜~Ð.Õ/à�L‰L˜4¤Ñ 9°Ñ 9Ð:Ð;Ô<à	‡L�L�2”b˜“j�\Ð"Ô#ð ‡|�|ÑØ�l‰lˆØ�‰�rœ"˜U›)˜Ð%Ô&à�;‰;Ð"Ø�L‰L˜4¤ I¬s°3·;±;Ó/?Ó @ÐAÐBÔCØ× Ñ Ð,Ø�L‰L˜4¤Ð$7¸×9NÑ9NÓ OÐPÐQÔRØ�:‰:Ð!Ø�L‰L˜4¤ H¬c°#·*±*«oÓ >Ð?Ð@ÔAØ×ÑÐ+Ø�L‰L˜4¤Ð$6¸×8LÑ8LÓ MÐNÐOÔPØ�>‰>Ð%Ø�L‰L˜4¤ L°#·.±.Ó AÐBÐCÔDØ�>‰>Ð%Ø�L‰L˜4¤ L°#·.±.Ó AÐBÐCÔDà�<‰<Ð#Ø—,‘,ˆCØˆHØ�|‰|Ð'Ø*-¯,©,°sÐ);�˜Ñ$Ø�{‰{Ð&Ø),¯©°SÐ(9�˜Ñ#Ø�|‰|Ð'Ø*-¯,©,°sÐ);�˜Ñ$Ø�L‰L˜4¤Ñ ;°(Ñ ;Ð<Ð=Ô>à×!Ñ!Ð-Ø×(Ñ(ˆCØˆHØ�}‰}Ð(Ü(+¨C¯M©MÓ(:�˜Ñ%Ø�}‰}Ð(Ø(+¯©�˜Ñ%Ø�x‰xÐ#Ø#&§8¡8�˜Ñ Ø×%Ñ%Ð1Ø14×1GÑ1G�Ð-Ñ.Ø�L‰L˜4¤Ñ E¸HÑ EÐFÐGÔHà�‰�rœ"˜U›)˜Ð%Ô&ð ×ÑÐ$Ø×ÑˆØˆ	Ø�<‰<Ð#Ø$'§L¡LˆI�jÑ!Ø�=‰=Ð$Ø%(§]¡]ˆI�kÑ"Ø�=‰=Ð$Ü%(¨¯©Ó%7ˆI�kÑ"Ø×%Ñ%Ð1Ü25°c×6PÑ6PÓ2Q×2WÑ2WÓ2YˆIÐ.Ñ/Ø�8‰8ÐØ #§¡ˆI�fÑØ�‰�rœ#Ñ6¨IÑ6Ð7Ð8Ô9à	‡L�L”Ð)Ó*Ô+Ø�9‰9�UÓÐr2   Úmodelc                 ó  — t        | t        «      rt        | «      S t        | t        «      rt	        | «      S t        | t
        «      rt        | «      S t        | t        «      rt        | «      S t        | t        «      rt        | «      S t        | t        t        t        f«      rt        | «      S t        | t        «      rt!        | «      S t        | t"        «      rt%        | «      S t        | t&        «      rt)        | «      S t        | t*        «      rt-        | «      S t        | t.        «      rt1        | «      S t        | t2        «      rt5        | «      S t        | t6        «      rt9        | «      S t;        dt=        | «      j>                  › d�«      ‚)ax  
    Main dispatcher function to convert any Kerykeion model to XML context.

    This function automatically detects the model type and routes to the
    appropriate transformer function.

    Args:
        model: Any supported Kerykeion Pydantic model.

    Returns:
        A string containing the XML representation of the model.

    Raises:
        TypeError: If the model type is not supported.

    Example:
        >>> from kerykeion import AstrologicalSubjectFactory, to_context
        >>> subject = AstrologicalSubjectFactory.from_birth_data(...)
        >>> context = to_context(subject)
        >>> print(context)
    zUnsupported model type: aW  . Supported types are: KerykeionPointModel, LunarPhaseModel, AstrologicalSubjectModel, CompositeSubjectModel, PlanetReturnModel, AspectModel, SingleChartDataModel, DualChartDataModel, ElementDistributionModel, QualityDistributionModel, TransitMomentModel, TransitsTimeRangeModel, PointInHouseModel, HouseComparisonModel, MoonPhaseOverviewModel) r  r   r.  r   r?  r   rN  r   rD  r   r°  r   r	   r
   r  r   rc   r   rm   r   r�   r   rµ   r   r¾   r   r�   r   r§   Ú	TypeErrorrs   Ú__name__)r±  s    r0   Ú
to_contextrµ  ’  sU  € ôP �%Ô-Ô.Ü+¨EÓ2Ð2Ü	�EÔ-Ô	.Ü)¨%Ó0Ð0Ü	�EÔ1Ô	2Ü-¨eÓ4Ð4Ü	�EÔ-Ô	.Ü(¨Ó/Ð/Ü	�EÔ1Ô	2Ü-¨eÓ4Ð4Ü	�EÔ4Ô6KÔM^Ð_Ô	`Ü.¨uÓ5Ð5Ü	�EÔ.Ô	/Ü)¨%Ó0Ð0Ü	�Eœ?Ô	+Ü% eÓ,Ð,Ü	�Eœ;Ô	'Ü  Ó'Ð'Ü	�EÔ3Ô	4Ü.¨uÓ5Ð5Ü	�EÔ3Ô	4Ü.¨uÓ5Ð5Ü	�EÔ,Ô	-Ü(¨Ó/Ð/Ü	�EÔ/Ô	0Ü*¨5Ó1Ð1äØ&¤t¨E£{×';Ñ';Ð&<ð =Nð Oó
ð 	
r2   )rµ  rc   rm   r�   r�   r§   rµ   r¾   r  r.  r?  rD  rN  r°  Ú__main__)Úastrological_subject_factory)ÚChartDataFactoryzTest Subjectz1990-01-01T12:00:00ZzNew YorkÚUSg^KÈ=[D@gªñÒMb€RÀ)rP   Úiso_utc_timerÊ   rË   rÌ   rÍ   )r–   N)FF)F):Ú__doc__Útypingr   Úxml.sax.saxutilsr   r   Úkerykeion.schemas.kr_modelsr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r^   r.   r1   r=   rD   rG   rI   rL   rc   rm   Úboolr�   r�   r§   rµ   r¾   r  r.  r?  rD  rN  r°  rµ  Ú__all__r´  Ú	kerykeionr·  Úkerykeion.chart_data_factoryr¸  ÚAstrologicalSubjectFactoryÚfrom_iso_utc_timeÚnatal_modelÚcreate_natal_chart_datar  ÚcontextÚprintrA   r2   r0   ú<module>rÉ     sÊ  ðñõ ß .÷÷ ÷ ÷ ñ ð* ØØØØØØØØØØØñ€ð*�#ó ð
!˜ó !ð*ˆSð *˜só *ð
(ˆCð (˜có (ð
ˆCð �Có ð
6ˆSð 6 Só 6ð)!Ð&9ð )!¸có )!ðX¨ð ¸Có ñ..
˜kð .
¸ð .
ÐRVð .
Ðcfó .
ðb*Ð.?ð *ÀCó *ñ@:Ð2Fð :ÐTXð :Ðehó :ðzÐ2Jð Èsó ð.Ð2Jð Èsó ð. tyñ|ØÐ+Ð-BÐDUÐUÑVð|Ølpð|àó|ð~"Ð-Að "Àcó "ðJ<Ð+=ð <À#ó <ð~EÐ'9ð E¸có Eð,Ð-Cð Èó ð<IÐ-Cð IÈó IðbK
ØØØØ ØØØØØØ Ø ØØØØØð	 ñðK
ð$ 	ó%K
ò\€ð$ ˆzÒÝ6Ý=à.×IÑI×[Ñ[ØØ+ØØØØð \ó €Kð :Ð!×9Ñ9À+ÔN€Já˜Ó$€Gá	ˆ'…Nð# r2   