Ë
    Š‰Œj�F  ã                  ó¨   — d Z ddlmZ ddlZddlmZ ddlmZ dZdZ	dZ
 ed	¬
«       G d„ d«      «       Zdd„Zdd„Zdd„Zdd„Zdd„Z G d„ d«      Zy)uA  The guided EXCURSION â€” a continuous narrated flight over the venue's surroundings.

Filler for the pauses in a broadcast day: the camera leaves the course, glides past the places
that stand around the water while a guide speaks about them, and comes home â€” a small scenic
flight, never a slideshow. The one rule that shapes everything here is that the aim point is
ALWAYS MOVING (Ulf 2026-08-10): the tour never parks at a stop; a long narration slows the leg
that carries it rather than halting the flight.

This module is pure â€” no clock, no store, no server (the `cruise_tour.py` discipline). It emits
one `tour_poi` beat per second with an interpolated aim point; the renderer's one critically
damped camera spring (scene.js `_driveCamera`, retuned to TOUR) turns that 1 Hz stair-step into
smooth flight, trailing the aim by design. Three beat fields beyond the landmark tour's:

  * `poiBearingDeg` â€” the TRUE compass bearing from the aim point to where the camera should
    stand: the travel bearing + 180Â°, so the camera flies BEHIND the aim looking forward along
    the route. Blended by shortest delta over a few seconds at leg joins (angles wrap â€” root
    CLAUDE.md); the renderer converts to its scene azimuth, this module never knows scene axes.
  * `poiSpeedMps` â€” present only on the recall home-run: raises the renderer's spring cap for
    the express return (with headroom over the aim's own ground speed, or the camera could
    never close on it).
  * `focusUntilSec = t + 3` â€” each beat expires almost immediately, so a stalled feed releases
    the camera instead of pinning it to the last aim point for ever.

WHAT it flies to is event data (`venue.tourSites`, published beside `venue.landmarks`), never
authored here: a flat catalogue of `{name, lat, lon, line?, tour?}`. `line` optional â€” an entry
without one is a shape point that bends the path silently. Entries sharing a `tour` id form a
STORY ROUTE (the Vasa story, the LidingÃ¶ Runt loop): an indivisible, ordered unit the planner
flies whole, chapters in listed order, never re-sorted and never interleaved with other sites.

Eligibility is COMPUTED, never tagged: a unit qualifies when every point lies within `radius_m`
of home (None = unbounded â€” the cruise day's whole catalogue) and its flight time fits the
`excursion_target_s` budget. On a race day the caller derives a conservative radius from the return
knobs (`recall_speed_mps * recall_budget_s`). The broadcast's ARM is now both recall and immediate
programme hand-over, so the venue/course opening re-establishes the picture without delaying the
countdown; keeping the waiting flight local makes that transition visually coherent. `recall()`
remains the graceful return for callers that have advance notice: the remaining route is replaced
by a single home leg while narration already playing is allowed to finish.
é    )ÚannotationsN)Ú	dataclass)Ú_speech_secondsé   é   g      ø?T)Úfrozenc                  ó‚   — e Zd ZU dZdZded<   dZded<   dZded<   d	Zded
<   dZ	ded<   dddd
ddœZ
edd„«       Zdd„Zy)ÚExcursionConfigu¸   The excursion's knobs. Defaults here; an event overrides via the same `presentation.cruise`
    (camelCase) block the tour's other knobs ride â€” event data, never a renderer constant.é   ÚintÚexcursion_speed_mpséð   Úexcursion_standoff_miX  Úexcursion_target_séF   Úrecall_speed_mpsé<   Úrecall_budget_s)ÚexcursionSpeedMpsÚexcursionStandoffMÚexcursionTargetSÚrecallSpeedMpsÚrecallBudgetSc                ó(  — i }| j                   j                  «       D ]l  \  }}|xs i j                  |«      }t        |t        t
        f«      sŒ2t        |t        «      rŒCt        j                  |«      sŒY|dk\  sŒ_t	        |«      ||<   Œn  | di |¤ŽS )u»   `presentation.cruise` â†’ a config; unknown keys ignored, non-numeric values ignored (a
        malformed knob falls back to the default rather than crashing the show â€” `CruiseConfig`).r   © )	Ú_KEYSÚitemsÚgetÚ
isinstancer   ÚfloatÚboolÚmathÚisfinite)ÚclsÚblockÚkwargsÚwireÚ
field_nameÚvs         ú</srv/vr/releases/25f455cc4e75/v3/broadcast/live/excursion.pyÚ	from_metazExcursionConfig.from_metaH   s„   € ð ˆØ #§	¡	§¡Ó 1ò 	,ÑˆD�*Ø’˜"×!Ñ! $Ó'ˆAÜ˜!œc¤5˜\Õ*´:¸aÄÕ3FÌ4Ï=É=ÐYZÕK[Ð`aÐefÓ`fÜ%(¨£V��zÒ"ð	,ñ ‰}�V‰}Ðó    c                ón   — t        t        d| j                  «      t        d| j                  «      z  «      S )z²The race-day eligibility radius, computed from the return knobs and never tagged on a
        site. It keeps waiting excursions local even when ARM hands directly to the opening.é   )r    Úmaxr   r   ©Úselfs    r*   Úrecall_radius_mzExcursionConfig.recall_radius_mS   s.   € ô ”S˜˜D×1Ñ1Ó2´S¸¸D×<PÑ<PÓ5QÑQÓRÐRr,   N)r%   zdict | NoneÚreturnr
   )r3   r    )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Ú__annotations__r   r   r   r   r   Úclassmethodr+   r2   r   r,   r*   r
   r
   8   sn   … ñ`à!Ð˜Ó!Ø #Ð˜#Ó#Ø!Ð˜Ó!ØÐ�cÓØ€O�SÓà"7Ø#9Ø!5Ø1Ø/ñ	1€Eð òó ðôSr,   r
   c                ó¨   — dt        j                  t        j                  | |z   dz  «      «      z  }t        j                  ||z
  |z  || z
  dz  «      S )Ng    €-û@r   g    àþú@)r"   ÚcosÚradiansÚhypot©Úlat0Úlon0Úlat1Úlon1Úkxs        r*   Ú_dist_mrD   [   sJ   € Ø	”T—X‘XœdŸl™l¨D°4©K¸1Ñ+<Ó=Ó>Ñ	>€BÜ�:‰:�t˜d‘{ bÑ(¨4°$©;¸)Ñ*CÓDÐDr,   c                óÈ   — t        j                  t        j                  | |z   dz  «      «      }t        j                  t        j                  ||z
  |z  || z
  «      «      dz  S )zDTRUE compass bearing from point 0 to point 1 (0 = north, 90 = east).r   ç     €v@)r"   r;   r<   ÚdegreesÚatan2r>   s        r*   Ú_bearing_degrI   `   sN   € ä	�‰”$—,‘,  t¡¨qÑ0Ó1Ó	2€BÜ�<‰<œŸ
™
 D¨4¡K°2Ñ#5°t¸d±{ÓCÓDÀuÑLÐLr,   c                ó   — || z
  dz   dz  dz
  S )uV   Shortest signed delta aâ†’b in degrees â€” bearings live on a circle (root CLAUDE.md).g     à€@rF   ç     €f@r   )ÚaÚbs     r*   Ú_wrap_deltarN   f   s   € à�‰U�U‰]˜eÑ# uÑ,Ð,r,   c                ó°  — g }| xs g D ]Ê  }t        |t        «      sŒ|j                  d«      |j                  d«      }}t        |t        t        f«      r@t        |t        t        f«      r*t        j                  |«      rt        j                  |«      sŒ�t        |j                  d«      xs d«      j                  «       sŒº|j                  |«       ŒÌ |S )u  Entries a camera can actually be aimed at: finite lat/lon and a non-empty name (the plate
    reads the name of the site being approached, a nameless aim point would blank it). Anything
    else is dropped â€” an invalid entry must never reach the geometry (the sensor-values rule).ÚlatÚlonÚnameÚ )
r   Údictr   r   r    r"   r#   ÚstrÚstripÚappend)ÚsitesÚoutÚsrP   rQ   s        r*   Ú_valid_sitesr[   m   sª   € ð €CØŠ[�bò 	ˆÜ˜!œTÔ"ØØ—5‘5˜“< §¡ u£ˆSˆÜ˜3¤¤e Ô-´*¸SÄ3ÌÀ,Ô2OÜ—M‘M #Ô&¬4¯=©=¸Ô+=ØÜ�1—5‘5˜“=Ò& BÓ'×-Ñ-Ô/ØØ�
‰
�1�ð	ð €Jr,   c                ó  — g }i }| D ]v  }t        |j                  d«      xs d«      j                  «       }|s|j                  |g«       ŒD||v r||   j                  |«       Œ]|g||<   |j                  ||   «       Œx |S )z´Route units in catalogue order: a free site is its own unit; sites sharing a `tour` id form
    ONE ordered unit (chapters in listed order), seated where its first chapter appears.ÚtourrS   )rU   r   rV   rW   )rX   ÚunitsÚby_tourrZ   Útids        r*   Ú_unitsra      s‰   € ð !€EØ%'€GØò 'ˆÜ�!—%‘%˜“-Ò% 2Ó&×,Ñ,Ó.ˆÙØ�L‰L˜!˜ÕØ�G‰^Ø�C‰L×Ñ Õ"à˜3ˆG�C‰LØ�L‰L˜ ™Õ&ð'ð €Lr,   c                  ó¶   — e Zd ZdZdddddœ	 	 	 	 	 	 	 dd„Zedd„«       Zedd„«       Zdd„Zdd„Z	dd	„Z
ddd
„Zdd„Ze	 	 	 	 	 	 dd„«       Zdd„Zdd„Zdd„Zy)Ú	Excursiona  One planner/flyer, owned by a driver (the cruise scheduler on its excursion laps, the
    waiting picture directly). `begin(t)` plans a route and starts flying; `tick(t)` returns this
    second's beat; `recall(t)` turns for home; `update_sites` swaps the catalogue live.N)rX   ÚcentreÚradius_mÚ	home_namec               ó.  — || _         t        |«      | _        |d uxr" t        |«      dk(  xr t	        d„ |D «       «      }|rt        |d   «      t        |d   «      fnd | _        || _        || _        d| _	        g | _
        d | _        d| _        d| _        y )Nr   c              3  óv   K  — | ]1  }t        |t        t        f«      xr t        j                  |«      –— Œ3 y ­w©N)r   r   r    r"   r#   )Ú.0Úcs     r*   ú	<genexpr>z%Excursion.__init__.<locals>.<genexpr>›   s-   è ø€ Ò^ÐRSœZ¨¬C´¨<Ó8ÒM¼T¿]¹]È1Ó=MÓMÑ^ùs   ‚79r   r.   F)Úcfgr[   rX   ÚlenÚallr    rd   re   rf   Ú_nÚ_legsÚ_iÚ_leg_t0Ú	_recalled)r1   rm   rX   rd   re   rf   Ú	ok_centres          r*   Ú__init__zExcursion.__init__•   s�   € ð ˆŒÜ! %Ó(ˆŒ
Ø 4Ð'ò _¬C°«K¸1Ñ,<ò _ÜÑ^ÐW]Ô^Ó^ð 	á>G”u˜V A™YÓ'¬¨v°a©yÓ)9Ñ:ÈTˆŒØ ˆŒà"ˆŒØˆŒØ!#ˆŒ
Ø"ˆŒØˆŒØˆ�r,   c                ó   — | j                   d uS ri   ©rr   r0   s    r*   ÚflyingzExcursion.flying¨   s   € à�w‰w˜dÐ"Ð"r,   c                ó   — | j                   d u S ri   rx   r0   s    r*   ÚdonezExcursion.done¬   s   € à�w‰w˜$ˆÐr,   c                óT   — | j                   duxr t        | j                  «       «      S )u¶   Is there anything to fly at all â€” a home point and at least one unit that fits the
        radius AND the time budget? (What `cruise_tour` asks before scheduling an excursion lap.)N)rd   r!   Ú_plan_router0   s    r*   Ú	availablezExcursion.available°   s&   € ð �{‰{ $Ð&ÒC¬4°×0@Ñ0@Ó0BÓ+CÐCr,   c                óR   — t        |«      }|r|sy|| j                  k7  }|| _        |S )u¸  Swap the catalogue mid-broadcast (an operator â€” or Claude â€” republished the event).
        Returns whether anything changed. A publish whose every entry is invalid keeps the working
        catalogue (hold-last: a malformed read must not blank a running tour), while a deliberate
        EMPTY list is honoured â€” that is how the tour is retired by data. Legs already planned
        keep flying; the next `begin()` sees the new list.F)r[   rX   )r1   rX   ÚfreshÚchangeds       r*   Úupdate_siteszExcursion.update_sitesµ   s0   € ô ˜UÓ#ˆÙ™ØØ˜4Ÿ:™:Ñ%ˆØˆŒ
Øˆr,   c                ó$  — t        d| j                  j                  «      }d||}}}|D ]d  }t        |||d   |d   «      |z  }	t	        |j                  d«      xs d«      }
|t        |	|
rt        |
«      t        z   nd«      z  }|d   |d   }}Œf |S )u©   Estimated flying time through a unit from a given point â€” each leg the LONGER of its
        travel time and its narration (a long line slows the leg, never stops it).r.   ç        rP   rQ   ÚlinerS   )r/   rm   r   rD   rU   r   r   ÚSAY_MARGIN_S)r1   ÚunitÚfrom_latÚfrom_lonÚspeedÚtotalÚlaÚlorZ   Útravelr…   s              r*   Ú_unit_time_szExcursion._unit_time_sÄ   s¢   € ô �A�t—x‘x×3Ñ3Ó4ˆØ˜X x�2ˆrˆØò 	(ˆAÜ˜R  Q u¡X¨q°©xÓ8¸5Ñ@ˆFÜ�q—u‘u˜V“}Ò*¨Ó+ˆDØ”S˜É4¤/°$Ó"7¼,Ò"FÐUXÓYÑYˆEØ�u‘X˜q ™x�‰Bð		(ð
 ˆr,   c                ó   ‡ ‡‡‡‡— ‰ j                   €g S ‰ j                   \  ŠŠt        ‰ j                  «      }‰ j                  �%|D �cg c]  }t	        ˆˆˆ fd„|D «       «      r|‘Œ }}|sg S t        d‰ j                  j                  «      }|€‰ j                  n|t        |«      z  }||d |d| z   }g }d}‰‰cŠŠ|rº|s|d   nt        |ˆˆfd„¬«      }	‰ j                  |	‰‰«      }
t        |	d   d	   |	d   d
   ‰‰«      |z  }||
z   |z   ‰ j                  j                  k  r9|j                  |	«       |j                  |	«       ||
z  }|	d   d	   |	d   d
   cŠŠn|s|j!                  d«       n	 |S |rŒº|S c c}w )u9  The deterministic route for excursion `n`: eligible units (every point within the
        radius), the starting unit rotated by `n`, then nearest-neighbour among the rest â€” a story
        route always whole, in chapter order. Units are added only while the running total plus
        the flight home fits `excursion_target_s`; a unit too long for the whole budget simply
        never flies until an event raises the budget. No randomness anywhere â€” the same catalogue
        and the same counter always plan the same route (the scheduler is pure and replayable).Nc              3  ó`   •K  — | ]%  }t        ‰‰|d    |d   «      ‰j                  k  –— Œ' y­w)rP   rQ   N)rD   re   )rj   rZ   ÚclatÚclonr1   s     €€€r*   rl   z(Excursion._plan_route.<locals>.<genexpr>Ý   s.   øè ø€ Ò`ÐYZœG D¨$°°%±¸!¸E¹(ÓCÀtÇ}Á}ÕTÑ`ùs   ƒ+.r.   r„   r   c                ó8   •— t        ‰‰| d   d   | d   d   «      S )Nr   rP   rQ   )rD   )ÚurP   rQ   s    €€r*   ú<lambda>z'Excursion._plan_route.<locals>.<lambda>é   s"   ø€ ¬7°3¸¸Q¸q¹TÀ%¹[È!ÈAÉ$ÈuÉ+Ó+V€ r,   )ÚkeyéÿÿÿÿrP   rQ   )rd   ra   rX   re   ro   r/   rm   r   rp   rn   Úminr�   rD   r   ÚremoverW   Úpop)r1   Únr^   r•   rŠ   ÚkÚpoolÚrouteÚusedÚnxtÚt_unitÚt_homer’   r“   rP   rQ   s   `           @@@@r*   r}   zExcursion._plan_routeÐ   sœ  ü€ ð �;‰;ÐØˆIØ—[‘[‰
ˆˆdÜ�t—z‘zÓ"ˆØ�=‰=Ð$Ø %ö b˜1ÜÕ`Ð^_Ô`Ô`ò ð bˆEð báØˆIÜ�A�t—x‘x×3Ñ3Ó4ˆØ˜	ˆT�WŠW q¬C°«JÑ6ˆØ�Q�Rˆy˜5  !˜9Ñ$ˆØ"$ˆØˆØ˜ˆˆˆSÙá"'�4˜’7Ü�tÔ!VÔWð à×&Ñ& s¨C°Ó5ˆFÜ˜S ™W U™^¨S°©W°U©^¸TÀ4ÓHÈ5ÑPˆFØ�f‰}˜vÑ%¨¯©×)DÑ)DÒDØ—‘˜CÔ Ø—‘˜SÔ!Ø˜‘�Ø˜r™7 5™>¨3¨r©7°5©>��‘SÙØ—‘˜•àØˆò ð ˆùò3bs   ÁE;c                ó¨  — d| _         | j                  «       }| xj                  dz  c_        |r| j                  €g dc| _        | _        y| j                  \  }}t        d| j                  j                  «      }g ||}}}|D �	�
cg c]  }	|	D ]  }
|
‘Œ Œ c}
}	D ]a  }|j                  | j                  |||d   |d   |t        |d   «      t        |j                  d«      xs d«      ¬	«      «       |d   |d   }}Œc |j                  | j                  |||||| j                  d¬	«      «       |d
t        |«      c| _        | _        | _        yc c}
}	w )uš   Plan the next excursion and start flying at second `t` (nothing eligible â†’ immediately
        `done`, the caller falls back to its ordinary programme).Fr.   NrP   rQ   rR   r…   rS   ©rR   r…   r   )rt   r}   rp   rd   rq   rr   r/   rm   r   rW   Ú_legrU   r   rf   r   rs   )r1   ÚtrŸ   r’   r“   rŠ   ÚlegsrŒ   r�   r•   rZ   Úsites               r*   ÚbeginzExcursion.begin÷   sG  € ð ˆŒØ× Ñ Ó"ˆØ�Š�1‰�Ù˜Ÿ™Ð+Ø"$ dÐˆDŒJ˜œØØ—[‘[‰
ˆˆdÜ�A�t—x‘x×3Ñ3Ó4ˆØ˜4 �"ˆbˆØ %×1˜1¨qÒ1¨!’QÐ1�QÓ1ò 	.ˆDØ�K‰K˜Ÿ	™	 " b¨$¨u©+°t¸E±{ÀEÜ'*¨4°©<Ó'8¼sÀ4Ç8Á8ÈFÓCSÒCYÐWYÓ?Zð "ó \ô ]à˜%‘[ $ u¡+�‰Bð	.ð 	�‰�D—I‘I˜b " d¨D°%¸d¿n¹nÐSU�IÓVÔWØ,0°!´S¸³VÐ)ˆŒ
�D”G˜T�\ùó 2s   ÂEc               óú   — t        | |||«      }|rt        |«      t        z   nd}t        dt	        j
                  t        ||z  |«      «      «      }	| ||||	t        | |||«      ||d|rt        d|	|z
  «      dœ
S d dœ
S )Nr   r.   F)
r?   r@   rA   rB   Údur_sÚbearingrR   r…   ÚsaidÚsay_at)rD   r   r†   r/   r"   ÚceilrI   )
r?   r@   rA   rB   rŠ   rR   r…   ÚdistÚspeechÚdurs
             r*   r¦   zExcursion._leg
  s•   € ô �t˜T 4¨Ó.ˆÙ9=” Ó&¬Ò5À1ˆÜ�!”T—Y‘Yœs 4¨%¡<°Ó8Ó9Ó:ˆØ d°DÀ$Ø¬°d¸DÀ$ÈÓ)MØ d°Eá26œ#˜a  v¡Ó.ñ	Bð 	Bð =Añ	Bð 	Br,   c                ó6  — | j                   €g S t        |«      }| j                  | j                      }|| j                  z
  }||d   k\  rt||d   z  }| xj                   dz  c_         ||z
  | _        | j                   t	        | j                  «      k\  r	d| _         g S | j                  | j                      }||d   k\  rŒt||d   z  }|dddd|d   |d	   |d   z
  |z  z   |d
   |d   |d
   z
  |z  z   dœ| j
                  j                  t        | j                  |«      d«      |dz   dœ	}|d   r|d   |d<   | j                  r3t        t        d| j
                  j                  «      t        z  «      |d<   |d   r|d   s||d   xs dk\  rd|d<   |d   |d<   |gS )u�   The beat for second `t`: the aim point moved along the route â€” EVERY tick, never
        stationary. Empty once the route is flown (and `done` turns true).Nr¬   r.   Útour_poiÚ	structureÚleadzboat-featurer?   rA   r@   rB   )rP   rQ   é   )	ÚtSecÚtypeÚ
claimClassÚcommentaryRoleÚshotTypeÚpoiÚpoiDistMÚpoiBearingDegÚfocusUntilSecrR   ÚpoiSpeedMpsr…   r®   r¯   r   TÚtext)rr   r   rq   rs   rn   rm   r   ÚroundÚ_camera_bearingrt   r/   r   ÚRECALL_CAP_FACTOR)r1   r§   ÚlegÚelapsedÚfÚbeats         r*   ÚtickzExcursion.tick  s¸  € ð �7‰7ˆ?ØˆIÜ�‹FˆØ�j‰j˜Ÿ™Ñ!ˆØ�d—l‘lÑ"ˆØ˜˜W™Ò%Ø�s˜7‘|Ñ#ˆGØ�GŠG�q‰L�GØ˜w™;ˆDŒLØ�w‰wœ#˜dŸj™j›/Ò)Ø�”Ø�	Ø—*‘*˜TŸW™WÑ%ˆCð ˜˜W™Ó%ð �c˜'‘lÑ"ˆØ :¸[Ø"(°nØ" 6™{¨c°&©k¸CÀ¹KÑ.GÈ1Ñ-LÑLØ" 6™{¨c°&©k¸CÀ¹KÑ.GÈ1Ñ-LÑLñNà ŸH™H×9Ñ9Ü!& t×';Ñ';¸GÓ'DÀaÓ!HØ!" Q¡ñ(ˆð ˆvŠ;Ø˜v™;ˆD�‰LØ�>Š>Ü"%¤c¨!¨T¯X©X×-FÑ-FÓ&GÔJ[Ñ&[Ó"\ˆD�ÑØˆvŠ;˜s 6š{¨w¸3¸x¹=Ò;MÈAÒ/NØˆC�‰KØ˜v™;ˆD�‰LØˆvˆr,   c                ó   — | j                   | j                     }|d   dz   dz  }| j                  dk(  s	|t        k\  r|S | j                   | j                  dz
     d   dz   dz  }|t        ||«      |t        z  z  z   dz  S )uÖ   Compass bearing aimâ†’camera: behind the aim along the travel direction, blended by the
        SHORTEST delta over the first `BLEND_S` of a leg (a turn banks; it never whips the long
        way round the circle).r­   rK   rF   r   r.   )rq   rr   ÚBLEND_SrN   )r1   rÈ   rÇ   ÚbehindÚprevs        r*   rÅ   zExcursion._camera_bearing9  s†   € ð �j‰j˜Ÿ™Ñ!ˆØ�i‘. 5Ñ(¨EÑ1ˆØ�7‰7�aŠ<˜7¤gÒ-ØˆMØ—
‘
˜4Ÿ7™7 Q™;Ñ'¨	Ñ2°UÑ:¸eÑCˆØ”{ 4¨Ó0°G¼gÑ4EÑFÑFÈ%ÑOÐOr,   c           	     ó@  — | j                   �| j                  s| j                  €yt        |«      }| j                  | j                      }t        dt        d|| j                  z
  «      |d   z  «      }|d   |d   |d   z
  |z  z   }|d   |d   |d   z
  |z  z   }t        d	| j                  j                  «      }| j                  ||| j                  d   | j                  d	   || j                  d
¬«      }t        |«      |g| _        d	|c| _         | _        d| _        y)zøA race was armed (T-4): drop the rest of the route and fly straight home at the recall
        speed. The narration already playing is left to finish (no beat retracts a line); no NEW
        line is spoken. Idempotent, and a no-op when not flying.Ng      ð?r   r¬   r?   rA   r@   rB   r.   rS   r¥   T)rr   rt   rd   r   rq   r™   r/   rs   rm   r   r¦   rf   rT   )r1   r§   rÇ   rÉ   rP   rQ   rŠ   Úhomes           r*   ÚrecallzExcursion.recallD  s  € ð �7‰7ˆ?˜dŸnšn°·±Ð0CØÜ�‹FˆØ�j‰j˜Ÿ™Ñ!ˆÜ�”S˜˜A §¡Ñ,Ó-°°G±Ñ<Ó=ˆØ�&‰k˜S ™[¨3¨v©;Ñ6¸!Ñ;Ñ;ˆØ�&‰k˜S ™[¨3¨v©;Ñ6¸!Ñ;Ñ;ˆÜ�A�t—x‘x×0Ñ0Ó1ˆØ�y‰y˜˜c 4§;¡;¨q¡>°4·;±;¸q±>À5Ø"Ÿn™n°2ð ó 7ˆô ˜3“i Ð&ˆŒ
Ø ! 1ÐˆŒ�”Øˆ�r,   )rm   r
   rX   úlist | Nonerd   ztuple[float, float] | Nonere   zfloat | Nonerf   ú
str | Noner3   ÚNone)r3   r!   )rX   rÓ   r3   r!   )r‡   ú
list[dict]rˆ   r    r‰   r    r3   r    ri   )rœ   z
int | Noner3   úlist[list[dict]])r§   r   r3   rÕ   )r?   r    r@   r    rA   r    rB   r    rŠ   r    rR   rÔ   r…   rU   r3   rT   )r§   r   r3   rÖ   )rÈ   r   r3   r    )r4   r5   r6   r7   rv   Úpropertyry   r{   r~   r‚   r�   r}   rª   Ústaticmethodr¦   rË   rÅ   rÒ   r   r,   r*   rc   rc   �   sÂ   „ ñ[ð FJØ6:ÐUYØ)-ñØ3ðØFRðà&ðà26óð& ò#ó ð#ð òó ðóDó
ó
ô%óN<ð& ð	BØð	BØ%(ð	BØ-1ò	Bó ð	BóóB	Pôr,   rc   )
r?   r    r@   r    rA   r    rB   r    r3   r    )rL   r    rM   r    r3   r    )rX   rÓ   r3   rÖ   )rX   rÖ   r3   r×   )r7   Ú
__future__r   r"   Údataclassesr   Úcruise_tourr   rÍ   r†   rÆ   r
   rD   rI   rN   r[   ra   rc   r   r,   r*   ú<module>rÝ      sv   ðñ%õL #ã Ý !å 'ð €à€ð Ð ñ �$Ô÷Sð Só ðSóDEó
Mó-óó$÷"Eò Er,   