Ë
    ÍþÍjO<  ã                   óê  — U d Z ddlZddlZddlZddlmZ ddlmZmZ ddl	m
Z
 ddlmZmZ ddlmZ ddlmZ  ej$                  d	«      Z G d
„ de«      Zi dddddœ“ddddœ“ddddœ“ddddœ“ddddddœ“dddddœ“dddddœ“ddd dœ“d!dd"dœ“d#dd"dœ“d$dd dœ“d%d& ee
j.                  «      d'd(dœ“d)ddddœ“d*ddd+dœ“d,ddddœ“d-d.ddœ“d/d0ddœ“d1d2dœdd"dœd&d3d'd4dœdd"dœdd dœd&d5dd6dœd7œ¥Zeeeeef   f   ed8<   e
j6                  j9                  «       D ]E  \  ZZdd9 ee«      v r& ee«      j?                  d«      j?                  d9«      n ee«      dd:dœee<   ŒG  e e
j6                  jC                  «       «      Z" ejF                  d;«      Z$d<ed=e%fd>„Z&d?ed@ed=efdA„Z'dgdB„Z(dCed=efdD„Z)dEed=efdF„Z*	 	 dhdCedGee   dHee   dIee   d=ef
dJ„Z+d=efdK„Z,dLed=ee   fdM„Z-dLed=ee   fdN„Z.didOe/d=e e   fdP„Z0ddddQœdLedCee   dRee/   dHee   d=ef
dS„Z1djdLed=eeef   fdT„Z2dLedUed=eeef   fdV„Z3dWed=eee%f   fdX„Z4dYdZd[d\d]d^d_d`œZ5h da£Z6h db£Z7dced=ee   fdd„Z8dced=e9fde„Z:dLed=efdf„Z;y)kuô  
school_service.py â€” multi-colegio (multitenant).

Un Â« colegio Â» (school) agrupa familias, alumnos, pedidos, precios y
configuraciÃ³n. Todo lo que antes estaba fijo en el cÃ³digo (nombre, fechas,
precios, retenciÃ³n RGPD, reparto, fotÃ³grafoâ€¦) vive ahora en `school_settings`
y se edita desde el panel de admin.

- `schools.id` es el slug (inmutable, ej. "sainte-marie"): se envÃ­a en la
  cabecera X-School y se guarda en families.school_id / orders.school_id.
- El cÃ³digo de familia sigue siendo Ãºnico globalmente (PK de families), asÃ­ que
  el QR de la tarjeta identifica de forma inequÃ­voca familia â†’ colegio.
- ContraseÃ±a de director: una por colegio (hash scrypt). El operador Meeconic
  (ADMIN_PASSWORD) administra todos los colegios.
é    N)Údate)ÚAnyÚOptional)Úconfig)Úget_dbÚTABLE_OPTIONS)Úhash_password)Ú
utcnow_isozmeeconic.schoolsc                   ó   — e Zd Zy)ÚSettingsErrorN)Ú__name__Ú
__module__Ú__qualname__© ó    ú2/var/www/photos/backend/services/school_service.pyr   r      s   „ Ør   r   Úschool_nameÚstrÚ éx   )ÚtypeÚdefaultÚmaxÚ
shoot_dater   )r   r   Úclosure_dateÚdelivery_weekÚrevenue_share_pctÚfloatÚ0éd   )r   r   Úminr   Úpartner_nameÚ
portal_urléÈ   Úonline_paymentÚboolÚtrueÚonsite_paymentÚfalseÚpostal_deliveryÚschool_deliveryÚ	rgpd_daysÚinté   im  Úphotographer_nameÚphotographer_idé(   Úftp_urlÚnotification_emailÚemailÚqr_code_prefixÚprefixÚcolorz#0A1F44Ú3é
   Ú5é2   )Úbrand_colorÚ
shoot_modeÚshoot_max_per_childÚshoot_test_cameraÚ
ai_enabledÚai_max_per_familyÚSETTINGS_SPECú.iè  z^[^@\s]+@[^@\s]+\.[^@\s]+$Ú	hex_colorÚreturnc                 óÜ   ‡— | j                  d«      Šˆfd„dD «       D �cg c]   }|dz  dk  r|dz  dz  n|dz  dz   dz  d	z  ‘Œ" }}d
|d   z  d|d   z  z   d|d   z  z   }d|dz   z  S c c}w )z0WCAG contrast ratio between `#RRGGBB` and white.ú#c              3   óB   •K  — | ]  }t        ‰||d z    d«      –— Œ y­w)é   é   N)r-   )Ú.0ÚiÚhs     €r   ú	<genexpr>z&contrast_with_white.<locals>.<genexpr>O   s"   øè ø€ Ò<¨Q”S˜˜1˜Q ™U˜ R×(Ñ<ùs   ƒ)r   rI   é   éÿ   g#Æ‚¤?g×£p=
×)@g)\�Âõ(¬?gáz®Gáð?g333333@g¼–�z6Ë?r   g¥,Cëâæ?r.   g]mÅþ²{²?rI   gÍÌÌÌÌÌð?gš™™™™™©?)Úlstrip)rD   ÚcÚlinÚlumrM   s       @r   Úcontrast_with_whiterU   K   sœ   ø€ à×Ñ˜Ó€Aã<°)Ô<ö>Øð !" C¡¨7Ò 2ˆA�‰G�eŠO¸1¸s¹7ÀeÑ:KÈuÑ9TÐY\Ñ8\Ñ\ð >€Cð >à
�3�q‘6‰/˜F S¨¡V™OÑ
+¨f°s¸1±v©oÑ
=€CØ�3˜‘:ÑÐùò>s    %A)ÚkeyÚrawc                 óì  — t         |    }|d   }|€dnt        |«      j                  «       }|dk(  rJt        |t        «      r|rdS dS |j                  «       dv ry|j                  «       dv ryt        | › d�«      ‚|d	k(  r*|dk(  ry	 t        j                  |«      j                  «       S |dv r“	 |dk(  rt        |«      nt        |j                  dd«      «      }||d   k  s||d   kD  rt        | › d|d   › d|d   › d�«      ‚|dk(  rt        |«      S |t        |«      k(  rt        t        |«      «      S t        |«      S |dk(  r8|j                  «       }|r$t        j                   d|«      st        | › d�«      ‚|S |dk(  rPt        j                   d|«      st        | › d�«      ‚t#        |«      dk  rt        | › d�«      ‚|j                  «       S |dk(  r'|r#t$        j!                  |«      st        | › d�«      ‚|S t'        |«      |j)                  dd«      kD  r!t        | › d|j)                  dd«      › d �«      ‚|S # t        $ r t        | › d
�«      ‚w xY w# t        $ r t        | › d�«      ‚w xY w)!Nr   r   r&   r'   r)   )r'   Ú1ÚyesÚon)r)   r   ÚnoÚoffr   z: invalid boolean value.r   z#: invalid date (format YYYY-MM-DD).)r-   r   r-   ú,rC   z: invalid number.r!   r   z: must be between z and r6   z^[A-Z]{2,6}$z: 2 to 6 letters (A-Z).r7   z^#[0-9a-fA-F]{6}$z: use a #RRGGBB colour.g      @u<   : colour too light â€” white text on it would be unreadable.r4   z: invalid e-mail address.r$   z: too long (max z).)rB   r   ÚstripÚ
isinstancer&   Úlowerr   r   ÚfromisoformatÚ	isoformatÚ
ValueErrorr-   r   ÚreplaceÚupperÚreÚmatchrU   Ú	_EMAIL_REÚlenÚget)rV   rW   ÚspecÚtÚsÚnums         r   Ú
_normalizerp   T   s�  € Ü˜Ñ€DØˆV‰€AØˆk‰œs 3›xŸ~™~Ó/€AØˆF‚{Ü�cœ4Ô Ù �6Ð- gÐ-Ø�7‰7‹9Ð2Ñ2ØØ�7‰7‹9Ð7Ñ7ØÜ˜s˜eÐ#;Ð<Ó=Ð=ØˆF‚{Ø�Š7Øð	MÜ×%Ñ% aÓ(×2Ñ2Ó4Ð4ð 	ÐÑð	;Ø šJ”#�a”&¬E°!·)±)¸CÀÓ2EÓ,FˆCð ��e‘Ò  d¨5¡kÒ 1Ü 3 %Ð'9¸$¸u¹+¸ÀeÈDÐQVÉKÈ=ÐXYÐ ZÓ[Ð[Ø š:Œs�3‹xÐ[¸SÄCÈÃHº_¬C´°C³«MÐ[ÔRUÐVYÓRZÐ[ØˆH‚}Ø�G‰G‹IˆÙ”R—X‘X˜o¨qÔ1Ü 3 %Ð'>Ð ?Ó@Ð@ØˆØˆG‚|Ü�x‰xÐ,¨aÔ0Ü 3 %Ð'>Ð ?Ó@Ð@Ü˜qÓ! CÒ'Ü 3 %Ð'cÐ dÓeÐeØ�w‰w‹yÐØˆG‚|Ù”Y—_‘_ QÔ'Ü 3 %Ð'@Ð AÓBÐBØˆä
ˆ1ƒv�—‘˜ Ó$Ò$Ü˜s˜eÐ#3°D·H±H¸UÀCÓ4HÐ3IÈÐLÓMÐMØ€Høô9 ò 	MÜ 3 %Ð'JÐ KÓLÐLð	Mûô
 ò 	;Ü 3 %Ð'8Ð 9Ó:Ð:ð	;ús   Â"I  Â/+I É IÉI3c                  óÂ   — t        «       5 } | j                  dt        › �«       | j                  dt        › �«       | j                  «        d d d «       y # 1 sw Y   y xY w)Naa  
        CREATE TABLE IF NOT EXISTS schools (
            id                     VARCHAR(64)  NOT NULL PRIMARY KEY,
            name                   VARCHAR(200) NOT NULL,
            director_password_hash VARCHAR(255),
            active                 TINYINT NOT NULL DEFAULT 1,
            created_at             VARCHAR(40)  NOT NULL
        ) zç
        CREATE TABLE IF NOT EXISTS school_settings (
            school_id VARCHAR(64)  NOT NULL,
            `key`     VARCHAR(64)  NOT NULL,
            value     MEDIUMTEXT,
            PRIMARY KEY (school_id, `key`)
        ) )r   Úexecuter   Úcommit)Úconns    r   Úinit_school_tablesru   †   se   € Ü	‹ð �TØ�‰ð ô ˆ/ðô 	ð 	�‰ð ô ˆ/ðô 	ð 	�‰Œ÷!÷ ñ ús   ‹AAÁAÚnamec                 óÔ   — dj                  d„ t        j                  d| «      D «       «      }t        j                  dd|«      j                  d«      j                  «       }|xs dd d S )Nr   c              3   óR   K  — | ]  }t        j                  |«      d k7  sŒ|–— Œ! y­w)ÚMnN)ÚunicodedataÚcategory)rK   rR   s     r   rN   zslugify.<locals>.<genexpr>�   s$   è ø€ Òd˜ÄK×DXÑDXÐYZÓD[Ð_cÓDc”1Ñdùs   ‚' 'ÚNFDz[^a-zA-Z0-9]+ú-Úecoler1   )Újoinrz   Ú	normalizerg   Úsubr_   ra   )rv   Úbases     r   Úslugifyrƒ   œ   s[   € Ø�7‰7Ñdœk×3Ñ3°E¸4Ó@ÔdÓd€DÜ�6‰6Ð" C¨Ó.×4Ñ4°SÓ9×?Ñ?ÓA€DØŠO�G˜S˜bÐ!Ð!r   Úwantedc                 ó¬   — |d}}| j                  d|f«      j                  «       r.|› d|› �}|dz  }| j                  d|f«      j                  «       rŒ.|S )NrI   ú SELECT 1 FROM schools WHERE id=?r}   r.   )rr   Úfetchone)rt   r„   ÚslugrL   s       r   Ú_unique_slugr‰   ¢   s`   € Ø�aˆ!€DØ
�,‰,Ð9¸D¸7Ó
C×
LÑ
LÔ
NØ�˜˜1˜#ˆˆØ	ˆQ‰ˆð �,‰,Ð9¸D¸7Ó
C×
LÑ
LÕ
Nð €Kr   rˆ   Údirector_passwordÚinitial_settingsc           	      ód  — | xs dj                  «       } | st        d«      ‚|�|dk7  rt        |«      dk  rt        d«      ‚t        «       5 }|r7t	        |«      }|j                  d|f«      j                  «       r t        d«      ‚t        |t	        | «      «      }|j                  d|| |rt        |«      nd t        «       f«       t        j                  «       D ��ci c]  \  }}||d   “Œ }}}| |d	<   |xs i j                  «       D ]  \  }}|t        v sŒ	 t        ||«      ||<   Œ  |j                  «       D ]  \  }}|j                  d
|||f«       Œ |j                  «        d d d «       t        j                  d| |«       t!        |«      S c c}}w # t        $ r Y Œ™w xY w# 1 sw Y   Œ@xY w)Nr   úThe school name is required.é   ú8The head teacher password must be at least 8 characters.r†   z This school code already exists.z]INSERT INTO schools (id, name, director_password_hash, active, created_at) VALUES (?,?,?,1,?)r   r   zBINSERT INTO school_settings (school_id, key, value) VALUES (?,?,?)zSchool created: %s (%s))r_   r   rj   r   rƒ   rr   r‡   r‰   r	   r
   rB   Úitemsrp   rs   ÚlogÚinfoÚ
get_school)	rv   rˆ   rŠ   r‹   rt   Úkrl   ÚvaluesÚvs	            r   Úcreate_schoolr—   ª   s¿  € àŠJ�B×ÑÓ€DÙÜÐ:Ó;Ð;ØÐ$Ð):¸bÒ)@ÄSÐIZÓE[Ð^_ÒE_ÜÐVÓWÐWÜ	‹ð �TÙÜ˜4“=ˆDØ�|‰|Ð>ÀÀÓH×QÑQÔSÜ#Ð$FÓGÐGä ¤g¨d£mÓ4ˆDØ�‰ØkØ�4Ñ=NœÐ'8Ô9ÐTXÔZdÓZfÐgô	
ô 5B×4GÑ4GÓ4I×J©¨¨D�!�T˜)‘_Ñ$ÐJˆÑJØ $ˆˆ}ÑØ%Ò+¨×2Ñ2Ó4ò 	‰DˆAˆqØ”MÒ!ðÜ *¨1¨aÓ 0�F˜1’Ið	ð —L‘L“Nò 	m‰DˆAˆqØ�L‰LÐ]Ð`dÐfgÐijÐ_kÕlð	mà�‰Œ÷+ô, ‡H�HÐ&¨¨dÔ3Ü�dÓÐùó Køô %ò Ùðú÷#ð úsC   ÁBF&ÃFÃ-*F&ÄFÄ(?F&ÆF&Æ	F#Æ F&Æ"F#Æ#F&Æ&F/c                 óT   — | d   | d   t        | d   «      t        | d   «      | d   dœS )NÚidrv   ÚactiveÚdirector_password_hashÚ
created_at)r™   rv   rš   Úhas_director_passwordrœ   )r&   )Úrs    r   Ú_rowrŸ   Ë   s;   € à�‰g˜q ™y´D¸¸8¹Ó4EÜ!% aÐ(@Ñ&AÓ!BÐRSÐT`ÑRañð r   Ú	school_idc                 ó    — t        «       5 }|j                  d| f«      j                  «       }d d d «       rt        |«      S d S # 1 sw Y   ŒxY w©Nz SELECT * FROM schools WHERE id=?)r   rr   r‡   rŸ   ©r    rt   rž   s      r   r“   r“   Ò   óO   € Ü	‹ð V�TØ�L‰LÐ;¸i¸\ÓJ×SÑSÓUˆ÷VáŒ4�‹7Ð!˜TÐ!÷Vð Vúó   ‹"AÁAc                 ó    — t        «       5 }|j                  d| f«      j                  «       }d d d «       rt        |«      S d S # 1 sw Y   ŒxY wr¢   )r   rr   r‡   Údictr£   s      r   Úget_school_with_hashr¨   Ø   r¤   r¥   Úinclude_inactivec                 óÐ   — t        «       5 }d| rdndz   dz   }|j                  |«      j                  «       D �cg c]  }t        |«      ‘Œ c}cd d d «       S c c}w # 1 sw Y   y xY w)NzSELECT * FROM schoolsr   z WHERE active=1z ORDER BY name COLLATE NOCASE)r   rr   ÚfetchallrŸ   )r©   rt   Úqrž   s       r   Úlist_schoolsr­   Þ   s_   € Ü	‹ð =�TØ#Ñ-=¡rÐCTÑUÐXwÑwˆØ!%§¡¨a£×!9Ñ!9Ó!;Ö<˜A”�Q•Ò<÷=ñ =ùâ<÷=ð =ús   ‹.A¹AÁAÁAÁA%)rv   rš   rŠ   rš   c                ó  — t        | «      st        d«      ‚t        «       5 }|�F|j                  «       }|st        d«      ‚|j	                  d|| f«       |j	                  d| d|f«       |�|j	                  d|rdnd| f«       |�O|d	k(  r|j	                  d
| f«       n6t        |«      dk  rt        d«      ‚|j	                  dt        |«      | f«       |j                  «        d d d «       t        | «      S # 1 sw Y   t        | «      S xY w)NúSchool not found.r�   ú$UPDATE schools SET name=? WHERE id=?úMINSERT OR REPLACE INTO school_settings (school_id, key, value) VALUES (?,?,?)r   z&UPDATE schools SET active=? WHERE id=?r.   r   r   z9UPDATE schools SET director_password_hash=NULL WHERE id=?rŽ   r�   z6UPDATE schools SET director_password_hash=? WHERE id=?)r“   r   r   r_   rr   rj   r	   rs   )r    rv   rš   rŠ   rt   s        r   Úupdate_schoolr²   ä   s  € ä�iÔ ÜÐ/Ó0Ð0Ü	‹ð �TØÐØ—:‘:“<ˆDÙÜ#Ð$BÓCÐCØ�L‰LÐ?À$È	ÐARÔSØ�L‰LÐhØ# ]°DÐ9ô;àÐØ�L‰LÐAÉÁAÐUVÐXaÐCbÔcØÐ(Ø  BÒ&Ø—‘ÐXÐ[dÐZfÕgäÐ(Ó)¨AÒ-Ü'Ð(bÓcÐcØ—‘ÐUÜ+Ð,=Ó>À	ÐJôLà�‰Œ÷%ô& �iÓ Ð ÷'ô& �iÓ Ð ús   ¡CC8Ã8Dc                 óà   ‡ ‡— t         j                  «       D ��ci c]  \  }}||d   “Œ c}}Šˆˆ fd„}|�
 ||«       ‰S t        «       5 } ||«       ddd«       ‰S c c}}w # 1 sw Y   ‰S xY w)z;Ajustes del colegio fusionados con los valores por defecto.r   c                 óp   •— | j                  d‰f«      D ]  }|d   t        v sŒ|d   €Œ|d   ‰|d   <   Œ! y )Nz8SELECT key, value FROM school_settings WHERE school_id=?rV   Úvalue)rr   rB   )rR   rž   Úoutr    s     €€r   Ú_loadzget_settings.<locals>._load  sH   ø€ Ø—‘ÐUÐXaÐWcÓdò 	+ˆAØ�‰xœ=Ò(¨Q¨w©ZÑ-CØ ! '¡
��A�e‘H’ñ	+r   N)rB   r�   r   )r    rt   r”   rl   r·   rR   r¶   s   `     @r   Úget_settingsr¸      st   ù€ ä-:×-@Ñ-@Ó-B×
C¡' ! Tˆ1ˆd�9‰oÑÓ
C€Cõ+ð ÐÙˆdŒð €Jô ‹Xð 	˜Ù�!ŒH÷	à€Jùó D÷	à€Jús   šAÁ
	A#Á#A-r•   c                 óì  — t        | «      st        d«      ‚i }|j                  «       D ]*  \  }}|t        vrt        d|› �«      ‚t	        ||«      ||<   Œ, d|v r|d   st        d«      ‚t        «       5 }|j                  «       D ]  \  }}|j                  d| ||f«       Œ d|v r|j                  d|d   | f«       |j                  «        ddd«       t        | «      S # 1 sw Y   t        | «      S xY w)uI   Valida y guarda. Claves desconocidas â†’ error (nada se guarda a medias).r¯   zUnknown setting: r   r�   r±   r°   N)	r“   r   r�   rB   rp   r   rr   rs   r¸   )r    r•   Úcleanr”   r–   rt   s         r   Úupdate_settingsr»     s  € ä�iÔ ÜÐ/Ó0Ð0Ø€EØ—‘“ò $‰ˆˆ1Ø”MÑ!ÜÐ"3°A°3Ð 7Ó8Ð8Ü˜a Ó#ˆˆaŠð$ð ˜Ñ e¨MÒ&:ÜÐ:Ó;Ð;Ü	‹ð �TØ—K‘K“Mò 	,‰DˆAˆqØ�L‰LÐhØ# Q¨Ð*õ,ð	,ð ˜EÑ!Ø�L‰LÐ?À%ÈÑBVÐXaÐAbÔcØ�‰Œ÷ô ˜	Ó"Ð"÷ô ˜	Ó"Ð"ús   Á4AC Ã C3Úsettingsc                 óf   — t         D �ci c]  }|t        d«      d t        | |   «      “Œ c}S c c}w )uK   Mismas claves que el antiguo PRICING (print_10x15, digital, magic_packâ€¦).Úprice_N)Ú
PRICE_KEYSrj   r   )r¼   r”   s     r   Úpricing_from_settingsrÀ   %  s/   € ä;EÖF°aˆAŒc�(‹mˆnÐœu X¨a¡[Ó1Ñ1ÒFÐFùÒFs   ‰".Úprice_print_10x15Úprice_print_20x30Úprice_digitalÚ
price_packÚprice_magic_printÚprice_magic_digitalÚprice_magic_pack)zprint-10x15zprint-20x30ÚdigitalÚpackúmagic-printúmagic-digitalú
magic-pack>   rÉ   rÈ   rÌ   rË   >   rÌ   rÊ   rË   Úcodec                 ó”   — t        «       5 }|j                  d| f«      j                  «       }d d d «       r|d   S d S # 1 sw Y   ŒxY w)Nz+SELECT school_id FROM families WHERE code=?r    )r   rr   r‡   )rÍ   rt   rž   s      r   Úschool_id_for_familyrÏ   9  sO   € Ü	‹ð \�TØ�L‰LÐFÈÈÓP×YÑYÓ[ˆ÷\áˆ1ˆ[‰>Ð( DÐ(÷\ð \ús	   ‹">¾Ac                 ó¨   — t        | «      }|r	 t        t        |«      d   «      S t        j
                  S # t        $ r Y t        j
                  S w xY w)Nr,   )rÏ   r-   r¸   Ú	Exceptionr   ÚPHOTO_RETENTION_DAYS)rÍ   Úsids     r   Úretention_days_for_familyrÔ   ?  sW   € Ü
˜tÓ
$€CÙ
ð	Ü”| CÓ(¨Ñ5Ó6Ð6ô ×&Ñ&Ð&øô ò 	ØÜ×&Ñ&Ð&ð	ús   �6 ¶	AÁAc                 ó€   — ddl m} t        | «      }t        | «      j	                  dd«      }|xs  ||r|d   nd«      S )uW   Prefijo de los cÃ³digos de familia: el configurado, o las 3 primeras letras del nombre.r   )Úprefix_from_namer5   r   rv   )Úutils.code_generatorrÖ   r“   r¸   rk   )r    rÖ   ÚschoolÚ
configureds       r   Úcode_prefix_forrÚ   I  s@   € å5Ü˜	Ó"€FÜ˜iÓ(×,Ñ,Ð-=¸rÓB€JØÒKÑ)¹F¨&°ª.ÈÓKÐKr   )rE   N)NNN)T)N)<Ú__doc__Úloggingrg   rz   Údatetimer   Útypingr   r   Úcorer   Úcore.dbr   r   Úcore.securityr	   Úcore.timeutilr
   Ú	getLoggerr‘   rd   r   r   rÒ   rB   r§   Ú__annotations__ÚDEFAULT_PRICESr�   Ú_kÚ_vÚrstripÚlistÚkeysr¿   Úcompileri   r   rU   rp   ru   rƒ   r‰   r—   rŸ   r“   r¨   r&   r­   r²   r¸   r»   rÀ   ÚFORMAT_PRICE_KEYÚDIGITAL_FORMATSÚMAGIC_FORMATSrÏ   r-   rÔ   rÚ   r   r   r   ú<module>rï      su  ðòó Û 	Û Ý ß  å ß )Ý 'Ý $à€g×ÑÐ*Ó+€ô	�Jô 	ð,Ø %°bÀ#ÑFð,à &°bÑ9ð,ð  &°bÑ9ð,ð  &°bÑ9ð	,ð
  '°cÀ!ÈCÑPð,ð  %°bÀ#ÑFð,ð  %°bÀ#ÑFð,ð  &°fÑ=ð,ð  &°gÑ>ð,ð  &°gÑ>ð,ð  &°fÑ=ð,ð  %±c¸&×:UÑ:UÓ6VÐ_`ÐilÑmð,ð  %°bÀ#ÑFð,ð  %°bÀ"ÑEð,ð  %°bÀ#ÑFð,ð   7°rÑ:ð!,ð$  (°rÑ:ð%,ð( #*°iÑ@ð %+°wÑ?Ø$)°sÀAÈbÑQð %+°wÑ?Ø"(°fÑ=Ø"'°cÀ!ÈBÑOò;,€ˆt�C˜˜c 3˜h™Ð'Ñ(ó ð> ×#Ñ#×)Ñ)Ó+ò 0�F€BˆØ!(ÐX[Ñ_bÐceÓ_fÑXf±S¸³W·^±^ÀCÓ5H×5OÑ5OÐPSÔ5TÑloÐprÓlsØ !¨$ñ0€M�"Òð0ñ �&×'Ñ'×,Ñ,Ó.Ó/€
ØˆB�J‰JÐ4Ó5€	ð 3ð ¨5ó ð-�Cð -˜cð - có -ódð,"�#ð "˜#ó "ð˜sð  só ð ]aØ59ñ˜ð  8¨C¡=ð ÈHÐUXÉMð Ø$,¨T¡NðØ>BóðBˆtó ð"˜#ð " (¨4¡.ó "ð" Cð "¨H°T©Nó "ñ= 4ð =°4¸±:ó =ð <@ÐZ^Ø59ò!˜Sð !¨8°C©=ð !ÈÐRVÉð !Ø%-¨c¡]ð!Ø>Bó!ñ8˜Cð ¨t°C¸°H©~ó ð #˜sð #¨Dð #°T¸#¸s¸(±^ó #ð*G Dð G¨T°#°u°*Ñ-=ó Gð )Ø(Ø$Ø!Ø(Ø*Ø'ñÐ ò E€Ú>€ð)˜sð ) x°¡}ó )ð' Cð '¨Có 'ðL˜sð L sô Lr   