
    V=:ip              $          d dl m Z  d dlmZmZmZmZ d dlmZ d dlm	Z	m
Z
mZmZmZmZmZmZmZ d dlmZmZ d dlmZmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dl m!Z! d dl"m#Z#m$Z$m%Z%  e	ddg          Z& ed          Z' G d de          Z( G d de          Z) G d de          Z* G d de          Z+d dlmZ d dlmZ de,de-de-fdZ.de,d efd!Z/d"ed efd#Z0dpd%ee,ef         d&eeee,ef                           d ee,ef         fd'Z1 e
e'          fd(ed ee,ef         fd)Z2d%ee,ef         d ee,ef         fd*Z3d+ee,ef         d d$fd,Z4d+ee,ef         d d$fd-Z5e&6                    d.ej7        /           ed0           ed0           ed0           ed0           ed0           ed0           ed1           ed$           ed$           ed$           ed$           ed           ed           ed           ed0           e
e2          fd2e,d3e,d4e,d5e,d6e,d7e,d8e,d9ee,         d:ee,         d;ee,         d<ee,         d=e8d>e8d?e8d@ee         fdA            Z9	 	 	 	 dqdee,         dCee,         de-de-d eee,ef                  f
dDZ:e&;                    dEej<        /           ed$F           ed$F           edBdGdHI           ed d J          fdee,         dCee,         de-de-fdK            Z=e&;                    dLej<        /           ed0dMN          fdOe,fdP            Z>e&;                    dQej<        /          d7e,fdR            Z?e&@                    dLej<        /           ed$           ed$           ed$           ed$           ed$           ed$           ed$           ed$           ed$           ed$           ed$           ed$           ed$           ed$           ed$           e
e2          fdOe,d2ee,         d3ee,         d4ee,         d5ee,         d6ee,         d7ee,         d8ee,         d9ee,         d:ee,         d;ee,         d<ee,         d=ee8         d>ee8         d?ee8         d@eee                  f dS            ZAe&B                    dLej<        /           e
e2          fdOe,fdT            ZCe&;                    dUej<        /           ed d J           edBdGdHI          fdVe,de-de-fdW            ZDe&;                    dXej<        /           ed d J           edBdGdHI          fdVe,dCe,de-de-fdY            ZEe&6                    dZej7        /           ed0           ed0           ed[           e
e2          fdVe,d\ed]e8fd^            ZFe&;                    dZej<        /          d_             ZGe&@                    d`ej<        /           ed$           ed$           ed$           e
e2          fdae,dVee,         d\ee         d]ee8         fdb            ZHe&B                    d`ej<        /           e
e2          fdae,fdc            ZIe&;                    ddej<        /          d7e,fde            ZJe&;                    dfej<        /          dg             ZKe&;                    dhej<        /          di             ZLe&;                    djej<        /          dVe,dke,d7e,fdl            ZMe&;                    dmej<        /          d7e,dne,fdo            ZNd$S )r    )datetime)AnyDictListOptional)ObjectId)		APIRouterDependsFileFormHTTPExceptionPathQuery
UploadFilestatus)HTTPAuthorizationCredentials
HTTPBearer)	BaseModelField)get_col)Category)Product)ProductVariant)
verify_jwt)delete_image_from_cloudinaryextract_public_id_from_urlupload_image_to_cloudinaryz	/productsproducts)prefixtagsF)
auto_errorc                   >    e Zd ZU  ee          Zee         ed<   dS )ProductCreate)default_factoryvariantsN)	__name__
__module____qualname__r   listr%   r   r   __annotations__     3D:\Nbitz\nbitez_python\app\routers\productRouter.pyr#   r#      s4         %*U4%@%@%@Hd>"@@@@@r,   r#   c                      e Zd ZU dZee         ed<   dZee         ed<   dZee         ed<   dZ	ee         ed<   dZ
ee         ed<   dZee         ed<   dZee         ed<   dZee         ed	<   dZee         ed
<   dZeee                  ed<   dZee         ed<   dZee         ed<   dZee         ed<   dZee         ed<   dZeee                  ed<   dS )ProductUpdateNp_namep_short_descriptionp_detailed_description
p_categoryp_sub_categoryp_Product_Typep_urlp_meta_Titlep_meta_Descriptionp_meta_Keywordsp_schema_Markupp_free_deliveryp_is_50_voucherp_is_100_voucherp_images)r&   r'   r(   r0   r   strr*   r1   r2   r3   r4   r5   r6   r7   r8   r9   r   r:   r;   boolr<   r=   r>   r+   r,   r-   r/   r/      sL         FHSM   )-#---,0HSM000 $J$$$$(NHSM((($(NHSM(((E8C="&L(3-&&&(,,,,+/OXd3i(///%)OXc])))&*OXd^***&*OXd^***'+htn+++$(HhtCy!(((((r,   r/   c                       e Zd ZdS )CategoryCreateN)r&   r'   r(   r+   r,   r-   rB   rB   /   s        Dr,   rB   c                   ^    e Zd ZU dZee         ed<   dZee         ed<   dZee	         ed<   dS )CategoryUpdateNcategory_namecategory_imager   )
r&   r'   r(   rE   r   r?   r*   rF   r   r@   r+   r,   r-   rD   rD   3   sN         #'M8C='''$(NHSM(((!FHTN!!!!!r,   rD   )r   categoryskiplimitc           	      0   t          d          }t          d          }|                    d| i                              |                              |          }t	          |          }|sg S g }|D ]}|d         }	t	          |                    dt          |	          i                    }
t          |d                   |d<   |
D ]2}t          |d                   |d<   t          |d                   |d<   3|
|d<   |                    |           |S )Nr   product_variantsr3   _idproductr%   )r   findrH   rI   r)   r   r?   append)rG   rH   rI   products_colvariants_colcursorr   resultsrM   
product_idr%   vs               r-   list_products_with_variantsrV   ;   s-   :&&L-..L h788==dCCII%PPFF||H 	G    U^
 y(:*>*>?@@
 

 WU^,, 	- 	-A1U8}}AeHq|,,AiLL '
wNr,   id_strreturnc                 ~    	 t          |           S # t          $ r!}t          t          j        d          |d }~ww xY w)NzInvalid identifierstatus_codedetail)r   	Exceptionr   r   HTTP_400_BAD_REQUEST)rW   excs     r-   _ensure_object_idr`   ^   sS    k k k k(CL`aaagjjks    
<7<valuec                 X    t          | t                    r|                                 S | S N)
isinstancer   	isoformat)ra   s    r-   _serialize_datetimerf   e   s)    %"" !   Lr,   Ndocr%   c                 $   i dt          | d                   d| d         d| d         d| d         d| d         d| d         d|                     dd	          d
| d
         d|                     d          d|                     d          d|                     dg           d|                     d          dt          |                     dd                    dt          |                     dd                    dt          |                     dd                    d|                     dg           dt          |                     d                    dt          |                     d                    i}|||d<   |S )NidrL   r0   r1   r2   r3   r4   r5   rM   r6   r7   r8   r9   r:   r;   Fr<   r=   r>   	createdAt	updatedAtr%   )r?   getr@   rf   )rg   r%   results      r-   _serialize_productrn   k   s   c#e*oo#h- 	s#89 	!#&>"?	
 	c,' 	#./ 	#''"2I>> 	W 	// 	cgg&:;; 	377#4b99 	377#455 	4(95 A ABB 	4(95 A ABB 	D);U!C!CDD  	CGGJ++!" 	()=)=>>#$ 	()=)=>>% F( %zMr,   credentialsc                    | st          t          j        d          t          | j                  \  }}|r|st          t          j        d          |                    d          dk    rt          t          j        d          t          d          }|                    dt          |d	                   i          }|st          t          j        d
          |S )NzNot authenticatedrZ   zInvalid tokenroleadminzAdmin access requiredadminsrL   subzAdmin not found)
r   r   HTTP_401_UNAUTHORIZEDr   ro   rl   HTTP_403_FORBIDDENr   find_oner`   )ro   okpayloadrs   
admin_users        r-   _require_adminr{      s     b(DM`aaaa[455KB ^W ^(D_]]]]{{6g%%(AJabbbbXF%):75>)J)J!KLLJ `(DM^____r,   c                    t          | d                   t          | d                   | d         | d         |                     d          |                     d          | d         |                     d          | d	         |                     d
d          |                     d          |                     d          t          |                     d                    t          |                     d                    dS )NrL   rM   variant_Typevariant_Valuesoffer_priceoffer_percentagepriceskustock
total_soldr   variant_urlschema_markuprj   rk   )ri   	productIdr}   r~   r   r   r   r   r   r   r   r   rj   rk   r?   rl   rf   )rg   s    r-   _serialize_variantr      s    #e*ooY((N+./ww}--GG$677Wwwu~~WgglA..ww}--11()=)=>>()=)=>>  r,   product_docc           	      d   t          d          }t          j                    }| d         }t          | d                   }|                    d|i          }|r |                    d|id|id|id           n0|                    ||                     d          d	|g||d
           |                     d          rrt          d          }| d         }|                    ||d          }|r"|                    ||dd|id|id           d S |                    ||d	|g||d           d S d S )N
categoriesr3   rL   rE   product_listrk   )z	$addToSet$setrF   TrE   rF   r   r   rj   rk   r4   sub_categoriesrE   sub_category_name)rE   r   r   r   rj   rk   )r   r   utcnowr?   rw   
update_one
insert_onerl   )	r   r   nowrE   product_id_strexisting_categoryr   r   existing_sub_categorys	            r-   _ensure_category_linksr      s   &&J
/

C-MU+,,N #++_m,LMM m,,n=$c* 	
 	
 	
 	
 	*)oo.>??+,
 
 	 	 	 '((  !122'(89 !/ 7 7*!29
 9
 ! !
 ! 	%%"/FWXX"0.!A(#.      %%!.%6!/ 0  ' '     + r,   c                    t          d          }|                    d| d         idt          | d                   idt          j                    id           |                     d          rat          d	          }|                    | d         | d         d
dt          | d                   idt          j                    id           d S d S )Nr   rE   r3   r   rL   rk   )z$pullr   r4   r   r   )r   r   r?   r   r   rl   )r   r   r   s      r-   _unlink_from_categoryr      s    &&J	+l34!3{5'9#:#:;kS[SbSdSdEeff   '(( 
 !122!!),7kZjNkll%s;u+='>'>?+W_WfWhWhIijj	
 	
 	
 	
 	

 
r,   z/create)r[   .rM   r0   r1   r2   r3   r4   r6   r5   r7   r8   r9   r:   r;   r<   r=   imagesc                 0  K   dd l }	 t          d          }|                    d|i          rt          t          j        d          |rt          |          dk    rt          t          j        d          t          |          dk     r+t          t          j        dt          |                     t          |          d	k    r+t          t          j        d
t          |                     g }t          |          D ]y\  }}	 t          |d          }|	                    |           -# t          $ r  t          $ r6}t          t          j        d|dz    dt          |                     d }~ww xY wd }|	rd |	                    d          D             }t          j                    }i d| d|d|d|d|d|d|d|d|d|d|
d|d|d|d|d|d |}|                    |          }|                    d!|j        i          }t%          |           g }t&          r	 |                    t&                    }|D ]}|j        |                    d"          |                    d#          |                    d$          |                    d%          |                    d&          |                    d'          |                    d(          |                    d)d          |                    d*          |                    d+          ||d,}|	                    |           n# |j        $ r Y nw xY w|r"t          d-                              |           |rIt1          t3          t4          t          d-                              d.|j        i                              ng } t9          || /          S # t          $ r  t          $ r0}t          t          j        d0t          |                     d }~ww xY w)1Nr   r   r6   Product URL already existsrZ   zAt least 3 images are required   z(Minimum 3 images required. You provided    z(Maximum 15 images allowed. You provided folderzFailed to upload image    z: c                 ^    g | ]*}|                                 |                                 +S r+   strip.0kws     r-   
<listcomp>z"create_product.<locals>.<listcomp>.  s2    !`!`!`UWU]U]U_U_!`"((**!`!`!`r,   ,r0   r1   r2   r3   r4   r5   r7   r8   r9   r:   r;   r<   r=   r>   rj   rk   rL   r}   r~   r   r   r   r   r   r   r   r   )rM   r}   r~   r   r   r   r   r   r   r   r   rj   rk   rK   rM   r%   zError creating product: )jsonr   rw   r   r   r^   len	enumerater   rO   r]   HTTP_500_INTERNAL_SERVER_ERRORr?   splitr   r   r   inserted_idr   r%   loadsrl   JSONDecodeErrorinsert_manyr)   mapr   rN   rn   )!r0   r1   r2   r3   r4   r6   r5   r7   r8   r9   r:   r;   r<   r=   r   _adminr   r   
image_urlsidximage	image_urlemeta_keywords_listr   product_payloadresinsertedvariant_docsvariants_datavariant_datavariant_docvariants_results!                                    r-   create_productr      sE     ( KKKh
:&&gu-.. 	nF,GPlmmmm  	V))"77    v;;??"7O#f++OO    v;;"7O#f++OO    !#
#F++ 
	 
	JC	6uZPPP	!!),,,,       # & EHS1WHHAHH    37 	a!`!`7L7LS7Q7Q!`!`!`o
f
!#6
 %&<
 *	

 n
 n
 U
 L
 !"4
 1
 
 
 
  0
 

  !
" #
& !!/22$$eS_%=>>x((( .0 	 $

8 4 4$1 5 5L#&?(4(8(8(H(H*6*:*:;K*L*L!-!1!1'!:!:'3'7'7'F'F,8,<,<=O,P,P+//66!-!1!1'!:!:&2&6&6|Q&G&G'3'7'7'F'F)5)9)9/)J)J%(%(# #K !''4444!5" '     	B&''33LAAA D'1C)D)D)I)I9VYVeJf)g)ghhiii 	
 "(_EEEE    
 
 
=6c!ff66
 
 
 	

sc   DO &D32O 3E=1E88E==B8O 6DL? >O ?
M	O MBO P%+PP2   sub_categoryc                     t          d          }i }| r| |d<   |r||d<   |                    |                              |                              |          }d |D             S )z.Helper function to list products with filters.r   r3   r4   c                 ,    g | ]}t          |          S r+   )rn   r   rg   s     r-   r   z)_list_products_helper.<locals>.<listcomp>  s!    666s##666r,   )r   rN   rH   rI   )rG   r   rI   rH   r   queryrR   s          r-   _list_products_helperr   r  s|     z""HE '&l /".]]5!!&&t,,22599F66v6666r,   z/all)defaultr      )r   gele)r   r   c                 (    t          | |||          S )NrG   r   rI   rH   r   r   s       r-   list_productsr     s     !(UZaeffffr,   z/{product_id}zProduct identifier)descriptionrT   c           	      P   t          d          }t          |           }|                    d|i          }|st          t          j        d          t          t          t          t          d          	                    d|i                              }t          ||          S )Nr   rL   Product not foundrZ   rK   rM   r   )r   r`   rw   r   r   HTTP_404_NOT_FOUNDr)   r   r   rN   rn   )rT   r   oidrg   r%   s        r-   get_productr     s    z""H
J
'
'C


UCL
)
)C _(AJ]^^^^C*G4F,G,G,L,LiY\M],^,^__``HcH5555r,   z/products/{p_url}c                 B   t          d          }|                    d| i          }|st          t          j        d          t          d                              d|d         i          }t          t          t          |                    }t          ||          S )	Nr   r6   r   rZ   rK   rM   rL   r   )
r   rw   r   r   r   rN   r)   r   r   rn   )r6   r   rg   variants_cursorr%   s        r-   get_product_by_urlr     s    z""H 

We,
-
-C _(AJ]^^^^ 01166	3u:7NOOOC*O<<==H cH5555r,   c           	        K   dd l }t          d          }t          |           }|                    d|i          }|st	          t
          j        d          i }|||d<   |||d<   |||d<   |||d	<   |||d
<   |<|                    |d|id          }|rt	          t
          j        d          ||d<   |||d<   |||d<   |	|	|d<   |
$d |
                    d          D             }||d<   |||d<   |||d<   |||d<   |||d<   |m|	                    dg           }|D ]"}t          |          }|rt          |           #g }|D ](}t          |d          }|                    |           )||d<   |st	          t
          j        d          t          j                    |d<   |                    d|id|i           |                    d|i          }t#          |           t%          t'          t(          t          d                              d|i                              }t-          ||           S )!Nr   r   rL   r   rZ   r0   r1   r2   r3   r4   $ne)r6   rL   r   r6   r5   r7   r8   c                 ^    g | ]*}|                                 |                                 +S r+   r   r   s     r-   r   z"update_product.<locals>.<listcomp>  s2    \\\RQSQYQYQ[Q[\bhhjj\\\r,   r   r9   r:   r;   r<   r=   r>   r   No fields to updaterk   r   rK   rM   r   )r   r   r`   rw   r   r   r   r^   r   rl   r   r   r   rO   r   r   r   r   r)   r   r   rN   rn   ) rT   r0   r1   r2   r3   r4   r6   r5   r7   r8   r9   r:   r;   r<   r=   r   r   r   r   r   rg   ry   existingr   
old_imagesold_image_url	public_idr   r   r   updatedr%   s                                    r-   update_productr     s     ( KKKz""H
J
'
'C


UCL
)
)C _(AJ]^^^^ G"&)<%&),B() *!$2 !$$ueS\%J%JKK 	nF,GPlmmmm !$2 !".%(:$%"\\?3H3H3M3M\\\%7!""%4!""%4!""%4!"#&6"#WWZ,,
' 	8 	8M2=AAI 8,Y777 !#
 	) 	)E25LLLIi(((((
 c(CLabbbb#?,,GKvw&7888--G7###C*G4F,G,G,L,LiY\M],^,^__``Hg9999r,   c                    t          d          }t          |           }|                    d|i          }|st          t          j        d          |                    dg           }|D ]"}t          |          }|rt          |           #|	                    d|i           t          d          
                    d|i           t          |           dd	iS )
Nr   rL   r   rZ   r>   rK   rM   messagezProduct deleted successfully)r   r`   rw   r   r   r   rl   r   r   
delete_onedelete_manyr   )rT   r   r   r   rg   r   r   r   s           r-   delete_productr     s    z""H
J
'
'C


UCL
)
)C _(AJ]^^^^ WWZ$$F 4 4	.y99	 	4(333%%%++Y,<===#566r,   z/category/{category_name}rE   c                 $    t          | ||          S rc   )rV   )rE   rH   rI   s      r-   get_products_by_categoryr     s     '}dEBBBr,   z(/category/{category_name}/{sub_category}c                 (    t          | |||          S )N)rG   r   rH   rI   r   )rE   r   rH   rI   s       r-    get_products_by_category_and_subr     s     !-lY]ejkkkkr,   z/categoriesTrF   r   c                 P  K   t          d          }|                    d| i          rt          |j        d          t	          |d          }t          j                    }| ||g ||d}|                    |          }|j        |d<   t          |j                  |d         |
                    d          |
                    d	d
          |
                    dg           t          |
                    d                    t          |
                    d                    dS )Nr   rE   zCategory already existsrZ   r   r   rL   rF   r   Tr   rj   rk   ri   rE   rF   r   r   rj   rk   )r   rw   r   r^   r   r   r   r   r   r?   rl   rf   )	rE   rF   r   r   r   r   r   ry   r   s	            r-   create_categoryr   )  s+      &&JO];<< g(CLeffff +>,OOOI
/

C&# G 


(
(C_GEN#/"" 1!++&677++h--NB77([)A)ABB([)A)ABB  r,   c                  \    t          d          } d |                                 D             S )Nr   c                 J   g | ]}t          |d                    |d         |                    d          |                    dd          |                    dg           t          |                    d                    t          |                    d                    dS )	rL   rE   rF   r   Tr   rj   rk   r   r   r   s     r-   r   z#list_categories.<locals>.<listcomp>P  s         c%j// 1!gg&677ggh--GGNB77,SWW[-A-ABB,SWW[-A-ABB	
 	
  r,   )r   rN   )r   s    r-   list_categoriesr   M  s<    &&J  ??$$   r,   z/categories/{category_id}category_idc                   K   t          d          }t          |           }|                    d|i          }|st          |j        d          i }|7|                    |d|id          }	|	rt          |j        d          ||d<   |||d	<   |K|                    d
          }
|
r t          |
          }|rt          |           t          |d          |d
<   |st          |j        d          t          j                    |d<   |                    d|id|i           |                    d|i          }t          |d                   |d         |                    d
          |                    d	d          |                    dg           t          |                    d                    t          |                    d                    dS )Nr   rL   Category not foundrZ   r   )rE   rL   zCategory name already existsrE   r   rF   r   r   rk   r   Tr   rj   r   )r   r`   rw   r   r   r^   rl   r   r   r   r   r   r   r?   rf   )r   rE   rF   r   r   r   r   rg   ry   r   r   r   updated_docs                r-   update_categoryr   ^  s      &&J
K
(
(C


ucl
+
+C `(AJ^____ G &&PUWZ|'\'\]] 	pF,GPnoooo#0 "! 011 	82=AAI 8,Y777 %?~Vb$c$c$c ! c(CLabbbb#?,,GK5#,(9:::%%ucl33K+e$%%$_5%//*:;;//(D11#;;()E)EFF()E)EFF  r,   c                 J   t          d          }t          |           }|                    d|i          }|st          t          j        d          |                    d          }|r t          |          }|rt          |           |	                    d|i           ddiS )Nr   rL   r   rZ   rF   r   zCategory deleted successfully)
r   r`   rw   r   r   r   rl   r   r   r   )r   r   r   r   rg   r   r   s          r-   delete_categoryr     s    &&J
K
(
(C


ucl
+
+C `(AJ^____ ())I 4.y99	 	4(3335#,'''677r,   z/{p_url}/relatedc                    t          d          }|                    d| i          }|st          t          j        d          |d         }|                    d          }d|i}|r||d<   |                    |                              d          }g }|D ]6}|d         |d         k    r"|                    t          |                     7|S )	Nr   r6   r   rZ   r3   r4   
   rL   )
r   rw   r   r   r   rl   rN   rI   rO   rn   )	r6   r   rg   rG   r   r   rR   related_productsprods	            r-   get_related_productsr    s    z""H


We,
-
-C _(AJ]^^^^< H77+,,L)84E /".]]5!!''++F > >;#e*$$##$6t$<$<===r,   z
/hot-dealsc                      t          d          } |                     ddddiiddd digi                              d	          }g }|D ]$}|                    t	          |                     %|S )
Nr   z$orr   z$gter  r   T)z$existsr      r   rN   rI   rO   rn   )r   rR   	hot_dealsr  s       r-   get_hot_deal_productsr	    s    z""H]]&".T::;
  
 uRyy  I 3 3+D112222r,   z/byType/comboc                      t          d          } |                     ddi                              d          }g }|D ]$}|                    t	          |                     %|S )Nr   r5   combor   r  )r   rR   combo_productsr  s       r-   get_combo_productsr    sn    z""H]],g677==bAAFN 8 80667777r,   z0/category/{category_name}/{sub_category}/{p_url}subcategory_namec                     t          d          }|                    | ||dddi          }|rd|vs|d         st          t          j        d          t          |          S )Nr   )rE   z!subcategory_list.subcategory_namez)subcategory_list.product_list.product_urlzsubcategory_list.$r   subcategory_listz!Category or Subcategory not foundrZ   )r   rw   r   r   r   _serialize_category)rE   r  r6   r   rg   s        r-   get_products_by_category_namesr    s    &&J


&-=5: 
 	a	 C  o$C//s;M7N/(AJmnnnns###r,   z/product/{p_url}/{variant_url}r   c                 :   t          d          }|                    d| i          }|st          t          j        d          t          d          }|                    |d         |d          }|st          t          j        d          t          |          S )	Nr   r6   r   rZ   rK   rL   )rM   r   zVariant not found)r   rw   r   r   r   r   )r6   r   r   r   rQ   r   s         r-   get_product_variant_by_urlsr    s    z""H##We$455K _(AJ]^^^^-..L''u%") )  K  _(AJ]^^^^k***r,   rc   )NNr   r   )Or   typingr   r   r   r   bsonr   fastapir	   r
   r   r   r   r   r   r   r   fastapi.securityr   r   pydanticr   r   	app.db.dbr   app.models.categoryr   app.models.productr   app.models.productVarientr   app.utility.securityr   app.utility.cloudinary_utilsr   r   r   routerauth_schemer#   r/   rB   rD   r?   intrV   r`   rf   rn   r{   r   r   r   postHTTP_201_CREATEDr@   r   r   rl   HTTP_200_OKr   r   r   putr   deleter   r   r   r   r   r   r   r  r	  r  r  r  r+   r,   r-   <module>r(     sM         , , , , , , , , , , , ,       b b b b b b b b b b b b b b b b b b b b b b E E E E E E E E % % % % % % % %       ( ( ( ( ( ( & & & & & & 4 4 4 4 4 4 + + + + + +          
+ZL	9	9	9jE***A A A A AG A A A) ) ) ) )I ) ) )$	 	 	 	 	X 	 	 	" " " " "Y " " "
       ! ! ! ! ! ! #  S          Fkc kh k k k ks s     DcN htDcN?S6T `dehjmem`n    4 @Gw{?S?S   < X\]`be]eXf    DcN tCH~    &9S#X 94 9 9 9 9x
tCH~ 
$ 
 
 
 
 YF$;<<$s))#tCyy"&$s))d3ii$s))c$y//"&$t**(,T

%)T$ZZ%)T$ZZ DKK DKK!T%[[#tCyy7>""#}
 }
}
}
  }
 	}

 }
 }
 }
 3-}
 !}
 c]}
 c]}
 }
 }
 }
 }
 }
 }
 =<}
B #"&	7 7sm73-7 7 	7
 
$sCx.7 7 7 7" F 233#eD111"'%"5"5"5raC000aA&&&	g gsmg3-g g 	g g g 43g O);<<"&$s8L"M"M"M 6 6C 6 6 6 =<6 V-?@@6c 6 6 6 A@6  O);<< !DJJ)-d,0DJJ $T

$(DJJ4::$(DJJ"&$t**(,T

%)T$ZZ%)T$ZZ&*d4jj&*d4jj'+tDzz)-d7>""#T: T:T:SMT: "#T: %SM	T:
 T: SMT: C=T: SMT: 3-T: !T: c]T: c]T: d^T: d^T: tnT:  T*%&!T: T: T: =<T:n F,>??+27>+B+B 7 7s 7 7 7 @?7( 'V5GHH aA&&&raC000C CC
C C C C IHC 6FDVWW aA&&&raC000	l lll l 	l l l XWl ](?@@c!%c4::7>""	            A@ F Mv'9::  ;:  'V5GHH $(4::+/4::!T$ZZ7>""/ //C=/ Z(/ TN	/ / / IH/d *8JKK-4W^-D-D 8 8 8 8 8 LK8$ F,>??    @?* Lf&899  :9 O);<<  =< >FL^__$# $ $UX $ $ $ `_$ ,&:LMM+s + + + + NM+ + +r,   