ó
    õ�»jHÙ  ã                   óú  • S r SSKrSSKrSSKrSr\R
                  " S5      r\" / SQS5       V Vs0 s H  u  pX_M	     snn rSHS jr	SIS jr
S	 rS
 rS rS rS rS rS rS rS rSS.S jrSJS jrS rSKS jrS rS rS rS r\R
                  " S5      r\R
                  " S5      rS rS rS r S  r!S!r"S" r#SKS# jr$S$ r%S%r&S&r'S' r(S(S)S*S+S,S-.r)SKS. jr*S/ r+SLS0 jr,S1 r-SMS2 jr.\R
                  " S35      r/S4r0S5 r1S6 r2\R
                  " S7\Rf                  5      r4\R
                  " S85      r5\R
                  " S9\Rf                  5      r6\R
                  " S:\Rf                  5      r7\R
                  " S;\Rf                  5      r8S< r9S= r:\R
                  " S>\Rv                  5      r<\R
                  " S?5      r=S@ r>SA r?SB r@SNSC jrASD rB\R
                  " SE5      rC\R
                  " SF5      rDSG rEgs  snn f )Oaº  The shortlist deep read (Dealer OS v4.1.0, 2026-09-17).

Dealer OS shows one starred car at a time with everything about it on
one page. Most of that is already in the push; what is not, the listing
page carries and the daily run walks past: the MOT and its advisories,
the service book, the keepers, colour, keys, tyres, declared damage, the
platform's own history check and every photo at full size. Reading that
for hundreds of cars a day is not worth it, reading it for the handful a
person starred is. So Dealer OS logs a shortlist.read action naming only
those cars, and this Mac reads only those pages.

This module is the pure half: given what a page showed (Motorway's page
data, Carwow's and DealerWay's visible words, Auction4Cars' HTML) it
returns the one `deep` block the push carries per car, in the exact
shape BIDBRAIN_PUSH_CONTRACT.md "Shortlist deep read" gives. Nothing
here opens a browser, so every parser is unit tested against fixture
text. Golden rule 4 throughout: a field the page did not show is None,
never a guess, and Dealer OS shows "not read" for it.

The readers (bidbrain/readers/*.deep_read) do the page visit and hand
in the words; daily_run.deep_read_pass walks the queue.
é    N)Úread_atÚasked_atÚerrorÚ
mot_expiryÚ
mot_testedÚ
mot_resultÚ
advisoriesÚserviceÚkeepersÚcolourÚinteriorÚkeysÚdamageÚtyres_mmÚ
tyre_notesÚwarning_lightsÚmodificationsÚhistory_checkÚphotosÚreserve_nowÚbid_nowu   Â£\s?(\d[\d,]*))ÚjanÚfebÚmarÚaprÚmayÚjunÚjulÚaugÚsepÚoctÚnovÚdecé   c                 óT   • [          Vs0 s H  o3S_M     nnXS'   XS'   X$S'   U$ s  snf )zqA deep block with nothing read yet: every field None except the
stamps and, when the page could not be read, why.Nr   r   r   )ÚFIELDS)r   r   r   ÚkÚds        Ú3/Users/stevendouglas/BidBrain/bidbrain/deep_read.pyÚemptyr*   '   s9   € õ !Ó!š&�QˆDŠ™&€AÐ!Ø€i�LØ€j�MØ€g�JØ€Hùò	 	"s   ‰%c                 óP   • [        X=(       d
    [        5       [        U 5      SS S9$ )z«The answer for a page that could not be read: the reason in the
Mac's own words, the rest null, so the screen can say "Motorway login
needed" rather than show blank boxes.Ni,  )r   r   r   )r*   Ú	now_stampÚstr)Úwhyr   r   s      r)   Úfailedr/   1   s$   € ô ˜(×,B´y³{Ì#ÈcË(ÐSWÐTWÈ.ÑYÐYó    c                  ót   • [         R                   R                  5       R                  SS9R                  5       $ )z8The Mac's clock, the same shape as the rest of the push.r   )Úmicrosecond)ÚdatetimeÚnowÚreplaceÚ	isoformat© r0   r)   r,   r,   8   s.   € ä×Ñ× Ñ Ó"×*Ñ*°qÐ*Ð9×CÑCÓEÐEr0   c           	      ó&  • [        U =(       d    S5      R                  5       nU(       d  g[        R                  " SU5      nU(       a7  UR	                  S5       SUR	                  S5       SUR	                  S5       3$ [        R                  " SU5      nU(       aK  UR	                  S5       S[        UR	                  S5      5      S	 S[        UR	                  S5      5      S	 3$ [        R                  " S
U5      nU(       a„  UR	                  S5      SS R                  5       [        ;   aZ  UR	                  S5       S[        UR	                  S5      SS R                  5          S	 S[        UR	                  S5      5      S	 3$ [        R                  " SU5      nU(       ai  UR	                  S5      SS R                  5       [        ;   a?  UR	                  S5       S[        UR	                  S5      SS R                  5          S	 S3$ g)z¬A date the way a listing writes it, as YYYY-MM-DD, or None. Reads
01/03/2027, 1 Mar 2027, 01 March 2027, 2027-03-01 and 2027-03-01T...
Never a guess: anything else is None.Ú Nz"(\d{4})-(\d{2})-(\d{2})(?:[T ].*)?r$   Ú-é   é   z(\d{1,2})/(\d{1,2})/(\d{4})Ú02dz8(\d{1,2})(?:st|nd|rd|th)?\s+([A-Za-z]{3,9})\.?\s+(\d{4})z([A-Za-z]{3,9})\.?\s+(\d{4})z-01)r-   ÚstripÚreÚ	fullmatchÚgroupÚintÚlowerÚ_MONTHS)ÚtextÚsÚms      r)   Úiso_daterH   @   s¥  € ô 	ˆD�J�B‹×ÑÓ€AÞØÜ
�ŠÐ:¸AÓ>€AÞØ—'‘'˜!“*�˜Q˜qŸw™w q›z˜l¨!¨A¯G©G°A«J¨<Ð8Ð8Ü
�ŠÐ3°QÓ7€AÞØ—'‘'˜!“*�˜Qœs 1§7¡7¨1£:›¨sÐ3°1´S¸¿¹À»³_ÀSÐ4IÐJÐJÜ
�ŠÐPÐRSÓT€AÞˆQ�W‰W�Q‹Z˜˜ˆ^×!Ñ!Ó#¤wÓ.Ø—'‘'˜!“*�˜Qœw q§w¡w¨q£z°"°1 ~×';Ñ';Ó'=Ñ>¸sÐCÀ1ÄSÈÏÉÐQRËÃ_ÐUXÐDYÐZÐZÜ
�ŠÐ4°aÓ8€AÞˆQ�W‰W�Q‹Z˜˜ˆ^×!Ñ!Ó#¤wÓ.Ø—'‘'˜!“*�˜Qœw q§w¡w¨q£z°"°1 ~×';Ñ';Ó'=Ñ>¸sÐCÀ3ÐGÐGØr0   c                 óÆ   • [        U =(       d    S5      nS HG  n[        R                  " X!5      nU(       d  M"  [        UR	                  S5      5      nU(       d  ME  Us  $    g)zBThe first date written anywhere in a line, as YYYY-MM-DD, or None.r9   )z\d{4}-\d{2}-\d{2}z\d{1,2}/\d{1,2}/\d{4}z2\d{1,2}(?:st|nd|rd|th)?\s+[A-Za-z]{3,9}\.?\s+\d{4}r   N)r-   r?   ÚsearchrH   rA   )rE   rF   ÚpatrG   Úgots        r)   Údate_inrM   V   sQ   € äˆD�J�B‹€AóGˆä�IŠI�cÓˆßˆ1Ü˜1Ÿ7™7 1›:Ó&ˆCßˆsØ’
ñGð r0   c                 óÚ   • [         R                  " S[        U =(       d    S5      5      nU(       d  g [        UR	                  S5      R                  SS5      5      $ ! [         a     gf = f)z?The first whole number in a line (a mileage, a count), or None.z\d[\d,]*r9   Nr   Ú,)r?   rJ   r-   rB   rA   r5   Ú
ValueError©rE   rG   s     r)   Úint_inrR   c   sW   € ä
�	Š	�+œs 4§:¨2›Ó/€AÞØðÜ�1—7‘7˜1“:×%Ñ% c¨2Ó.Ó/Ð/øÜó Ùðús   ³)A Á
A*Á)A*c                 óø   • [         R                  " S[        U =(       d    S5      [         R                  5      nU(       d  g [	        UR                  S5      R                  SS5      5      $ ! [         a     gf = f)zzA mileage written in a line ("41,200 miles", "at 41200 mi"), or
None. Never a bare number, which could be a day or a year.z(\d[\d,]*)\s*(?:miles|mi\b|mls)r9   Nr$   rO   )r?   rJ   r-   ÚIrB   rA   r5   rP   rQ   s     r)   Ú
mileage_inrU   n   s`   € ô 	�	Š	Ð4´c¸$¿*À"³oÄrÇtÁtÓL€AÞØðÜ�1—7‘7˜1“:×%Ñ% c¨2Ó.Ó/Ð/øÜó Ùðús   Á)A, Á,
A9Á8A9c                 óÖ   • [         R                  [        U =(       d    S5      5      nU(       d  g  [        UR	                  S5      R                  SS5      5      $ ! [         a     g f = f)Nr9   r$   rO   )ÚMONEYrJ   r-   rB   rA   r5   rP   rQ   s     r)   Úmoney_inrX   z   sU   € Ü�‰”S˜Ÿ “_Ó%€AÞØðÜ�1—7‘7˜1“:×%Ñ% c¨2Ó.Ó/Ð/øÜó Ùðús   ±)A Á
A(Á'A(c                 ó  • [        U =(       d    S5      R                  5       R                  5       nU(       d  gUS;   d  UR                  S5      (       a  gUS;   d,  UR                  S5      (       d  UR                  S5      (       a  g	g)
zKTrue for a yes, False for a no or a clear, None when the words say
neither.r9   N)ÚyesÚyÚtruerZ   T)ÚnoÚnÚfalseÚnoneÚclearznot recordedz	no recordzno znot F)r-   r>   rC   Ú
startswith)rE   rF   s     r)   Úyes_norc   „   sv   € ô 	ˆD�J�B‹×ÑÓ×%Ñ%Ó'€AÞØØÐ Ó  A§L¡L°×$7Ñ$7ØØÐNÓNÐRS×R^ÑR^Ð_d×ReÑReÐij×iuÑiuÐv|×i}Ñi}ØØr0   c                 óT  • Sn[        U[        5      (       a!  SR                  S U 5       5      =(       d    Sn[        U[        5      (       a¤  UR	                  5       (       a�  SR                  S UR                  5        5       5      n[        U5      SL a'  [        UR                  5       5      S::  a
  SnU c  SOU n O4[        U5      SL a&  [        UR                  5       5      S::  a	  SnU c  SOU n U(       a  U$ [        U [        5      (       a  U O
[        U 5      nUSL a  g	USL a  g
g)aÑ  The seller's answer to "has the car been modified", in the words the
shortlist car card shows (Steven, 2026-09-22, the tenth fact on the
card). A No with nothing said is "None declared"; a description is
given as written, one line, whatever the flag said beside it; a Yes
with no description says so rather than pretending to know what was
done. Neither on the page is None, never "None declared" (golden
rule 4: a page that did not say is not a page that said no).Nú, c              3   óž   #   • U  HC  n[        U[        5      (       d  M  UR                  5       (       d  M1  UR                  5       v •  ME     g 7f©N)Ú
isinstancer-   r>   ©Ú.0Úxs     r)   Ú	<genexpr>Ú%modifications_text.<locals>.<genexpr>›   s-   é € ÐUªD q´J¸qÄ#×4F›È1Ï7É7Ï9›˜Ÿ™Ÿ˜ªDùs   ‚AŸA¶Ac              3   ón   #   • U  H+  oR                  5       (       d  M  UR                  5       v •  M-     g 7frg   ©r>   ri   s     r)   rl   rm   �   ó"   é € ÐKÒ,= qÇÁÇ›˜Ÿ™Ÿ˜Ò,=ùó   ‚5ž5Fr<   Tr$   zNone declaredz$Modified, the seller gave no details)
rh   ÚlistÚjoinr-   r>   Ú
splitlinesrc   ÚlenÚsplitÚbool)ÚflagÚdescrE   Úyns       r)   Úmodifications_textr{   ‘   sô   € ð €DÜ�$œ×ÑØ�y‰yÑU©DÓUÓU×]ÐY]ˆÜ�$œ×Ñ §¡§¡Ø�y‰yÑK¨D¯O©OÔ,=ÓKÓKˆÜ�$‹<˜5Ò ¤S¨¯©«Ó%6¸!Ó%;ØˆDØ ™L‘5¨d‰DÜ�D‹\˜TÒ!¤c¨$¯*©*«,Ó&7¸1Ó&<ØˆDØ™<‘4¨TˆDÞØˆÜ˜D¤$×'Ñ'‰¬V°D«\€BØ	ˆU‚{ØØ	ˆT‚zØ5Ør0   c                 ó¼   • [        U =(       d    S5      R                  S5       Vs/ s H)  oR                  5       (       d  M  UR                  5       PM+     sn$ s  snf )Nr9   Ú
)r-   rv   r>   )rE   Úls     r)   Úlines_ofr   ®   s=   € Ü" 4§:¨2›×4Ñ4°TÔ:ÓHÒ:˜!¿g¹g¿i‹IˆA�G‰GŽIÑ:ÑHÐHùÒHs   ¦AÁA)Úwithinc          
      ó\  • U Vs1 s H!  o3R                  5       R                  S5      iM#     nn[        U 5       Hj  u  pSUR                  5       R                  S5      U;   d  M*  [        US-   [	        US-   U-   [        U 5      5      5       H  nX   (       d  M  X   s  s  $      g   gs  snf )z¿The line after the first line that IS one of the labels (case
insensitive, a trailing colon ignored), looking up to `within` lines
down for a non empty one. None when no label is on the page.Ú:r$   N)rC   ÚrstripÚ	enumerateÚrangeÚminru   )Úlinesr€   Úlabelsr~   ÚwantÚiÚjs          r)   Úvalue_afterrŒ   ²   s—   € ñ ,2Ó2ª6 a�G‰G‹I×Ñ˜SÖ!©6€DÐ2Ü˜%Ö ‰ˆØ�7‰7‹9×Ñ˜CÓ  DÕ(Ü˜1˜q™5¤# a¨!¡e¨f¡n´c¸%³jÓ"AÖB�Ø—8‘8Ø ™8”Oñ Cñ ñ !ð ùò 3s   …(B)c           
      ó¼  • U Vs1 s H  oDR                  5       iM     nn[        U 5       H¨  u  pgUR                  5       R                  S5      UR                  5       :X  d  M8  / n[        US-   [	        US-   U-   [        U 5      5      5       H@  n	X	   R                  5       R                  S5      U;   a    Us  $ UR                  X	   5        MB     Us  $    / $ s  snf )zThe lines under a heading, up to the next heading in stop_headings
or `limit` lines. Empty when the heading is not on the page.r‚   r$   )rC   r„   rƒ   r…   r†   ru   Úappend)
r‡   ÚheadingÚstop_headingsÚlimitÚhÚstopsrŠ   r~   Úoutr‹   s
             r)   Úsectionr•   À   sÁ   € ñ !.Ó.¢˜1�W‰WŽY¡€EÐ.Ü˜%Ö ‰ˆØ�7‰7‹9×Ñ˜CÓ  G§M¡M£OÕ3ØˆCÜ˜1˜q™5¤# a¨!¡e¨e¡m´S¸³ZÓ"@ÖA�Ø‘8—>‘>Ó#×*Ñ*¨3Ó/°5Ó8ØàŠJð —
‘
˜5™8Ö$ñ Bð ŠJñ !ð €Iùò /s   …Cc                 óÂ  • [          Vs0 s H  oU R                  U5      _M     nnUS   bT  [        US   5      nUR                  S5      UR                  S5      UR                  S5      UR                  S5      S.US'   US   bT  [        US   5      nUR                  S5      UR                  S	5      UR                  S
5      UR                  S5      S.US'   U$ s  snf )z:Only the contract's keys, in its order, every one present.r
   ÚstampsÚ	last_dateÚlast_mileageÚdetail©r—   r˜   r™   rš   r   ÚfinanceÚwritten_offÚstolenÚimported©rœ   r�   rž   rŸ   )r&   ÚgetÚdict)r(   r'   r”   rF   r’   s        r)   Ú_cleanr£   Ï   sÐ   € å &Ó
'¢˜1ˆa�e‰e�A‹hŠ;¡€CÐ
'Ø
ˆ9�~Ñ!Ü��Y‘Ó ˆØ$%§E¡E¨(£OÀ!Ç%Á%ÈÓBTØ*+¯%©%°Ó*?È1Ï5É5ÐQYË?ñ\ˆˆI‰à
ˆ?ÑÑ'Ü��_Ñ%Ó&ˆØ+,¯5©5°Ó+;ÈAÏEÉEÐR_ÓL`Ø*+¯%©%°«/ÀqÇuÁuÈZÓGXñ ZˆˆOÑà€Jùò (s   ‰Cc              #   óL  #   • [        U [        5      (       a:  U R                  5        H%  u  p#[        X1[	        U5      4-   5       Sh  v•N   M'     g[        U [
        5      (       a3  [        U SS 5       H   u  pC[        X1SU S34-   5       Sh  v•N   M"     gX4v •  g NW N7f)z?Every (path, value) pair in a nested dict or list, leaves only.Né<   Ú[Ú])rh   r¢   ÚitemsÚ_walkr-   rr   r„   )ÚobjÚpathr'   ÚvrŠ   s        r)   r©   r©   à   s‘   é € ä�#”t×ÑØ—I‘I–K‰DˆAÜ˜Q¬¨A« yÑ 0Ó1×1Ò1ò  ä	�Cœ×	Ñ	Ü˜c # 2˜hÖ'‰DˆAÜ˜Q¨!¨A¨3¨a¨ {Ñ 2Ó3×3Ò3ò (ð ˆi‹ñ 2ñ 4ùs%   ‚AB$ÁB Á	AB$ÂB"ÂB$Â"B$c                 óô   • [        U [        5      (       a3  X;   a  X   $ U R                  5        H  n[        X!5      nUc  M  Us  $    g [        U [        5      (       a  U  H  n[        X!5      nUc  M  Us  $    g rg   )rh   r¢   ÚvaluesÚ_find_firstrr   )rª   Úkeyr¬   Úfounds       r)   r¯   r¯   ì   sx   € Ü�#”t×ÑØ‹:Ø‘8ˆOØ—‘–ˆAÜ Ó'ˆEØÓ Ø’ñ ð ô 
�Cœ×	Ñ	ÛˆAÜ Ó'ˆEØÓ Ø’ñ ð r0   c                 óH   • U H  n[        X5      nUS S/ 0 4;  d  M  Us  $    g )Nr9   )r¯   )Údatar   r'   r¬   s       r)   Ú	_first_ofr´   ü   s1   € ÛˆÜ˜Ó ˆØ�T˜2˜r 2Ð&Õ&ØŠHñ ð r0   c                 ó  • [        U [        5      (       a  g [        U [        [        45      (       a  U $ [        U [        5      (       a  [        U 5      $ [        U [        5      (       a  S H  nX;   d  M
  [        X   5      s  $    g )N)ÚvalueÚamountÚcountÚprice)rh   rw   rB   Úfloatr-   rR   r¢   Ú_num)r¬   r'   s     r)   r»   r»     sl   € Ü�!”T×ÑØÜ�!”cœ5�\×"Ñ"ØˆÜ�!”S×ÑÜ�a‹yÐÜ�!”T×ÑÛ6ˆAØ�vÜ˜A™D“zÒ!ñ 7ð r0   c                 ó’   • U b   [        U [        [        [        45      (       a  g [	        U 5      R                  5       nU=(       d    S $ rg   )rh   rw   rr   r¢   r-   r>   )r¬   rF   s     r)   Ú_strr½     s6   € Ø�y”J˜q¤4¬¬tÐ"4×5Ñ5ØÜˆA‹�‰‹€AØ�9�Ðr0   z<https://[A-Za-z0-9._\-]*imgix\.net/[A-Za-z0-9._/\-]*?\.jpe?gzLhttps://motorway-photos[A-Za-z0-9.\-]*\.imgix\.net/[A-Za-z0-9._/\-]*?\.jpe?gc                 óú   • 0 n[         R                  [        U =(       d    S5      5       H6  nUR                  UR	                  S5      UR	                  S5      S-   5        M8     [        UR                  5       5      $ )zËEvery listing photo in Motorway's page data, one URL per photo, at
a size the screen can show large. The motorway-photos host family only
(never the seller's documents host), as motorway.py already does.r9   r   ú?w=1400&auto=format,compress)Ú_MW_GALLERYÚfinditerr-   Ú
setdefaultrA   rr   r®   )rE   ÚseenrG   s      r)   Úmotorway_photosrÄ     s[   € ð €DÜ×!Ñ!¤# d§j¨b£/Ö2ˆØ�‰˜Ÿ™ ›
 A§G¡G¨A£JÐ1OÑ$OÖPñ 3ä�—‘“ÓÐr0   c                 óˆ   • [         R                  [        R                  " U 5      5      nU(       a  UR	                  S5      $ S $ )Nr   )Ú_IMGrJ   ÚjsonÚdumpsrA   )rª   rG   s     r)   Ú	_photo_inrÉ   '  s-   € Ü�‰”D—J’J˜s“OÓ$€AÞˆ1�7‰7�1‹:Ð$ Ð$r0   c                 ó,   ^^• / mUU4S jmT" U 5        T$ )z�Declared damage entries anywhere under a condition block: any dict
carrying a description string, with the first photo beside it.c                 óN  >^ • [        T [        5      (       aä  S nS HV  n[        T R                  U5      [        5      (       d  M)  T U   R	                  5       (       d  MC  T U   R	                  5       n  O   [        S T R                  5        5       5      nU(       a?  U(       d  [        U 4S jS 5       5      (       a  TR                  U[        T 5      S.5        g T R                  5        H  nT" U5        M     g [        T [        5      (       a  T S S  H  nT" U5        M     g g )N)Údescriptionry   rE   ÚlabelÚtitleÚ
damageTypeÚtypec              3   ó¸   #   • U  HP  n[        U[        [        [        45      =(       a)    [        R                  [        R                  " U5      5      v •  MR     g 7frg   )rh   r-   rr   r¢   rÆ   rJ   rÇ   rÈ   ©rj   r¬   s     r)   rl   Ú-_damage_from.<locals>.walk.<locals>.<genexpr>8  s;   é € ÐnÒcmÐ^_œ* Q¬¬d´DÐ(9Ó:×Y¼t¿{¹{Ì4Ï:Ê:ÐVWË=Ó?YÔYÒcmùs   ‚AAc              3   ó,   >#   • U  H	  oT;   v •  M     g 7frg   r7   )rj   r'   Úos     €r)   rl   rÓ   9  s   øé € Ð'fÒ8e°1¨Q®Ò8eùó   ƒ)r   ÚimagesÚimageÚphotoÚurl©rE   Ú	photo_urlr¥   )
rh   r¢   r¡   r-   r>   Úanyr®   rŽ   rÉ   rr   )rÕ   rE   r'   Úhas_picr¬   r”   Úwalks   `    €€r)   rß   Ú_damage_from.<locals>.walk1  sß   ù€ Ü�aœ×ÑØˆDÛ\�Ü˜aŸe™e A›h¬×,Ó,°°1±·±·³Ø˜Q™4Ÿ:™:›<�DÙñ ]ô ÑnÐcd×ckÑckÔcmÓnÓnˆGÞž¤CÔ'fÑ8eÓ'f×$fÑ$fØ—
‘
 D´yÀ³|ÑDÔEØØ—X‘X–Z�Ù�Q–ò  ä˜œ4× Ñ Ø�s˜“V�Ù�Q–ò ð !r0   r7   )rª   r”   rß   s    @@r)   Ú_damage_fromrá   ,  s   ù€ ð €Cöñ  	ˆ„IØ€Jr0   c                 ó’  ^• [        U [        5      (       d  g[        U R                  S5      [        5      (       a  U R                  S5      O0 n[        UR                  S5      [        5      (       a  UR                  S5      O0 nUR                  S5      m[        T[        5      (       a  [        U4S jS 5       5      (       a  T$ g)a  The car's own block in Motorway's page data, props.pageProps.vehicle
(seen live 2026-09-17: mainInfo, details, ratings, serviceHistory,
bidding, gallery, location under it). None when the page carried no
car: a sale that has closed, a withdrawn listing, or a shell page.NÚpropsÚ	pagePropsÚvehiclec              3   ó,   >#   • U  H	  oT;   v •  M     g 7frg   r7   )rj   r'   Úvehs     €r)   rl   Ú#motorway_vehicle.<locals>.<genexpr>O  s   øé € Ð$pÒ7o°!¨#¦XÒ7oùrÖ   )ÚmainInfoÚdetailsÚbiddingÚgalleryÚratings)rh   r¢   r¡   rÝ   )r³   rã   Úpprç   s      @r)   Úmotorway_vehiclerï   E  s”   ø€ ô
 �dœD×!Ñ!ØÜ!+¨D¯H©H°WÓ,=¼t×!DÑ!DˆD�H‰H�WÔÈ"€EÜ#-¨e¯i©i¸Ó.DÄd×#KÑ#Kˆ�‰�;Ô	ÐQS€BØ
�&‰&�Ó
€CÜ�#”t×Ñ¤Ô$pÑ7oÓ$p×!pÑ!pØˆ
Ør0   ))ÚhasDentsÚ	dentsDescÚDents)ÚhasScratchesÚscratchesDescÚ	Scratches)ÚhasPaintProblemsÚpaintProblemsDesczPaint problems)ÚhasMissingPartsÚmissingPartsDesczMissing parts)ÚhasWindscreenProblemsÚwindscreenProblemsDescÚ
Windscreen)ÚhasBeenSmokedInNz	Smoked inc                 ó  • [        U [        5      (       d  g[        U R                  S5      5      SLa  g[	        U R                  S5      5      nU(       a&  SR                  S UR                  5        5       5      nU=(       d    S$ )z�Motorway's own warning-light flag off conditionAndDamage: a plain
Yes/No with a description beside it. Null on a No or a missing block,
never invented. Pure.NÚhasWarningLightsTÚwarningLightsDescre   c              3   ón   #   • U  H+  oR                  5       (       d  M  UR                  5       v •  M-     g 7frg   ro   ri   s     r)   rl   Ú*motorway_warning_lights.<locals>.<genexpr>l  rp   rq   zWarning light on the dashboard)rh   r¢   rc   r¡   r½   rs   rt   )Úcondry   s     r)   Úmotorway_warning_lightsr  b  sl   € ô �dœD×!Ñ!ØÜˆd�h‰hÐ)Ó*Ó+°4Ò7ØÜ�—‘Ð,Ó-Ó.€DÞØ�y‰yÑK¨D¯O©OÔ,=ÓKÓKˆØ×3Ð3Ð3r0   c                 óÂ  • [        U SSSSS5      n[        U SSSS	S
S5      n[        U SS5      n[        U[        5      (       a  Uc  UnOf[        U[        [        45      (       a  USS/ 4;   a  UnO?[        U[
        5      (       a*  Uc  [        USSSS5      nUSS/ 4;   a  [        USSSS5      n[        X#5      nUc!  U(       a  [        S[        USSSSS5      5      nU$ )aÊ  Whether the seller declared any modifications, off the car block
first, the page's words second. Motorway asks every seller the
question, but the name it stores the answer under has not been seen
live yet (2026-09-22), so this tries the names it would plausibly use
and motorway_key_notes writes every "modif" path to deep_read.log on
the first read, the same habit as every other field here. A name
that is not there gives None, never a guess. Pure, tested.ÚhasModificationsÚhasBeenModifiedÚ
isModifiedÚhasModifiedPartsÚvehicleModifiedÚmodificationsDescÚmodificationDescÚmodificationsDescriptionÚmodificationDetailsÚmodificationsDetailsÚmodificationsTextr   ÚmodificationNr9   Úhasr¶   ÚanswerÚdeclaredrÌ   ry   rê   rE   ÚModificationsÚModifiedúHas the car been modifiedúHas this car been modifiedúVehicle modifications)r´   rh   rw   r-   rr   r¢   r{   rŒ   )r³   r‡   rx   ry   ÚplainrL   s         r)   Úmotorway_modificationsr  p  s   € ô �TÐ-Ð/@À,ÐPbÐduÓv€DÜ�TÐ.Ð0BÐD^Ð`uØ+Ð-@óB€Dä�d˜O¨^Ó<€EÜ�%œ×Ñ 4¡<Ø‰Ü	�EœC¤˜;×	'Ñ	'¨D°T¸2¸r°NÓ,BØ‰Ü	�Eœ4×	 Ñ	 Ø‰<Ü˜U E¨7°H¸jÓIˆDØ�D˜"˜b�>Ó!Ü˜U M°6¸9ÀfÓMˆDÜ
˜TÓ
(€CØ
�{–uÜ  ¤{°5¸/È:ÐWrØ3OÐQhó(jó kˆà€Jr0   c                 ó  • / / p![        U [        5      (       a$  [        U R                  S5      [        5      (       d  X4$ [	        5       nU S    GHµ  n[        U[        5      (       d  M  [        UR                  S5      5      =(       dX    [        [        UR                  S5      [        5      (       a)  UR                  S5      =(       d    0 R                  S5      OS5      nU(       d  M�  UR                  S5      S   n[        UR                  S5      =(       d    S	5      R                  5       nUS
:X  d  SUR                  5       ;   a  Mþ  XS;   a  GM  UR                  U5        US-   nUR                  U5        US:X  d   US;  d  GM<  UR                  S5      SL d  GMS  [        UR                  S5      5      =(       d    SnUR                  X‡UR                  S5      =(       d    S	 SU 3R                  5       S.5        GM¸     X4$ )aš  Motorway's gallery block (live 2026-09-17): gallery.images[] each
with url, category (vehicle, wheels, tyres, damage, additionalImage,
documents), kind, title, isDamaged and damageMeta. Every photo of the
car at a size the screen can show large, the seller's documents left
out; the damage photos separately, each with its title, so the screen
can mark them. ([], []) when the block is not there. Pure, tested.r×   rÚ   ÚpresetsÚdesktopNÚ?r   Úcategoryr9   Ú	documentsÚdocumentr¿   r   )ÚwheelsÚtyresÚ	isDamagedTrÎ   úDamage, photographedÚkindÚ )rE   rÜ   Úname)rh   r¢   r¡   rr   Úsetr½   rv   r-   rC   ÚaddrŽ   )	Úgalr   r   rÃ   ÚimrÚ   ÚcatÚbigrÎ   s	            r)   Úmotorway_galleryr0  Œ  s°  € ð ˜ˆFÜ�cœ4× Ñ ¬
°3·7±7¸8Ó3DÄd×(KÑ(KØˆ~ÐÜ‹5€DØ�(�mˆÜ˜"œd×#Ñ#ÙÜ�2—6‘6˜%“=Ó!÷  E¤TÔV`Ðac×agÑagÐhqÓarÔtx×VyÑVy¨2¯6©6°)Ó+<×+BÀ×*GÑ*GÈ	Ô*Rð  @Dó  &EˆÞÙØ�i‰i˜‹n˜QÑˆÜ�"—&‘&˜Ó$×*¨Ó+×1Ñ1Ó3ˆØ�+Ó ¨s¯y©y«{Ó!:ÙØ‹;ÚØ�‰�ŒØÐ2Ñ2ˆØ�‰�cÔð �(‹?˜sÐ*=Ö=À"Ç&Á&ÈÓBUÐY]ÕB]Ü˜Ÿ™ ›Ó)×CÐ-CˆEØ�M‰M 5Ø&(§f¡f¨V£n×&:¸Ð%;¸1¸U¸GÐ#D×#JÑ#JÓ#LñN÷ Oñ1 ð4 ˆ>Ðr0   zNo problems declared))ÚhasTyreProblemsÚtyreProblemsDesczTyre problems)ÚhasScuffedAlloyÚscuffedAlloyDesczScuffed alloysc                 óZ  • / n[          H¼  u  p#n[        U R                  U5      5      SLa  M%  [        U R                  U5      5      nU(       aT  UR	                  5       (       a?  [        U5      nUR                  S5      (       a  U SUS:w  a  SOS 3OU SUS:w  a  SOS 3nUR                  U(       a  U SU 3OUS	S
.5        M¾     [        U R                  S5      5      SL a  UR                  SS	S
.5        [        U R                  S5      5      SL a  UR                  SS	S
.5        U$ )aµ  Motorway's wheelsAndTyres block (live 2026-09-17): tyre problems and
scuffed alloys as Yes/No with a count or description, plus whether the
locking wheel nut and the tools are there. No tread depths anywhere on
the page, so tyres_mm stays null; these lines go into tyre_notes
instead of the damage list, wheels and tyres being their own thing,
not bodywork. A Yes becomes an entry; a missing locking wheel nut or
tools too. Pure, tested.TÚScuffedú wheelr$   rF   r9   ú tyreú: NrÛ   ÚhasLockingWheelNutFúNo locking wheel nutÚhasToolsInBootzNo tools in the boot)Ú
_MW_WHEELSrc   r¡   r½   ÚisdigitrB   rb   rŽ   )Úwr”   Úhas_keyÚdesc_keyrÍ   ry   r^   s          r)   Úmotorway_wheelsrB  ¼  s  € ð €Cß$.Ñ ˆ˜5Ü�!—%‘%˜“.Ó!¨Ò-ÙÜ�A—E‘E˜(“OÓ$ˆÞ�D—L‘L—N‘NÜ�D“	ˆAØ:?×:JÑ:JÈ9×:UÑ:U�a�S˜ a¨1£f™s°"Ð5Ñ6Ð^_Ð]`Ð`eÐmnÐrsÓmsÑfiÐy{Ðe|Ð[}ˆDØ�
‰
¶$˜u˜g R¨ vÑ.¸EÐPTÑUÖVñ %/ô ˆa�e‰eÐ(Ó)Ó*¨eÒ3Ø�
‰
Ð2ÀÑFÔGÜˆa�e‰eÐ$Ó%Ó&¨%Ò/Ø�
‰
Ð2ÀÑFÔGØ€Jr0   ÚdentÚscratchÚpaintÚmissingÚ
windscreen)rð   ró   rö   rø   rú   c           
      ó&  • [        U [        5      (       a  U O0 n U=(       d    /  Vs/ s H  n[        U5      PM     nn/ n[         GHÛ  u  pVn[        U R	                  U5      5      SLa  M&  [
        R	                  U5      nU Vs/ s HD  o((       d  M  UR	                  S5      (       a  M#  X‚R	                  S5      =(       d    S;   d  MB  UPMF     n	nU(       a  [        U R	                  U5      5      OSn
U
(       aE  U
R                  5        Vs/ s H)  o»R                  5       (       d  M  UR                  5       PM+     snO/ n[        [        [        U5      [        U	5      S5      5       H²  nU[        U5      :  a  XÍ   OSnU[        U	5      :  a  X�   OSnU(       a  SUS'   UR                  U(       a  U SU 3OUU(       a  US   OLU(       aD  [        U R	                  U5      [        [        45      (       a  [        U R	                  U5      5      OSS	.5        M´     GMÞ     U HV  nUR	                  S5      (       a  M  UR                  UR	                  S
5      =(       d    SUR	                  S5      S	.5        MX     U$ s  snf s  snf s  snf )aË  Motorway's declared bodywork damage, each entry carrying what the
seller said about it and the photo of that very fault. Wheels and
tyres are not in here: they are their own field (Steven, 2026-09-18),
and the gallery's wheel and tyre photos are not bodywork damage
however damaged they are, so they stay in the photo list only. A
photo of something the condition block never declared is still kept,
under its own title, rather than thrown away. Pure, tested.TÚtakenr)  r9   Nr$   r9  rÜ   rÛ   rE   r&  )rh   r¢   Ú_MW_CONDITIONrc   r¡   Ú_MW_DAMAGE_TOKENr½   rt   r>   r…   Úmaxru   rŽ   rr   rÉ   )r  Údamage_photosÚpÚpicsr”   r@  rA  rÍ   ÚtokenÚmineÚrawrk   r‡   rŠ   ÚlineÚpics                   r)   Úmotorway_damagerU  ì  s  € ô ˜d¤D×)Ñ)‰4¨r€DØ+×1¨rÐ1Ó3Ò1˜ŒD�ŽGÑ1€DÐ3Ø
€Cß$1 MÑ ˆ˜5Ü�$—(‘(˜7Ó#Ó$¨DÒ0ÙÜ ×$Ñ$ WÓ-ˆÙÓcš4�a£5“°·±°w·“ÀEÏeÉeÐTZËm×NaÐ_aÑDb—™4ˆÐcÞ*2Œd�4—8‘8˜HÓ%Ô&¸ˆÞFI C§N¡NÔ$4ÓBÒ$4˜q¿¹¿	“�—‘–Ñ$4ÒBÈrˆÜ”sœ3˜u›:¤s¨4£y°!Ó4Ö5ˆAØ ¤3 u£:›~�5’8°4ˆDØ¤ T£›]�$’'°ˆCÞØ#��G‘Ø�J‰J¶d 5 '¨¨D¨6Ñ 2ÀÞ9< S¨Ò%5Þ:BÄzÐRV×RZÑRZÐ[cÓRdÔgkÔmqÐfr×GsÑGsœ 4§8¡8¨HÓ#5Ô6Ðy}ñ@ö Aô 6ñ %2ó ˆØ�u‰u�W�~‹~Ø�J‰J §¡ f£× GÐ1GÐVW×V[ÑV[Ð\gÓVhÑiÖjñ ð €Jùò) 4ùò dùâBs)   §JÂ
J	ÂJ	Â+J	Ã
J	ÄJÄ*Jc                 ó   • [        U 5      $ )zƒThe declared condition on its own, with no photos to go with it.
motorway_damage is the whole answer; this is it without a gallery.)rU  )r  s    r)   Úmotorway_conditionrW    s   € ô ˜4Ó Ð r0   c                 ó."  ^C^D• [        5       n[        U 5      nUc  [        S5      $ Un [        U5      mC[	        U SSS5      n[	        U SSSS	S
5      n[        U[        5      (       a  UR                  5       (       d  SnUc$  [        U[        5      (       a  [	        USSSS5      n[        [        U5      5      =(       d    [        [        TCSSSSS5      5      US'   [	        U SSS5      nUc#  [        U[        5      (       a  [	        USSS5      nUc&  [        U[        5      (       a  UR                  S5      n[        U5      =(       d    [        [        TCSS5      5      US'   [	        U SSS 5      nUc#  [        U[        5      (       a  [	        USS!S"5      n[        [        U5      5      =(       d    [        [        TCS#S$S%5      5      US&'   [	        U S'S(S)5      n	U	c#  [        U[        5      (       a  [	        US(S)S*5      n	[        U	[        5      (       ab  / n
U	 HU  n[        U[        5      (       d  [        U5      O[        [	        US+S,S-S*5      5      nU(       d  MD  U
R                  U5        MW     X£S('   Ow[        U[        5      (       a$  UR                  S.5      S/L a  US   (       a  / US('   O>[        U	[        5      (       a)  U	R                  5       (       a  U	R                  5       /US('   [        U R                  S05      [        5      (       a  U R                  S05      OSn[        U=(       d    0 R                  S15      5      =(       dN    [        [	        U R                  S25      =(       d    0 S05      5      =(       d    Uc  [        [	        U S05      5      OSn[	        U S3S4S5S6S75      n[        U[        5      (       aB  [        UR                  S85      [        5      (       a  UR                  S85      O[	        US9S:5      n/ SSnnn[        U[        5      (       Gaf  U(       Ga^  U GHW  n[        U[        5      (       Ga  [        [        [	        US"S;S<S=S>5      5      5      n[!        [	        US?S@SA5      5      n[        [	        USBSCSDSESFSGS,5      5      nU[        U["        5      (       a  USH SI3OSU4 Vs/ s H  nU(       d  M  UPM     nnU(       a   UR                  SJR%                  U5      5        U(       a&  Ub  UU:”  a  U[        U["        5      (       a  UOUnnMû  Uc)  [        U["        5      (       a  Ub  UU:”  a  UnGM!  GM$  GM'  GM*  [        U5      (       d  GM=  UR                  [        U5      5        GMZ     SnUbc  [!        UR                  SK5      5      n[!        UR                  SL5      5      nUc  Ub)  [#        U=(       d    SM5      [#        U=(       d    SM5      -   nUc  [!        [	        U SNSOSPSQ5      5      nUc'  [        U[        5      (       a  U(       a  ['        U5      nUc  TC(       a  [)        [        TCSRSSST5      5      nUc>  [        [        [	        U SUSVSW5      5      5      =(       d    [        [        TCSXSYSZ5      5      nUc.  [!        [	        U S[S\5      5      nUc  [)        [        TCS]5      5      n[        U[        5      (       a:  UR                  5       (       a%  UR                  5       R+                  5       S^-   /U-   n[-        S_ UUU4 5       5      (       d  U(       a_  [        U["        [.        45      (       a  [#        U5      OSU[        U["        [.        45      (       a  [#        U5      OSU=(       d    SS`.USa'   [        [	        U SbScSd5      5      n[        U5      =(       d    [        [        TCSeSfSg5      5      n/ nU(       a  UR                  USSh.5        [	        U SiSjSk5      n[        U[        5      (       Ga  U(       aü  / n U Ho  n![        U![        5      (       d  M  [        [        [	        U!SlSmSnSo5      5      5      n"[        [        [	        U!SpSqSrSs5      5      5      nU R                  U"U45        Mq     U  V#s/ s H  n#U#SM   (       d  U#St   (       d  M  U#PM     n n#U (       aV  / n[1        U 5       HE  u  n$u  n"nU$St-   ['        U 5      :  a  U U$St-      SM   OSn%UR                  U"U=(       d    U%Sh.5        MG     U=(       d    SUSi'   [        U R                  Su5      [        5      (       a  U R                  Su5      O0 n&[        U&R                  Sv5      5      =(       d7    [        [	        U SwSxSySzS{5      5      =(       d    [        [        TCS|S}S~5      5      USw'   [        U&R                  S5      5      =(       d    [        [	        U S€S�S‚5      5      US'   [!        [	        U SƒS„S…S†5      5      n'U'c  [)        [        TCS‡SˆS‰5      5      n'[        U'["        [.        45      (       a  SMU's=::  a  SŠ::  a  O  O[#        U'5      OSUS„'   [	        U S‹SŒS�SŽS�5      n([3        U R                  S�5      5      u  n)n*[        U([        5      (       a  [5        U(U*5      O
[        U*5      n+U+(       d  U(b  [7        U(5      n+U+ V,s/ s H  n,U,S+   U,R                  S‘5      S’.PM     sn,=(       d    SUSŒ'   [        U([        5      (       a  [9        U(5      OSUS“'   [;        U TC5      US”'   [        U R                  S•5      [        5      (       a  U R                  S•5      OSn-U-(       a  [=        U-5      O/ n.S–R%                  S— U. 5       5      =(       d    U-(       a  [>        OSUS˜'   [	        U S™SšS›SœS•5      n// n0U/GbU  [A        U/5       GHE  u  n1n2S�R%                  U15      RC                  5       mD[-        UD4Sž jSŸ 5       5      (       a|  [        U2["        [.        45      (       aa  [        U2[D        5      (       dL  SMU2s=::  a  S ::  a?  O  O<U0R                  [        U2[.        5      (       a  [/        U25      O
[#        U25      5        M¼  [        U2[        5      (       d  MÓ  [F        RH                  " S¡U2R                  5       5      (       d  GM   U0R                  [/        U2R                  5       RK                  S¢5      R                  5       5      5        GMH     U0=(       d    SUS£'   [	        U S¤S¥S¦5      n3[        U3[        5      (       a  U3O0 n3Sn4[!        U3R                  S§5      5      n5U5b"  U5(       a  [#        U55       S¨U5St:w  a  S©OSª S«3OS¬n4U4c@  [        [	        U S­5      5      n6U6(       a$  [M        U65      (       a  S®O[M        U65      S¯L a  S¬OU6n4U4cŒ  [	        U S°S±S²S³S´5      n7[        U7[D        5      (       a  U7(       a  S®OS¬n4O[[        U7[        5      (       a;  [	        U7SSµS¶S·5      n2[        U2[D        5      (       a  U2(       a  S®OS¬O
[        U25      n4O[        U75      n4U4c  [        [        TCS¸S¹5      5      n4Sº V!s/ s H  n!U!U3;   d  M  U3R                  U!5      PM     n8n!U8(       a,  [O        S» U8 5       5      (       a  [-        S¼ U8 5       5      OSn9O$[	        U3S½S¾S¿SÀSÁSÂ5      n9U9c  [	        U S¿S½SÃSÄSÀ5      n9SÅU3;   a  U3R                  SÅ5      O[	        U3SÆSÇSÈ5      n:U:c  [	        U SÇSÆSÉ5      n:SÊU3;   a  U3R                  SÊ5      O[	        U3SËSÌSÍ5      n;U;c  [	        U SÌSËSÎ5      n;U3R                  SÏ5      n<US   c&  [        [        U3R                  S5      5      5      US'   UC4SÐ jn=U4U=" U9SÑ5      U=" U:SÒ5      U=" U;SÓ5      SÔ.n>U<S/L a  U>S³   (       a  U>S³==   SÕ-  ss'   [-        SÖ U>RQ                  5        5       5      (       a  U>OSUS×'   U)=(       d    [S        U5      n?U?=(       d    SUSØ'   [	        U SÙSÚ5      n@[	        U SÛSÜSÝSÞ5      nAUAc"  [        W@[        5      (       a  [	        W@SÛSÜ5      nAWAb  [!        WA5      O[U        [        TCSßSà5      5      USá'   [	        U SâSãSäSå5      nBUBc#  [        W@[        5      (       a  [	        W@SâSãSæ5      nBWBb  [!        WB5      O[U        [        TCSçSè5      5      USé'   [W        U5      $ s  snf s  sn#f s  sn,f s  sn!f )êa’  The deep block out of a Motorway car page: its __NEXT_DATA__ blob
first (the names Motorway uses, seen live in data/logs/motorway_detail.log
and deep_read.log), the page's own words second for anything the data
did not carry. A page with no car block is a failed read, said plainly,
never an empty "read" (2026-09-17: six of ten starred cars came back
blank with no error, their sale had closed). Pure.Nz†Motorway's page for this car carried no car data. The sale may have closed or the listing been withdrawn; try again on a live listing.ÚmotÚ
motDetailsÚ
motHistoryÚmotExpiryDateÚ	motExpiryÚmotDueÚ
motDueDateÚ
motExpiresÚ
expiryDateÚexpiryÚexpiresÚdueDateú
MOT expiryúMOT dueúMOT expiresúMOT expiry dateÚMOTr   Ú	motResultÚ	motStatusÚmotTestResultÚresultÚstatusÚ
testResultú
MOT resultú
MOT statusr   ÚlastMotDateÚmotTestDateÚlastTestDateÚtestDateÚdatezLast MOTz
MOT testedzLast MOT testr   ÚmotAdvisoriesr	   ÚadvisoryNoticesÚadvisoryrE   rÌ   ÚnoticeÚadvisoriesAvailableTÚserviceHistoryÚserviceRecordrí   ÚserviceHistoryRecordsÚserviceRecordsÚserviceHistoryEntriesÚserviceEntriesÚservicesr¨   ÚrecordsÚentriesÚserviceDateÚdateOfServiceÚ
servicedAtÚ	createdAtÚmileageÚodometerÚmilesÚserviceCentreÚdealerÚgaragerÐ   ÚserviceTypeÚproviderrO   ú milesre   ÚofficialServiceStampsCountÚindependentServiceStampsCountr   ÚnumberOfServicesÚserviceCountÚserviceStampsÚnumberOfServiceStampsúService stampsúNumber of servicesÚServicesÚlastServiceDateÚlastServicedDateÚlastServiceúLast serviceúLast servicedúLast service dateÚlastServiceMileageÚlastServicedMileagezLast service mileagez service historyc              3   ó(   #   • U  H  oS Lv •  M
     g 7frg   r7   ri   s     r)   rl   Ú from_motorway.<locals>.<genexpr>r  s   é € Ð
DÒ"C˜Q�D�=Ò"Cùó   ‚r›   r
   ÚkeeperStartDateÚcurrentKeeperSinceÚkeeperSincezKeeper start dateúCurrent keeper sincezOwned since©ÚfromÚtor   ÚkeeperHistoryÚpreviousKeepersr«  Ú	startDateÚstartÚdateFromr¬  ÚendDateÚendÚdateTor$   ÚspecificationÚexteriorr   ÚcolorÚexteriorColourÚexteriorColorÚ
bodyColourÚColourÚColorúExterior colourr   ÚinteriorColourÚinteriorTrimÚ
upholsteryÚnumberOfKeysr   ÚkeyCountÚnoOfKeysÚKeysúNumber of keysú
Spare keysé	   ÚconditionAndDamager   ÚdamageReportÚ	conditionÚbodyworkDamagerì   rÜ   rÛ   r   r   ÚwheelsAndTyresõ    Â· c              3   ó*   #   • U  H	  oS    v •  M     g7f)rE   Nr7   )rj   r?  s     r)   rl   r¤  ¬  s   é € Ð!A²[° F¦)²[ùs   ‚r   r$  Ú	tyreTreadÚ
tyreDepthsÚtyreConditionr(  c              3   ó,   >#   • U  H	  oT;   v •  M     g 7frg   r7   )rj   r?  r)  s     €r)   rl   r¤  ´  s   øé € Ð?Ò&> ˜–9Ò&>ùrÖ   )ÚtreadÚdepthÚmmé   z\d+(\.\d+)?\s*mmrG   r   ÚhpiHistoryCheckÚhistoryCheckÚhpiÚfinanceAgreementsCountz finance agreementrF   r9   z	 recordedÚClearÚ	onFinanceÚOutstandingFÚoutstandingFinanceÚfinanceStatusÚhasOutstandingFinancerœ   Ú
hpiFinanceÚoutstandingÚ
hasFinancer¶   úOutstanding financeÚFinance)ÚhasBeenWrittenOffByDamageÚhasBeenWrittenOffByTheftÚhasBeenSalvagedc              3   óB   #   • U  H  n[        U[        5      v •  M     g 7frg   )rh   rw   rÒ   s     r)   rl   r¤  Ô  s   é € Ð3YÒQXÈA´J¸qÄ$×4GÐ4GÒQXùs   ‚c              3   ó(   #   • U  H  oS L v •  M
     g7f)TNr7   rÒ   s     r)   rl   r¤  Ô  s   é € Ð,¢G˜q�d•¢Gùr¥  ÚisWrittenOffÚ
isWriteOffÚ
writtenOffÚwriteOffCategoryÚisInsuranceWriteOffÚisCatWriteOffÚinsuranceWriteOffÚwriteOffÚhasBeenStolenÚisStolenrž   ÚisReportedStolenÚstolenStatusÚhasBeenImportedÚ
isImportedrŸ   ÚisImportÚimportStatusÚisMileageClockedc                 ó"  >• [        U [        5      (       a  U $ [        U [        5      (       aC  U R                  5       R	                  5       nUS;   a  gUS;   d  UR                  S5      (       a  gg U c  T(       a  [        [        TU5      5      $ g )N)r`   r]   ra   r_   r9   F)rZ   r\   r.  T)rh   rw   r-   r>   rC   rb   rc   rŒ   )r¬   rÍ   rF   r‡   s      €r)   rx   Úfrom_motorway.<locals>.flagã  sx   ø€ Ü�aœ×ÑØˆHÜ�aœ×ÑØ—‘“	—‘Ó!ˆAØÐ8Ó8ØØ�OÓ# q§|¡|°E×':Ñ':ØØØ‰9žÜœ+ e¨UÓ3Ó4Ð4Ør0   úWritten offÚStolenÚImportedr    z, mileage clockedc              3   ó(   #   • U  H  oS Lv •  M
     g 7frg   r7   rÒ   s     r)   rl   r¤  ô  ó   é € Ð"Fº+°Q¨D¥=º+ùr¥  r   r   rë   ÚauctionÚreservePriceÚreserveÚpriceReserveÚminimumPriceúReserve priceÚReserver   Ú
currentBidÚ
highestBidÚcurrentHighestBidÚtopBidr·   úCurrent bidúHighest bidr   ),r*   rï   r/   r   r´   rh   r-   r>   r¢   rH   r½   rM   rŒ   r¡   rr   rŽ   r»   rB   rs   ru   rR   Ú
capitalizerÝ   rº   r„   r0  rU  rá   r  r  rB  ÚNO_WHEEL_PROBLEMSr©   rC   rw   r?   r@   rƒ   rc   Úallr®   rÄ   rX   r£   )Er³   Ú	blob_textÚ	page_textr(   rç   rY  ÚexpÚresÚtestedÚadvr¨   ÚaÚtÚsh_blockÚshrƒ  rš   r˜   r™   ÚrÚwhenr‹  ÚwhoÚbÚbitsr—   ÚofficialÚindepÚksÚks_isor   ÚklÚstartsr'   Úfrk   rŠ   ÚnxtÚspecr   r  Úgallery_photosrM  ÚdmgÚer#  Úwheel_itemsÚtyrÕ  r«   r¬   rÙ  Úfin_textÚn_finÚon_finÚfinÚwo_bitsÚwoÚstr-  Úclockedrx   Úhcr   rë   Úres_nowÚbidr‡   r)  sE                                                                      @@r)   Úfrom_motorwayr;    s  ù€ ô 	‹€AÜ
˜4Ó
 €CØ
�{Üð  _ó  `ð  	`Ø€DÜ�YÓ€Eô �D˜% ¨|Ó
<€CÜ
�D˜/¨;¸À,ÐP\Ó
]€CÜ�#”s×Ñ C§I¡I§K¡KØˆØ
�{”z #¤t×,Ñ,Ü˜˜\¨8°YÀ	ÓJˆÜœt C›yÓ)÷  K¬W´[ÀÈÐV_Ðanð  qBð  DIó  6Jó  .K€A€l�OÜ
�D˜+ {°OÓ
D€CØ
�{”z #¤t×,Ñ,Ü˜˜X x°Ó>ˆØ
�{”z #¤t×,Ñ,Ø�g‰g�kÓ"ˆÜ˜3“i×W¤4¬°E¸<ÈÓ(VÓ#W€A€l�Oô �t˜]¨M¸>ÓJ€FØ�~œ* S¬$×/Ñ/Ü˜3 ¨z¸6ÓBˆÜœt F›|Ó,×v´¼ÀEÈ:ÐWcÐetÓ8uÓ0v€A€l�OÜ
�D˜/¨<Ð9JÓ
K€CØ
�{”z #¤t×,Ñ,Ü˜˜\Ð+<¸jÓIˆÜ�#”t×ÑØˆÛˆAÜ)¨!¬T×2Ñ2”�Q”¼¼YÀqÈ&ÐR_ÐaiÐkuÓ=vÓ8wˆAßˆqØ—‘˜Q–ñ ð  ˆ,ŠÜ	�Cœ×	Ñ	 3§7¡7Ð+@Ó#AÀTÒ#IÈaÐP\ÏoØˆˆ,ŠÜ	�Cœ×	Ñ	 #§)¡)§+¡+ØŸ9™9›;˜-ˆˆ,‰ô .8¸¿¹ÐAQÓ8RÔTX×-YÑ-Yˆt�x‰xÐ(Ô)Ð_c€HÜ	ˆx�~˜2×"Ñ" ?Ó3Ó	4÷ 
S¼¼YÀtÇxÁxÐPYÓGZ×G`Ð^`ÐbrÓ=sÓ8t÷ 
SØ7?Ñ7GŒD”˜4Ð!1Ó2Ô3ÈTð ä˜Ð5Ð7GÐI`ÐbrÐt~Ó€GÜ�'œ4× Ñ Ü*4°W·[±[ÀÓ5IÌ4×*PÑ*P�'—+‘+˜gÔ&ÔV_Ð`gÐirÐt}ÓV~ˆØ&(¨$°�|ˆI€FÜ�'œ4× Ò §WÜˆAÜ˜!œT×"Ò"Ü¤¤Y¨q°&¸-ÈÐZfÐhsÓ%tÓ uÓv�ÜœY q¨)°ZÀÓIÓJ�Üœ9 Q¨¸À8ÈVÐUbÐdnÐp}Ó~Ó�Ø$(Ä
È5ÔRU×@VÑ@V¨U°1¨I°VÑ*<Ð\`ÐbeÑ#fÓlÒ#f˜aÔjkŸÑ#f�ÐlÞØ—M‘M $§)¡)¨D£/Ô2Þ˜YÑ.°$¸Ó2BØ.2¼ZÈÌs×=SÑ=S±EÐYe˜|�I™|Ø‘\¤j°¼×&<Ñ&<À,ÑBVÐZ_ÐbnÓZnØ#(“Lò [oÒ&<’\ä�a—”Ø—‘œd 1›g×&ñ ð €FØÑÜ˜Ÿ™Ð%AÓBÓCˆÜ�X—\‘\Ð"AÓBÓCˆØÑ 5Ñ#4Ü˜Ÿ QÓ'¬#¨e¯j°q«/Ñ9ˆFØ�~Ü”i Ð&8¸.È/Ð[rÓsÓtˆØ�~œ* W¬d×3Ñ3¾Ü�W“ˆØ�~ž%Üœ EÐ+;Ð=QÐS]Ó^Ó_ˆØÑÜœT¤)¨DÐ2CÐEWÐYfÓ"gÓhÓi÷ aÜ”{ 5¨.¸/ÐK^Ó_Ó`ð 	àÑÜœI dÐ,@ÐBWÓXÓYˆØÑÜ!¤+¨eÐ5KÓ"LÓMˆLÜ�"”c×Ñ˜rŸx™xŸz™zØ—(‘(“*×'Ñ'Ó)Ð,>Ñ>Ð?À&ÑHˆÜ
Ñ
D 6¨9°lÑ"CÓ
D×DÑDÎÜ1;¸FÄSÌ%ÀL×1QÑ1Q¤# f¤+ÐW[Ø%.Ü=GÈÔWZÔ\aÐVb×=cÑ=c¬¨LÔ(9ÐimØ"(§.¨Dñ2ˆˆ)‰ô 
Œi˜Ð/Ð1EÀ}ÓUÓ	V€BÜ�b‹\×tœW¤[°Ð8KÐMcÐerÓ%sÓt€FØ€GÞØ�‰ ¨dÑ3Ô4Ü	�4˜ OÐ5FÓ	G€BÜ�"”d×Ò¦ØˆÛˆAÜ˜!œT×"Ó"ÜœT¤)¨A¨v°{ÀGÈZÓ"XÓYÓZ�ÜœT¤)¨A¨t°YÀÀxÓ"PÓQÓR�Ø—‘˜q !˜fÖ%ñ	 ñ
 $Ó4šV˜ q¨§t¨q°­t—!™VˆÐ4Þð ˆGÜ& vÖ.‘	�‘6�A�qØ*+¨a©%´#°f³+Ó*=�f˜Q ™U‘m AÒ&À4�Ø—‘¨°·°cÑ:Ö;ñ /ð —?˜d€A€i�Lô )3°4·8±8¸OÓ3LÌd×(SÑ(Sˆ4�8‰8�OÔ$ÐY[€DÜ�t—x‘x 
Ó+Ó,÷ J´´Y¸tÀXÈwÐXhÐjyð  |Hó  6Ió  1J÷ JÜ”˜E 8¨WÐ6GÓHÓIð €h�Kä˜Ÿ™ *Ó-Ó.×w´$´yÀÐGWÐYgÐiuÓ7vÓ2w€A€j�MÜ”	˜$ °¸
ÀJÓOÓP€DØ�|Ü”k %¨Ð1AÀ<ÓPÓQˆÜ'¨¬s´E¨l×;Ñ;ÀÀTÅÈQÆ”�D”	ÐTX€A€f�Iô �TÐ/°¸>È;ÐXhÓi€DÜ$4°T·X±X¸iÓ5HÓ$IÑ!€N�MÜ2<¸TÄ4×2HÑ2HŒ/˜$ Ô
.ÌdÐS`ÓNa€CÞ�4Ñ#Ü˜4Ó ˆÙQTÓUÒQTÈA˜A˜f™I°A·E±E¸+Ó4FÔGÑQTÑU×]ÐY]€A€h�Kô
 <FÀdÌD×;QÑ;QÔ1°$Ô7ÐW[€AÐÑÜ/°°eÓ<€A€oÑÜ+5°d·h±hÐ?OÓ6PÔRV×+WÑ+WˆT�X‰XÐ&Ô'Ð]a€FÞ-3”/ &Ô)¸€Kð —k‘kÑ!A±[Ó!AÓA×lÖ[aÕFWÐgk€A€l�Oô 
�4˜ +¨|¸_ÐN^Ó	_€BØ	€BØ	‚~Ü˜R—y‰GˆD�!Ø—8‘8˜D“>×'Ñ'Ó)ˆDÜÔ?Ñ&>Ó?×?Ñ?ÄJÈqÔSVÔX]ÐR^×D_ÑD_ÔhrÐstÔvz×h{Ñh{ð  ABð  FGõ  AMð  KMö  AMØ—	‘	¤j°´E×&:Ñ&:œ% œ(ÄÀAÃÖGÜ˜Aœs×#Ó#¬¯ªÐ5HÈ!Ï'É'Ë)×(TÔ(TØ—	‘	œ% §¡£	× 0Ñ 0°Ó 5× ;Ñ ;Ó =Ó>×?ñ !ð —J˜$€A€j�Mô
 �DÐ+¨^¸UÓ
C€CÜ˜C¤×&Ñ&‰#¨B€CØ€HÜ�—‘Ð1Ó2Ó3€EØÑÞ\a”c˜%“j�\Ð!3¸5ÀA»:±CÈ2Ð3NÈiÑXÐgnˆØÑÜ”i  kÓ2Ó3ˆÞÜ(.¨v¯©‘}ÌÈvËÐZ_ÒH_¹WÐekˆHØÑÜ˜Ð2°OÐE\Ð^gÐiuÓvˆÜ�cœ4× Ñ Þ(+‘}°‰HÜ˜œT×"Ñ"Ü˜#˜x¨¸ÀgÓNˆAÜ<FÀqÌ$×<OÑ<O®™±ÔUYÐZ[ÓU\‰Hä˜C“yˆHØÑÜœ EÐ+@À)ÓLÓMˆÙ#oÓ|Ò#o˜aÐstÐx{Ñs{‹zˆs�w‰w�qŽzÑ#o€GÐ|ÞÜ03Ñ3YÑQXÓ3Y×0YÑ0YŒSÑ,¡GÓ,Ô,Ð_c‰ä�s˜N¨L¸,ÐHZÐ\qð  tCó  DˆØ‰:Ü˜4 ¨~Ð?RÐT^Ð`rÓsˆBØ%4¸Ó%;ˆ�‰�Ô	!ÄÈ3ÐPZÐ\dÐfxÓAy€BØ	�zÜ�t˜X z°>ÓBˆØ'8¸CÓ'?ˆ�‰Ð"Ô	#ÄYÈsÐT`ÐblÐnxÓEy€BØ	�zÜ�t˜Z¨°~ÓFˆØ�g‰gÐ(Ó)€GØˆ�ÑÜ"¤4¨¯©°Ó(@Ó#AÓBˆˆ,‰õð ©d°2°}Ó.EÑQUÐVXÐZbÓQcÙ˜2˜zÓ*ñ
,€Bà�$‚˜2˜iŸ=Ø
ˆ9‹Ð,Ñ,‹Ü"Ñ"F¸"¿)¹)¼+Ó"F×FÑF™ÈD€A€oÑð ×9œ¨yÓ9€FØ—.˜D€A€h�Kô ˜˜i¨Ó3€GÜ˜˜n¨i¸ÈÓX€GØ�œ: g¬t×4Ñ4Ü˜G ^°YÓ?ˆØ(/Ñ(;”t˜G”}ÄÌ+ÐV[Ð]lÐnwÓJxÓAy€A€mÑÜ
�D˜,¨Ð6IÈ8Ó
T€CØ
�{”z '¬4×0Ñ0Ü˜ ¨|¸XÓFˆØ #¡”4˜”9´X¼kÈ%ÐQ^Ð`mÓ>nÓ5o€A€i�LÜ�!‹9Ðùòc mùòd 5ùò4 Vùòd }s1   Ò:ADÓ	ADâADâ4ADë!ADú
ADúADc           	      ó:  • SSK n UR                  R                  UR                  R                  UR                  R                  [        5      5      5      nUR                  R                  USS5      nUR                  USS9  [        UR                  R                  US5      SS	S
9 nUR                  [        5        SU  SU S35        U=(       d    /  H  nUR                  SU S35        M     SSS5        g! , (       d  f       g= f! [         a     gf = f)ztAppend one read's key notes to data/logs/deep_read.log, best
effort: the log must never break the read it describes.r   Nr³   ÚlogsT)Úexist_okzdeep_read.logr  zutf-8)Úencodingr(  r}   z  )Úosr«   ÚdirnameÚabspathÚ__file__rs   ÚmakedirsÚopenÚwriter,   Ú	Exception)ÚplatformrÚ   Únotesr@  Úrootr=  r(  r^   s           r)   Ú	log_notesrK    sá   € ó ð	Ø�w‰w�‰˜rŸw™wŸ™¨r¯w©w¯©¼xÓ/HÓIÓJˆØ�w‰w�|‰|˜D &¨&Ó1ˆØ
�‰�D 4ˆÑ(Ü�"—'‘'—,‘,˜t _Ó5°sÀWÒMÐQRØ�G‰G”y“{�m 1 X J¨a°¨u°BÐ7Ô8Ø—[˜b’[�Ø—‘˜"˜Q˜C˜r˜
Ö#ñ !÷ N×MÖMûô ó Ùðús1   †B#D Â)A
C<Ã3D Ã<
D
ÄD Ä
D Ä
DÄDc                 óˆ  ^
• SnSn/ / pT[        [        U 5      =(       d    U 5       GH  u  pgSR                  U5      nUR                  5       m
T
R	                  S5      (       d,  T
R	                  S5      (       d  T
R	                  S5      (       a  Mk  T
R	                  S5      (       a  T
R	                  S5      (       d  M™  U S	[
        R                  " U5      S
S  3n	[        U
4S jU 5       5      (       a  UR                  U	5        Mä  [        U
4S jU 5       5      (       d  GM  UR                  U	5        GM     XE-   S
U $ )a  Every path in the page data whose name is about the things the
deep read wants, with a short value, for data/logs/deep_read.log: the
names Motorway really uses are on record after the first live read,
so the next fix needs no guessing (the same habit as motorway.py's
_detail_keys_once).)rY  Útyrer   r·  rE  Úadvisr*  Úmain)Úkeeperr°   r   rÙ  rž   ÚwrittenÚimportrÊ  rv  rì   ÚwheelÚmodifÚ.zbidding.z	location.zseller.zgallery.images.[zgallery.images.[0]z = Néx   c              3   ó,   >#   • U  H	  oT;   v •  M     g 7frg   r7   ©rj   r?  Úlows     €r)   rl   Ú%motorway_key_notes.<locals>.<genexpr>*  s   øé € Ð'¢˜A�CŽx¢ùrÖ   c              3   ó,   >#   • U  H	  oT;   v •  M     g 7frg   r7   rX  s     €r)   rl   rZ  ,  s   øé € Ð)¢5˜a�c–¢5ùrÖ   )	r©   rï   rs   rC   rb   rÇ   rÈ   rÝ   rŽ   )r³   r‘   ÚfirstÚlaterÚheadÚtailr«   r¬   r)  rS  rY  s             @r)   Úmotorway_key_notesr`    s  ø€ ð Q€EØ€EØ�Rˆ$ÜÔ)¨$Ó/×7°4×8‰ˆØ�x‰x˜‹~ˆØ�j‰j‹lˆØ�>‰>˜*×%Ñ%¨¯©¸×)DÑ)DÈÏÉÐW`×HaÑHaÙà�>‰>Ð,×-Ñ-°c·n±nÐEY×6ZÑ6ZÙØ��sœ4Ÿ:š: a›=¨¨#Ð.Ð/Ð0ˆÜÔ'¡Ó'×'Ñ'Ø�K‰K˜ÖÜÔ)¡5Ó)×)Ô)Ø�K‰K˜×ñ 9ð ‰K˜˜%Ð Ð r0   z3https://carwow-sell-my-car\.imgix\.net/[A-Za-z0-9]+z1?w=1400&auto=compress,format&q=70&cs=srgb&fit=maxc                 ó’   • [         R                  [        U =(       d    S5      5      nU(       a  UR                  S5      [        -   $ S$ )a€  One Carwow photo at a size the screen can show large. Carwow hangs
its own sizing on the asset key and sometimes twice over (the live
page carries "...?ixlib=...&q=80?ar=3:2&fit=crop"), so everything
after the first question mark goes and ours replaces it. That also
makes the same photo one string wherever it was found, so a damage
photo matches its entry in the gallery list. Pure.r9   r   N)Ú_CW_GALLERYrJ   r-   rA   Ú_CW_BIG)rÚ   rG   s     r)   Ú_cw_bigrd  8  s6   € ô 	×Ñœ3˜sŸy b›>Ó*€AÞ%&ˆA�G‰G�A‹JœÑ Ð0¨DÐ0r0   c                 ó  • 0 n[         R                  [        U =(       d    S5      5       H:  nUR                  UR	                  S5      UR	                  S5      [
        -   5        M<     [        UR                  5       5      $ )Nr9   r   )rb  rÁ   r-   rÂ   rA   rc  rr   r®   )ÚhtmlrÃ   rG   s      r)   Úcarwow_photosrg  C  sX   € Ø€DÜ×!Ñ!¤# d§j¨b£/Ö2ˆØ�‰˜Ÿ™ ›
 A§G¡G¨A£J´Ñ$8Ö9ñ 3ä�—‘“ÓÐr0   z•listing__vehicle-condition-damage-item__detail(.*?)(?=listing__vehicle-condition-damage-item__detail|listing__vehicle-condition-report-item-header|$)zDlisting__vehicle-condition-report-item-header-title"[^>]*>\s*([^<]+)z$<strong[^>]*>\s*([^<]+?)\s*</strong>zIlisting__vehicle-condition-damage-item__description"[^>]*>\s*([^<]+?)\s*<zMlisting__vehicle-condition-report-item-damage-label.*?<img[^>]*?src="([^"]+)"c           	      óP  • SSK n[        U =(       d    S5      nSU;  a  / $ [        R                  U5       Vs/ s H@  o3R	                  5       UR                  UR                  S5      5      R                  5       4PMB     nn/ [        5       pe[        R                  U5       GH{  nUR                  S5      nSnU H  u  pšX“R	                  5       :  d  M  U
nM     [        R                  U5      n[        R                  U5      nU(       a.  UR                  UR                  S5      5      R                  5       OSnU(       a.  UR                  UR                  S5      5      R                  5       OSnU(       a  U(       a  U SU 3nOU=(       d    U=(       d    UnU(       d  GM  [        R                  U5      nU(       a)  [        UR                  UR                  S5      5      5      OSnXÞ4U;   a  GMV  UR                  XÞ45        UR!                  XÞS.5        GM~     U$ s  snf )aË  The declared damage on a Carwow listing page, each entry with the
photo of that very damage beside it. [] when the page carried no
condition report, which is the caller's cue to fall back to the
page's visible words. Golden rule 4: a block whose words could not be
read is left out rather than invented, and a block with no photo
keeps a null photo_url rather than borrowing another one. Pure,
tested against data/fixtures/carwow_condition_report_sample.html.r   Nr9   z.listing__vehicle-condition-damage-item__detailr$   r9  rÛ   )rf  r-   Ú_CW_DMG_TITLErÁ   r°  ÚunescaperA   r>   r*  Ú_CW_DMG_ITEMÚ_CW_DMG_WHERErJ   Ú_CW_DMG_WHATÚ_CW_DMG_PHOTOrd  r+  rŽ   )rf  ÚhtmllibrE   rG   Úheadsr”   rÃ   ÚchunkrA   ÚposrÎ   ÚwhereÚwhatrS  rÙ   s                  r)   Úcarwow_damageru  j  s²  € ó Üˆt�z�r‹?€DØ7¸tÓCØˆ	ÜHU×H^ÑH^Ð_cÔHdÓeÒHdÀ1�g‰g‹i˜×)Ñ)¨!¯'©'°!«*Ó5×;Ñ;Ó=Ó>ÑHd€EÐeØ”C“EˆÜ×"Ñ" 4×(ˆØ—‘˜“
ˆØˆÛ‰JˆCØ—W‘W“Y�Ø’ñ  ô ×$Ñ$ UÓ+ˆÜ×"Ñ" 5Ó)ˆÞ<A�× Ñ  §¡¨Q£Ó0×6Ñ6Ô8ÀtˆÞ:>ˆw×Ñ §
¡
¨1£Ó.×4Ñ4Ô6ÀDˆÞ–TØ�W˜B˜t˜fÐ%‰Dà×)˜D×) EˆDÞÚÜ×$Ñ$ UÓ+ˆÞ=B”˜×(Ñ(¨¯©°Q«Ó8Ô9ÈˆØˆ=˜DÓ ÚØ�‰�$�ÔØ�
‰
˜DÑ5×6ñ+ )ð, €Jùò1 fs   ¸AH#c                 óÔ   • [         R                  " S[        U =(       d    S5      R                  5       [         R                  5      nU(       a  [        UR                  S5      5      $ S$ )z^Carwow's "3 reported" as 3; "No damage", "No damage reported" and
anything else as None. Pure.z(\d+)\s+reportedr9   r$   N)r?   r@   r-   r>   rT   rB   rA   rQ   s     r)   Ú_carwow_countrw  ‘  sE   € ô 	�ŠÐ(¬#¨d¯j°b«/×*?Ñ*?Ó*AÄ2Ç4Á4ÓH€AÞŒ3ˆq�w‰w�q‹z‹?Ð) TÐ)r0   z&^(current|\d+(?:st|nd|rd|th))\s+owner$z ^(.+?)\s*[\u2013\u2014-]\s*(.+)$c                 ó˜  •  [        S [        U 5       5       5      n/ nUS-   nUS-   [        U 5      :  Gah  [        R                  X   R                  5       5      (       Ga=  [        R                  XS-      R                  5       5      nU(       d  GO[        UR                  S5      5      nUR                  S5      R                  5       R                  5       S:X  a  SO[        UR                  S5      5      nU(       d  U(       a  UR                  XVS.5        X3S-   [        U 5      :  a/  [        R                  XS-      R                  5       5      (       d  SOS-  nUS-   [        U 5      :  a-  [        R                  X   R                  5       5      (       a  GM=  [        [        U5      5      =(       d    S$ ! [         a     gf = f)u	  Every owner from the Ownership history section of a Carwow car page,
oldest first, as {"from", "to"} with "to" None for the current owner.
Seen live 2026-09-29: "Ownership history", then for each owner newest
first a label ("Current owner", "2nd owner", "1st owner"), its dates
("07 Oct 2015 â€“ 06 Jan 2020", or "... â€“ Present") and how long.
Only the current keeper's start used to be read, so the car page listed
one owner of four (SA18AJX, Steven). None when the section is not
there or no owner's dates read. Pure.c              3   ór   #   • U  H-  u  pUR                  5       R                  5       S :X  d  M)  Uv •  M/     g7f)zownership historyN)r>   rC   )rj   rŠ   r~   s      r)   rl   Ú!carwow_keepers.<locals>.<genexpr>¦  s+   é € Ð`Ò#3™4˜1°q·w±w³y·±Ó7HÐL_Ñ7_—Q‘QÒ#3ùs   ‚(7®	7Nr$   r;   Úpresentrª  r<   )Únextr„   ÚStopIterationru   Ú	_CW_OWNERÚmatchr>   Ú_CW_SPANrM   rA   rC   rŽ   rr   Úreversed)r‡   r°  r”   rŠ   rG   r(  r  s          r)   Úcarwow_keepersr‚  œ  s\  € ðÜÑ`¤9¨UÔ#3Ó`Ó`ˆð €CØ�‰	€AØ
ˆa‰%”#�e“*Ô
¤§¡°±·±Ó1A×!BÒ!BÜ�N‰N˜5 Q¡™<×-Ñ-Ó/Ó0ˆÞÙÜ�A—G‘G˜A“JÓˆØ—G‘G˜A“J×$Ñ$Ó&×,Ñ,Ó.°)Ó;‰DÄÈÏÉÐQRËÓATˆÞ–Ø�J‰J Ñ+Ô,Ø	�a‘%œ#˜e›*Ó$¬Y¯_©_¸UÀqÁ5¹\×=OÑ=OÓ=Q×-RÑ-R‰QÐXYÑYˆð ˆa‰%”#�e“*Ó
¤§¡°±·±Ó1A×!BÔ!Bô ”˜“Ó×& $Ð&øô ó Ùðús   ‚F< Æ<
G	ÇG	c           	      ód  • U  Vs/ s H  oR                  5       PM     nnS=n=pESnSU;   Ga"  UR                  S5      n/ nXS-   US-     H*  nUR                  5       S;   a    OUR                  U5        M,     U(       a  [        US   5      n[	        U5      S:”  a3  [
        R                  " SUS   [
        R                  5      (       a  US   n[        [        USS	5      5      n/ n[        U5       HY  u  p‘[
        R                  " S
U[
        R                  5      n
U
(       d  M4  X‰S-   U	S-   [        U
R                  S5      5      -    n  O   UcÖ  SU;   aÐ  UR                  S5      nUS-   [	        U 5      :  a  [        XS-      5      OSnUS-   [	        U 5      :  a  XS-      OSn[
        R                  " SU[
        R                  5      n
U(       aS  U
(       aL  U
R                  S5      R                  5       n[
        R                  " SU[
        R                  5      (       a  / nX4XV4$ s  snf )aJ  The latest MOT off a Carwow car page, read live 2026-09-25 off
listings 14696768 (PH58EEE) and 14677268 (BL18YCN). The MOT history
panel opens with "Latest MOT", the test date, the result, then
Mileage, MOT Test Number and "Expiry Date" as label then value, then
"4 advisories" (or "1 advisory") followed by that many lines, then
the older tests under "MOT history". The strip at the top of the page
carries only "Last MOT", the date and "Pass with 4 advisories", used
when the panel is not there. Returns (tested, result, expiry,
advisories), each None when the page did not say. Pure.Nz
latest motr$   é(   )zmot historyzview full historyzcap liver   z(pass|fail)(ed)?úExpiry DateÚExpiryz(\d+) advisor(y|ies)zlast motr;   r9   z(pass|fail)úno advisories)rC   ÚindexrŽ   rM   ru   r?   r@   rT   rŒ   r„   rB   rA   r  r  rJ   )r‡   r~   rY  r  rm  rb  r	   rŠ   Úblockr‹   rG   Úsaids               r)   Ú
carwow_motr‹  ·  sá  € ñ $Ó
$še˜�7‰7Ž9™e€CÐ
$Ø#Ð#€FÐ#ˆVØ€JØ�sÔØ�I‰I�lÓ#ˆØˆØ˜1‘u˜Q ™VÓ$ˆAØ�w‰w‹yÐLÓLÙØ�L‰L˜ŽOñ %ö Ü˜U 1™XÓ&ˆFÜˆu‹:˜‹>œbŸlšlÐ+>ÀÀaÁÌ"Ï$É$×OÑOØ˜1‘XˆFÜœ U¨M¸8ÓDÓEˆØˆ
Ü˜eÖ$‰DˆAÜ—’Ð4°a¼¿¹Ó>ˆAßˆqØ" q¡5¨¨Q©´°Q·W±W¸Q³Z³Ñ)@ÐA�
Ùñ	 %ð
 �~˜*¨Ó+Ø�I‰I�jÓ!ˆØ*+¨a©%´#°e³*Ó*<”˜ 1™u™Ô&À$ˆØ  1™u¤s¨5£zÓ1ˆu˜‘UŠ|°rˆÜ�HŠH�^ T¬2¯4©4Ó0ˆÞ–aØ—W‘W˜Q“Z×*Ñ*Ó,ˆFÜ�yŠyÐ)¨4´·±×6Ñ6Ø�
Ø˜6Ð-Ð-ùò= %s   …H-c                 óÜ  ^• [        U SSSS9mT(       d  g/ n[        [        TS5      5      nU(       a  UR                  SU SUS	:w  a  S
OS 35        [        [        TS5      5      nU(       a  UR                  SU SUS	:w  a  S
OS 35        U4S jnU" S5      (       a  UR                  S5        U" S5      (       a  UR                  S5        SR	                  U5      =(       d    [
        $ )aÂ  Carwow's "Wheels & Extras" panel, read live 2026-09-25: Tyre
condition ("No damage" or "2 reported"), Alloy Condition, Spare
wheel, Wheel toolkit and Locking wheel nut, each a label then a
value. Carwow gives no tread depths, so like Motorway this is
tyre_notes, not tyres_mm. A missing locking wheel nut or toolkit is
a note; "No information" is not. "No problems declared" when the
panel was there and clear, None when it was not on the page. Pure.zWheels & Extras)Ú
MotorCheckzMOT historyz
Latest MOTé   ©r�   r‘   NzTyre conditionzTyre problems: r8  r$   rF   r9   zAlloy ConditionzAlloy damage: r7  c                 ó~   >• [        [        TU 5      =(       d    S5      R                  5       R                  5       S:H  $ )Nr9   r]   )r-   rŒ   r>   rC   )rÍ   r‰  s    €r)   Ú<lambda>Úcarwow_wheels.<locals>.<lambda>ô  s.   ø€ œC¤¨E°5Ó 9× ?¸RÓ@×FÑFÓH×NÑNÓPÐTXÒXr0   zLocking wheel nutr;  zWheel toolkitzNo wheel toolkitrÍ  )r•   rw  rŒ   rŽ   rs   r  )r‡   rI  r$  ÚalloysÚsaid_nor‰  s        @r)   Úcarwow_wheelsr•  â  sÜ   ø€ ô �EÐ,Ð<gÐoqÑr€EÞØØ€EÜœ+ eÐ-=Ó>Ó?€EÞØ�‰� u g¨U¸%À1»*±3È"Ð2MÐNÔOÜœ; uÐ.?Ó@ÓA€FÞØ�‰�~ f X¨V¸6ÀQ»;±CÈBÐ3OÐPÔQÜX€GÙÐ"×#Ñ#Ø�‰Ð+Ô,Ùˆ×ÑØ�‰Ð'Ô(Ø�;‰;�uÓ×2Ô!2Ð2r0   c                 ó˜	  • [        5       n[        U 5      n[        U5      u  pEpgXBS'   U=(       d    [        [	        USSSSSS5      5      US'   U=(       d    [        [	        US	S
S5      5      US'   [        USSSS9nU V	s/ s H  o™R                  5       S;  d  M  U	PM     nn	Ub  UOKU=(       dC    [	        US5      (       a0  [	        US5      R                  5       R                  S5      (       a  / OSUS'   [        U5      US'   [        [	        US5      5      n
[        [	        USSSS5      5      n[	        USSS5      n/ nU
(       a  UR                  U
5        [        USSS S9 H&  n[        U5      (       d  M  UR                  U5        M(     Uc`  [        U Vs/ s H  n[        U5      (       d  M  UPM     sn5      S!:”  a.  [        U Vs/ s H  n[        U5      (       d  M  UPM     sn5      nU
(       d
  Uc  U(       a%  U[        U5      [        U5      U=(       d    SS".US#'   [        [	        US$S%5      5      n[        U5      =(       d    U(       a  USS&./OSUS''   [        [	        US(S)S*5      5      US+'   [        [	        US,S-S.5      5      nUb  S!Us=::  a  S/::  a  O  OUOSUS0'   [        U5      nU(       d=  [        US1S2S S9 H-  nUR                  5       S3;   a    OUR                  USS4.5        M/     U=(       d    SUS5'   / n[        US6S7S8S9 Hy  n[         R"                  " S9U5       H[  nUR                  S:UR%                  S;5      ;   a  ['        UR%                  S;5      5      O[)        UR%                  S;5      5      5        M]     M{     U=(       d    SUS<'   [        [	        US=S>S?5      5      nU[+        [	        US@SASB5      5      [+        [	        USCSD5      5      [+        [	        USESFSG5      5      SH.n[-        SI UR/                  5        5       5      (       a  UOSUSJ'   [1        S[	        USKSLSMSNSO5      5      USP'   [3        U5      nU=(       d    SUSQ'   [5        [	        USRSS5      5      =(       d    [5        [	        UST5      5      USU'   [5        [	        USVSWSX5      5      USY'   [7        U5      $ s  sn	f s  snf s  snf )ZzþThe deep block out of a Carwow car page's words. Carwow lays its
facts out as a label line then a value line, the same shape
carwow.enrich_from_detail already reads (Former keepers, Start of
current keeper, Mechanical faults, the MotorCheck block). Pure.r   re  rf  rg  rh  zMOT valid untilri  r   rp  rq  zLast MOT resultr   Ú
Advisories)úService historyr�  úMechanical faultsÚDamageÚPhotosé   r�  )r`   r‡  zno advisories reportedNr]   r	   r   r˜  r˜  r™  rš  zNumber of stampsrž  rŸ  r   zService records)r�  r™  rš  é   r   r›   r
   zStart of current keeperr©  rª  r   r»  r½  r¼  r   rÄ  rÅ  rÆ  rÇ  r   rš  )r�  r˜  r™  r›  ÚDescription)r`   z	no damagezno damage reportedrÛ   r   ÚTyres)r�  r˜  rš  rÖ  z(\d+(?:\.\d+)?)\s*mmrU  r$   r   rä  rå  zFinance checkrþ  z	Write offzInsurance write offrÿ  zStolen checkr   ÚImportzImport checkr    c              3   ó(   #   • U  H  oS Lv •  M
     g 7frg   r7   rÒ   s     r)   rl   Úfrom_carwow.<locals>.<genexpr>6  r  r¥  r   r  r  r  r  r  r   r   r  r	  z	CAP cleanr   r  r  zLeading bidr   )r*   r   r‹  rM   rŒ   r½   r•   rC   rb   r•  rR   rŽ   ru   rU   r‚  ru  r?   rÁ   rA   rº   rB   rc   rÝ   r®   r{   rg  rX   r£   )r  rf  r(   r‡   r  rm  rb  Úadvsr  r  r  r—   Úlastrš   r~   r$  r   r,  rÕ  rG   r3  r8  r   s                          r)   Úfrom_carwowr¥  ü  s²  € ô
 	‹€AÜ�YÓ€Eô $.¨eÓ#4Ñ €F�FØ€l�OØ÷  Q¤¬°E¸<ÈÐTaÐctð  wHð  JOó  )Pó  !Q€A€l�OØ×g¤¤[°¸ÀlÐTeÓ%fÓ g€A€l�OÜ
�%˜Ð5ð  HJñ  K€CÙÓ
b’c�ŸW™W›YÐ.aÑa�1‘c€CÐ
bØ"Ñ.‘d°S÷  6mÄ;ÈuÐVb×CcÑCcÔhsÐtyð  |Hó  iI÷  iOñ  iOó  iQ÷  i\ñ  i\ð  ]a÷  ibñ  ib¹Rð  hl€A€l�OÜ# EÓ*€A€l�Oä	Œk˜%Ð!2Ó3Ó	4€BÜ”K Ð'7Ð9MÈzÐ[mÓnÓo€FÜ�u˜n¨oÐ?RÓS€DØ€FÞ	Ø�‰�bÔÜ�UÐ-Ð=jÐrtÔuˆÜ�1�:‹:Ø�M‰M˜!Öñ vð �~œ#©&Ó?ª& Q´G¸A·JŸq©&Ñ?Ó@À1ÓDÜ¡Ó6¢˜A¬7°1¯:—a¡Ñ6Ó7ˆÞ	ˆVÑ¦4Ø"(´w¸t³}ÔV`ÐaeÓVfØ"(§.¨Dñ2ˆˆ)‰ô 
”˜UÐ$=Ð?UÓVÓ	W€BÜ! %Ó(×XÎ2°rÀÑ.FÑ-GÐSW€A€i�LÜ”{ 5¨(Ð4EÀwÓOÓP€A€h�KÜ”+˜e VÐ-=¸|ÓLÓM€DØÑ(¨Q°$­^¸!®^‘À€A€f�Iä
˜Ó
€CÞÜ˜ ð  9Hð  PRô  SˆAØ�w‰w‹yÐGÓGÙØ�J‰J °Ñ5Ö6ñ Sð —+˜€A€h�Kà	€BÜ�U˜GÐ3^ÐfhÔiˆÜ—’Ð4°aÖ8ˆAØ�I‰I¨3°!·'±'¸!³*Ó+<”e˜AŸG™G A›JÔ'Ä#ÀaÇgÁgÈaÃjÃ/ÖRó 9ñ jð —J˜$€A€j�Mä
Œ{˜5Ð"7¸ÀOÓTÓ
U€CØ¬´¸EÀ=ÐR]Ð_tÓ0uÓ)vÜœ; u¨h¸ÓGÓHÜœ[¨°
¸HÀnÓUÓVñ
X€Bô  #Ñ"F¸"¿)¹)¼+Ó"F×FÑF™ÈD€A€oÑÜ+¨D´+¸eÀ_ÐV`ÐbyØ>YÐ[wó3yó z€A€oÑô ˜4Ó €FØ—.˜D€A€h�KÜ¤¨E°?ÀIÓ NÓO×|ÔS[Ô\gÐhmÐozÓ\{ÓS|€A€mÑÜœK¨¨}¸mÈ]Ó[Ó\€A€i�LÜ�!‹9Ðùòg cùò @ùÚ6s$   ÂR=ÂR=ÆSÆ5SÇSÇ'Sc                 óˆ  • [        5       n[        U 5      n[        USSSS9n[        [	        US5      5      US'   [        [	        USS5      5      US	'   [	        US
5      nUb,  UR                  5       R                  S5      (       a  / OU/US'   [        [	        US5      5      n[        [	        US5      5      n[        [	        US5      5      nU(       d  Uc  Ub_  Uc  Ub  U=(       d    SU=(       d    S-   OS nXVb  U S3OS Ub  U S3OS 4 V	s/ s H  n	U	(       d  M  U	PM     n
n	US S U
=(       d    S S.US'   [        [	        USS5      5      US'   [        [	        US5      5      nUb  SUs=::  a  S::  a  O  OUOS US'   [	        US5      nU(       a-  UR                  5       R                  S5      (       d	  US S./US'   [        [	        US5      5      nU(       a  [        [	        US 5      5      S!:X  a  US S"./OS US#'   [        [	        US$S%5      5      US&'   [        [	        US'S(S)5      5      US*'   [        U5      $ s  sn	f )+Nri  )zService HistoryúBodywork Issuesé   r�  ÚStatusr   r…  r†  r   r—  r]   r	   zService RecordzMain Dealer ServiceszIndependent Dealer Servicesr   z main dealerz independentr›   r
   zExterior Colourr»  r   úNumber of KeysrÇ  r   r§  zno bodyworkrÛ   r   zFirst RegisteredzNumber of Ownersr$   rª  r   r  r	  r   zCurrent Bidr  zHighest Bidr   )r*   r   r•   r½   rŒ   rM   rC   rb   rR   rX   r£   )r  r(   r‡   rY  r  ÚrecrO  r#  r—   rk   rš   r   Úbodyr\  s                 r)   Úfrom_dealerwayr­  D  sH  € Ü‹€AÜ�YÓ€EÜ
�%˜Ð.TÐ\]Ñ
^€CÜœ; s¨HÓ5Ó6€A€l�OÜœk¨#¨}¸hÓGÓH€A€l�OÜ
�c˜<Ó
(€CØ
�Ø #§	¡	£× 6Ñ 6°t× <Ñ <™"À3À%ˆˆ,‰Ü
Œ{˜5Ð"2Ó3Ó
4€CÜ”+˜eÐ%;Ó<Ó=€DÜ”;˜uÐ&CÓDÓE€EÞ
ˆdÑ %Ñ"3Ø04Ñ0@ÀEÑDU�$—)˜! §
¨Ò+Ð\`ˆØ!Ñ<L d V¨<Ñ#8ÐRVØ8=Ñ8I   |Ñ4ÈtñUó [ò U˜ÜXY÷ ñ Uˆð [à"(°tÈTÐ]c×]kÐgkÑlˆˆ)‰Ü”{ 5Ð*;¸XÓFÓG€A€h�KÜ”+˜eÐ%5Ó6Ó7€DØÑ(¨Q°$­^¸!®^‘À€A€f�IÜ�uÐ/Ó0€DÞ�D—J‘J“L×+Ñ+¨M×:Ñ:Ø $°4Ñ8Ð9ˆˆ(‰Ü”K Ð'9Ó:Ó;€EÞ49¼fÄ[ÐQVÐXjÓEkÓ>lÐpqÓ>q˜U¨$Ñ/Ñ0Ðw{€A€i�LÜ¤¨E°?ÀIÓ NÓO€A€mÑÜœK¨¨}¸mÈ]Ó[Ó\€A€i�LÜ�!‹9Ðùò[s   ÄH?ÄH?z?https://www\.auction4cars\.com/AuctionImages/\d+/Image_\d+\.jpgz'priceCon\.data\('reserve',\s*([\d.]+)\)c           
      ó¢  • SSK n[        5       n[        U =(       d    S5      n 0 n[        R                  " SU 5       HŽ  nUR                  UR                  S5      5      R                  SS5      R                  5       R                  S5      R                  5       nUR                  UR                  S	5      5      R                  5       X5'   M�     [        UR                  S
5      =(       d    UR                  S5      5      US'   [        UR                  S5      =(       d    UR                  S5      5      =(       d2    [        UR                  S5      =(       d    UR                  S5      5      US'   [        UR                  S5      =(       d    UR                  S5      5      nUb  SUs=::  a  S::  a  O  OUOSUS'   [        R                  " SU 5      n/ SSp©nU Hˆ  u  p¼n[        U5      n[        U5      nUR!                  SR#                  S U=(       d    UU(       a  US S3OSUR                  5       =(       d    S4 5       5      5        U(       d  M|  U	b  Xé:”  d  M†  Xäp©MŠ     U(       a  [%        U5      XšUS.US'   0 n[&        R	                  U 5       H3  nUR)                  UR                  S5      UR                  S5      5        M5     [+        UR-                  5       5      =(       d    SUS'   [.        R1                  U 5      nU(       a'   [3        [5        UR                  S5      5      5      US'   [9        U5      $ ! [6         a     Nf = f)zÀWhat an Auction4Cars car page shows: its Vehicle Details block, the
service history table, the real reserve in its inline script (the
same reads auction4cars.py already makes) and every photo.r   Nr9   zb<div class="car-detail-title">([^<]*)</div>\s*<div class="car-detail-content">\s*([^<]*?)\s*</div>r$   ô   Â r(  r‚   r;   r»  r¼  r   z
MOT Expiryri  r   rÄ  rª  rÇ  r   zK<td>\s*([\d/]+)\s*</td>\s*<td>\s*([\d,]*)\s*</td>\s*<td>\s*([^<]*?)\s*</td>re   c              3   ó6   #   • U  H  o(       d  M  Uv •  M     g 7frg   r7   ri   s     r)   rl   Ú$from_auction4cars.<locals>.<genexpr>}  s   é € ÐsÒ+m aÓqr§¡Ò+mùs   ‚
�	rO   r‘  r›   r
   r   r   )rf  r*   r-   r?   rÁ   rj  rA   r5   r>   rƒ   r½   r¡   rH   rM   rR   ÚfindallrŽ   rs   ru   Ú_A4C_GALLERYrÂ   rr   r®   Ú_A4C_RESERVErJ   Úroundrº   rP   r£   )rf  ro  r(   ÚfieldsrG   rÍ   r   Úrowsrš   r˜   r™   r  r‹  r'  ÚisorÃ   s                   r)   Úfrom_auction4carsr¹  i  s½  € ó Ü‹€AÜˆt�z�r‹?€DØ€FÜ�[Š[Ð~ð  AEö  FˆØ× Ñ  §¡¨£Ó,×4Ñ4°V¸SÓA×GÑGÓI×PÑPÐQTÓU×[Ñ[Ó]ˆØ×(Ñ(¨¯©°«Ó4×:Ñ:Ó<ˆ‹ñ Fô �v—z‘z (Ó+×B¨v¯z©z¸'Ó/BÓC€A€h�KÜ˜vŸz™z¨,Ó7×L¸6¿:¹:ÀeÓ;LÓM÷  HÔQXÐY_×YcÑYcÐdpÓYq÷  ZGÐu{×uÑuð  AFó  vGó  RH€A€l�OÜ�&—*‘*˜VÓ$×D¨¯
©
Ð3CÓ(DÓE€DØÑ(¨Q°$­^¸!®^‘À€A€f�IÜ�:Š:ÐdÐfjÓk€DØ&(¨$°�|€FÛ!Ñˆ�TÜ�t‹nˆÜ�5‹MˆØ�‰�d—i‘iÑs¨C¯K°4Î1¸A¸a¸5À¹ÐRVÐX\×XbÑXbÓXd×XlÐhlÑ+mÓsÓsÔtßˆ3�IÑ%¨­Ø&)’|ñ "ö Ü"% d£)¸)ÐmsÑtˆˆ)‰Ø€DÜ×"Ñ" 4Ö(ˆØ�‰˜Ÿ™ ›
 A§G¡G¨A£JÖ/ñ )ä�t—{‘{“}Ó%×-¨€A€h�KÜ×Ñ˜DÓ!€AÞð	Ü$¤U¨1¯7©7°1«:Ó%6Ó7ˆAˆmÑô �!‹9Ðøô ó 	Ùð	ús   Ì&M Í
MÍM)NNN)NN)r7   r„  )r7   )r9   r9   )éP   )r9   )FÚ__doc__r3   rÇ   r?   r&   ÚcompilerW   r„   rD   r*   r/   r,   rH   rM   rR   rU   rX   rc   r{   r   rŒ   r•   r£   r©   r¯   r´   r»   r½   rÆ   rÀ   rÄ   rÉ   rá   rï   rJ  r  r  r0  r  r=  rB  rK  rU  rW  r;  rK  r`  rb  rc  rd  rg  ÚSrk  ri  rl  rm  rn  ru  rw  rT   r~  r€  r‚  r‹  r•  r¥  r­  r³  r´  r¹  )rŠ   rG   s   00r)   Ú<module>r¾     si  ðñó, Û Û 	ð

b€ð 	�
Š
Ð%Ó&€Ù%ÚXÐZ[ô]ô ^ò ]‘D�Aˆ1Š4ñ ]ò ^€ôôZòFòò,
òò	òò
òò:Ið ()õ ôòô"	òò òòð 
‡z‚zÐQÓR€Ø�jŠjÐhÓi€òò%ò
ò2ð€ò4ôò8%ðP +Ð ð€
òðP ØØØ Ø)ñÐ ôò@!ôsòlô !ð8 �jŠjÐOÓP€Ø
=€ò1òð: �zŠzð9à:<¿$¹$ó@€ð —
’
ÐbÓc€Ø—
’
ÐBÀBÇDÁDÓI€Ø�zŠzÐfÐhj×hlÑhlÓm€Ø—
’
ÐkÐmo×mqÑmqÓr€ò$òN*ð �JŠJÐ@À"Ç$Á$ÓG€	Ø�:Š:Ð9Ó:€ò'ò6(.òV3ô4BòPðB �zŠzÐ\Ó]€Ø�zŠzÐDÓE€ó#ùóM"^s   ±G7