
    iU                     (   d dl Z d dlZd dlmZmZ d dlmZ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 d d
lmZmZmZ  e       ZdZddgZddedgiifddeddgiifgZddedgiifddeg diifddeg iifgZefdZej>                  jA                  de      d        Z!ej>                  jA                  de      d        Z"ej>                  jA                  de      d        Z#ej>                  jA                  de      d        Z$ej>                  jK                  d      d        Z&ej>                  jA                  d g d!      d"        Z'ej>                  jA                  d#g d$      d%        Z(d& Z)d' Z*d( Z+d) Z,d* Z-d+ Z.ej>                  jA                  de      d,        Z/ej>                  jA                  de      d-        Z0ej>                  jA                  de      ej>                  jA                  d.d/d0g      d1               Z1y)2    N)assert_almost_equalassert_array_equal)NumpyOpsRaggedget_current_ops)util)English)Language)	SpanGroup)
SpanGroups)Example)fix_random_seedmake_tempdirregistrylabeled_spansspancatspancat_singlelabelzWho is Shaka Khan?spans)      PERSONzI like London and Berlin.r      LOC      r   I like London and Berlin)r   r   )r   r   
DOUBLE_LOC c                     g }|D ]>  }t        j                  | j                  |d         |d         }|j                  |       @ |S )Nr      )r   	from_dictmake_docappend)nlpdatatrain_examplestegs        r/var/www/vps2.regionflexible.com/Desarrollo/venv/lib/python3.12/site-packages/spacy/tests/pipeline/test_spancat.pymake_examplesr,   &   sO    N "s||AaD11Q48b!"     namec                     t               }|j                  | dt        i       t        j                  t
              5  |j                          d d d        y # 1 sw Y   y xY w)N	spans_keyconfig)r
   add_pipeSPAN_KEYpytestraises
ValueError
initialize)r.   r&   s     r+   test_no_labelr9   .   sI    
*CLL{H5L6	z	"   s   AA c                    t               }|j                  | dt        i      }|j                  d       |j                  d       |j                  dk(  sJ |j                          |j                  j                  d      |j                  k(  sJ t        j                  t              5  |j                  d       d d d        y # 1 sw Y   y xY w)Nr0   r1   ThingPhrase)r;   r<   nOStuff)r
   r3   r4   	add_labellabelsr8   modelget_dim	_n_labelsr5   r6   r7   r.   r&   r   s      r+   test_no_resizerE   6   s    
*Cll4h(?l@Ggh>>0000NN==  &'*;*;;;;	z	" #'"# # #s   *CCc                     t               }|j                  | dt        i      }t        |j                        dk(  sJ t        |      |j                  fd       |j                  dk(  sJ y )Nr0   r1   r   c                       S N r(   s   r+   <lambda>z&test_implicit_labels.<locals>.<lambda>J        r-   get_examplesr   r   )r
   r3   r4   lenr@   r,   r8   )r.   r&   r   r(   s      @r+   test_implicit_labelsrQ   D   sd    
*Cll4h(?l@Gw~~!###"3'NNN 6N7>>....r-   c                    t               }|j                  | dt        i      }t        |j                        dk(  sJ |j                  d       |j                  d       |j                          |j                  dk(  sJ y )Nr0   r1   r   r   r   rO   )r
   r3   r4   rP   r@   r?   r8   rD   s      r+   test_explicit_labelsrS   N   sp    
*Cll4h(?l@Gw~~!###heNN>>....r-   z%Test is unreliable for unknown reason)reasonc                     t               } | j                  ddt        i      }|j                  d       | j	                          g d}| j                  |      D cg c]  }|j                   }}t        ||      D ]x  \  }}t        |t              sJ |j                         D ]N  \  }}t        |t              sJ t        |      dkD  sJ t        j                  t              5  |d    d d d        P z y c c}w # 1 sw Y   bxY w)Nr   r0   r1   r   zJust a sentence.r   zI like Berlinz
I eat ham.r   )r
   r3   r4   r?   r8   piper   zip
isinstancer   itemsr   rP   r5   r6   RuntimeError)	r&   r   textsdoc	all_spanstext
spangroupskey	spangroups	            r+   test_doc_gcrc   Z   s     *Cll9k8-DlEGhNNE '*hhuo6s6I6y1 j*j111(..0 	NCi333y>A%%%|, ! 		 7 s   C9&C>>Dzmax_positive,nr_results))N   )r"      )re      )rf   rd   )rd   rd   c           	      B   t        d       t               }|j                  dt        d| d      }|j	                  d      }t        j                  j                  d      dd	g
      } ||g      d   j                  }t        t        j                  |      t        j                  ddgdd	gdd	gg             g d}|D ]  }|j                  |        t        j                  g dg dg dgd      }	|j                  |||	      }
t!        |
      |k(  sJ |
d   j"                  dk(  sJ |
d   j$                  dk(  sJ t'        d|
j(                  d   d   d       |
d   j"                  dk(  sJ | dk(  r2|
d   j$                  dk(  sJ t'        d|
j(                  d   d   d       n1|
d   j$                  dk(  sJ t'        d|
j(                  d   d   d       |d	kD  r||
d	   j"                  dk(  sJ | d	k(  r2|
d	   j$                  dk(  sJ t'        d|
j(                  d   d	   d       n1|
d	   j$                  dk(  sJ t'        d|
j(                  d   d	   d       |
d   j"                  dk(  sJ |
d   j$                  dk(  sJ t'        d|
j(                  d   d   d       y )Nr   r         ?r0   	thresholdmax_positiver1   Greater Londonspacy.ngram_suggester.v1r"   re   sizesr;   CityPerson	GreatCity皙?皙?333333?皙?rx   333333?ru   rv   皙?ffffff?rw   ?fdtypeLondonrq   rz   scores   rs   r~   r;   r|   r}   )r   r
   r3   r4   r$   r   miscgetdataXdr   OPSto_numpynumpyasarrayr?   _make_span_group_multilabelrP   r_   label_r   attrs)rk   
nr_resultsr&   r   r]   ngram_suggesterindicesr@   labelr   rb   s              r+   test_make_spangroup_multilabelr   r   s    A
*Cll%CV  G ,,'
(Cmm''(BC1a&QOse$Q'..Gs||G,emmaVaVaQRV<T.UV5F !% !]]	35IJRUF 33C&IIy>Z''' Q<(((Q<&(((Y__X6q91= Q< 0000q|""k111C!:1!=qA|""g---C!:1!=qAA~|  $44441Q<&&+555Y__X%>q%A1EQ<&&&000Y__X%>q%A1ER=!1111R=;...Y__X6r:A>r-   z"threshold,allow_overlap,nr_results))皙?Trf   )r   Fr"   )rh   Tre   )rh   Fr"   c           	         t        d       t               }|j                  dt        | dd      }|j	                  d      }t        j                  j                  d      ddg	      } ||g      d   j                  }t        t        j                  |      t        j                  ddgddgddgg             g d
}|D ]  }	|j                  |	        t        j                  g dg dg dgd      }
|j                  |||
|      }| dkD  r|r|d   j                   dk(  sJ |d   j"                  dk(  sJ t%        d|j&                  d   d   d       |d   j                   dk(  sJ |d   j"                  dk(  sJ |j&                  d   d   dk(  sJ t%        d|j&                  d   d   d       y |d   j                   dk(  sJ |d   j"                  dk(  sJ |j&                  d   d   dk(  sJ y |ry|d   j                   dk(  sJ |d   j"                  dk(  sJ |d   j                   dk(  sJ |d   j"                  dk(  sJ |d   j                   dk(  sJ |d   j"                  dk(  sJ y |d   j                   dk(  sJ y )Nr   r   r"   ri   r1   rl   rm   re   rn   rp   rt   ry   r{   r   r   rv   r   rq   rz   r   r   rs   r~   Greater)r   r
   r3   r4   r$   r   r   r   r   r   r   r   r   r   r?   _make_span_group_singlelabelr_   r   r   r   )rj   allow_overlapr   r&   r   r]   r   r   r@   r   r   rb   s               r+   test_make_spangroup_singlelabelr      s   
 A
*Cll!"
  G ,,'
(Cmm''(BC1a&QOse$Q'..Gs||G,emmaVaVaQRV<T.UV5F !% !]]	35IJRUF 44WfmI 3Q<$$000Q<&&&000Y__X%>q%A1EQ<$$(8888Q<&&+555??8,Q/3666Y__X%>q%A1EQ<$$(8888Q<&&+555??8,Q/3666Q<$$	111Q<&&&000Q<$$000Q<&&&000Q<$$(8888Q<&&+555Q<$$(8888r-   c            	         t        d       t               } t               }| j                  dt        ddd      }|j                  dt        ddd      }d|_        d|_        | j                  d	      }g d
}|D ]$  }|j                  |       |j                  |       & t        j                  j                  d      ddg      } ||g      d   j                  }t        t        j                  |      t        j                  ddgddgddgg             t        j                  g dg dg dgd      }	|j!                  |||	      }
|j#                  |||	      }t%        |      dk(  sJ |d   j&                  dk(  sJ |d   j(                  dk(  sJ t+        d|j,                  d   d   d       |d   j&                  d	k(  sJ |d   j(                  dk(  sJ |j,                  d   d   dk(  sJ t+        d|j,                  d   d   d       t%        |
      dk(  sJ |
d   j&                  dk(  sJ |
d   j(                  dk(  sJ t+        d|
j,                  d   d   d       |
d   j&                  dk(  sJ |
d   j(                  dk(  sJ t+        d|
j,                  d   d   d       |
d   j&                  dk(  sJ |
d   j(                  dk(  sJ t+        d|
j,                  d   d   d       |
d   j&                  dk(  sJ |
d   j(                  dk(  sJ t+        d|
j,                  d   d   d       |
d   j&                  d	k(  sJ |
d   j(                  d k(  sJ |
d   j&                  d	k(  sJ t+        d!|
j,                  d   d   d       |
d   j&                  d	k(  sJ |
d   j(                  dk(  sJ t+        d|
j,                  d   d   d       y )"Nr   r   rx   r"   ri   r1   re   Trl   rp   rm   rn   )ru   rv   rw   rx   rx   )rx   rz   ru   rv   r~   )r|   r}   rw   r~   rx   r   r   r   rq   rv   r   r   rs   r~      rr   rw   r   rz   rf   rd   r;   r|   )r   r
   r3   r4   add_negative_labelr$   r?   r   r   r   r   r   r   r   r   r   r   r   rP   r_   r   r   r   )
nlp_single	nlp_multispancat_singlespancat_multir]   r@   r   r   r   r   spangroup_multispangroup_singles               r+   "test_make_spangroup_negative_labelr      sA   AJ
I((!
 ) N &&!
 ' M )-N%'+M$


.
/C5F (&  '( mm''(BC1a&QOse$Q'..Gs||G,emmaVaVaQRV<T.UV]]%%%	

 F $??WfUO%BB3QWX A%%%A##y000A%%///-33H=a@!DA##'7777A%%444!!(+A.#555-33H=a@!D1$$$1""i///1$$..._228<Q?C1""i///1$$000_228<Q?C1""h...1$$..._228<Q?C1""h...1$$333_228<Q?C1""&66661$$///1""&6666_228<Q?C1""&66661$$333_228<Q?Cr-   c                    dD ]  }t        j                  j                  d      |g      }dD cg c]
  } | |       }} ||      }|j                  D ]  }|d   |d   z
  |k(  rJ  d}t	        |      D ]  \  }}	|j
                  |||j                  |   z    }
t               }|
D ]e  }d|d   cxk  rt        |	      k  sJ  J d|d   cxk  rt        |	      k  sJ  J |j                  t        |d         t        |d         f       g |
j                  d   t        |      k(  sJ ||j                  |   z  } t        t        j                  |j                        |D 	cg c]  }	t        dt        |	      |dz
  z
         c}	        t        j                  j                  d      g d      }dD cg c]
  } | |       }} ||      }t        t        j                  |j                        g d       t        t        j                  |j                        g ddgddgdd	gdd	gddgdd	gd	d
gdd	gdd
gdd
gddgdd	gd	d
gd
dgdd	gdd
gd	dgdd
gddgddgdd	gd	d
gd
dgddgdd	gdd
gd	dgd
dgdd
gddgd	dg       t        j                  j                  d      dg      }dD cg c]
  } | |       }} ||      }t        t        j                  |j                        |D 	cg c]  }	t        |	       c}	       t        j                  j                  d      dg      }dD cg c]
  } | |       }} ||      }t        t        j                  |j                        |D 	cg c]  }	t        |	       c}	       y c c}w c c}	w c c}w c c}w c c}	w c c}w c c}	w )Nr"   re   rf   rm   rn   )aa ba b ca b c d	a b c d eza a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a r"   r   r   r   r   r   r   r"   rf   r   	      re   rf   rd   r   )r    r   r    )r    r    r    )r   r   r   r'   	enumerater   lengthssetrP   addintshaper   r   r   max)en_tokenizersizer   r_   docsngramssoffsetir]   r   	spans_setspans                r+   test_ngram_suggesterr   !  s    !
"--++,FGtfU

 

 

 !& 	'AQ4!A$;$&&&	' o 		(FAsMM&6FNN14E+EFEI <DG.c#h.....47.c#h.....s47|Sa\:;<
 ;;q>S^333fnnQ''F		( 	LL(6:;sSCHq)*;	
=!
H mm''(BC)TO'T#TD  T"Fs||FNN35EFV[[!%	
F%	
 F	%	

 F%	
 F%	
 F%	
 F%	
 F%	
 F%	
 F%	
 F%	
 F%	
  F!%	
" F#%	
$ F%%	
& F'%	
( F)%	
* F+%	
, F-%	
. F/%	
2 F3%	
4 F5%	
6 F7%	
8 F9%	
: F;%	
< F=%	
> F?%	
@ FA%	
B FC%	
D FE%	
F FG%	
H FI%	
(V mm''(BC1#NO+894L9D9T"Fs||FNN3$5O3c#h5OP mm''(BC1#NO+784L8D8T"Fs||FNN3$5O3c#h5OPy

< <
b :5O 95Os)   N0)"N5 N:N?O
O	O
c                    t        j                  j                  d      g d      }t         j                  j                  d      } |dd      }dD cg c]
  } | |       }} ||      } ||      }t        t        j                  |j                        g d	       t        t        j                  |j                        t        j                  |j                               t        t        j                  |j                        t        j                  |j                               t         j                  j                  d      } |d
d      } ||      }t        t        j                  |j                        g d       y c c}w )Nrm   r   rn   zspacy.ngram_range_suggester.v1r"   rf   )min_sizemax_sizer   r   re   rd   )r   r"   rf   r   r   )r   r   r   r   r   r   r   r'   )	r   size_suggestersuggester_factoryrange_suggesterr_   r   ngrams_1ngrams_2ngrams_3s	            r+   test_ngram_sizesr     s%   ]]&&'ABSN ))*JK'Q?O'T#TD  d#Ht$Hs||H$4$457GHs||H$4$45s||HDTDT7UVs||HMM2CLL4OP !))*JK'Q?Ot$Hs||H$4$45Gs   F
c                  V   t               }  | d       | d      g}|d   dd g|d   j                  t        <   |d   dd |d   dd g|d   j                  t        <   t        j                  j                  d      t        	      } ||      }t        |      t        k(  sJ t        |      d
k(  sJ t        |j                  d         ddgk(  sJ t        |j                  d         ddgk(  sJ t        |j                  d
         ddgk(  sJ t        |j                        dd
gk(  sJ y )NzThis is an example.zThis is the second example.r   rf   rd   r"   r   zspacy.preset_spans_suggester.v1)r0   re   )r
   r   r4   r   r   r   typer   rP   listr   r   )r&   r   	suggester
candidatess       r+   test_preset_spans_suggesterr     s3   
*C%&,I(JKD#Awq|nDGMM(#Awq|T!WQq\:DGMM(!!"CDxXI4J
v%%%z?a
!!!$%!Q///
!!!$%!Q///
!!!$%!Q///
""#1v---r-   c                  x   t        d       t               } | j                  ddt        i      }t	        |       | j                  fd      }|j                  j                  d      dk(  sJ t        |j                        d	d
hk(  sJ t        d      D ]  }i }| j                  ||        d   dk  sJ d} | |      }|j                  |j                     |j                  t           k(  sJ |j                  t           }t        |      dk(  sJ t        |j                  d         dk(  sJ t!        |j                  d         dkD  sJ t        |D cg c]  }|j"                   c}      ddhk(  sJ t        |D cg c]  }|j$                   c}      d	hk(  sJ t'               5 }	| j)                  |	       t+        j,                  |	      }
 |
|      }|j                  t           }t        |      dk(  sJ t        |j                  d         dk(  sJ t!        |j                  d         dkD  sJ t        |D cg c]  }|j"                   c}      ddhk(  sJ t        |D cg c]  }|j$                   c}      d	hk(  sJ 	 d d d        | j/                        }dt         d|v sJ |dt         d   dk(  sJ |dt         d   dk(  sJ |dt         d   dk(  sJ  | d      }t        |j                  |j                           dk(  sJ y c c}w c c}w c c}w c c}w # 1 sw Y   xY w)Nr   r   r0   r1   c                       S rH   rI   rJ   s   r+   rK   z%test_overfitting_IO.<locals>.<lambda>      N r-   rM   r=   re   r   r   2   sgdlosses{Gz?r   r   r|   r   Berlinspans__f_pg      ?_rr"   )r   r	   r3   r4   r,   r8   rA   rB   r   r@   rangeupdater   ra   rP   r   minr_   r   r   to_diskr   load_model_from_pathevaluate)r&   r   	optimizerr   r   	test_textr]   r   r   tmp_dirnlp2doc2spans2r   r(   s                 @r+   test_overfitting_IOr     s3   A
)Cll9k8-DlEG"3'N,BCI==  &!+++w~~5("33332Y A

>y
@A )t### +I
i.C99W[[!SYYx%8888IIhEu:??u{{8$%***u{{8$%+++e,d		,-(H1EEEE../E7::: 
 	@7G((1IH%6{a6<<)*a///6<<)*S000&1$DII12x6JJJJF3DDKK34???	@ \\.)FH:R F***F8*B'(C///F8*B'(C///F8*B'(C/// h-Csyy%&!+++1 -. 23	@ 	@s7   LL!/BL0L&
L0.L+
L0&
L00L9c                  "   t        d       t               } | j                  ddt        i      }t	        | t
              | j                  fd      }|j                  j                  d      d	k(  sJ t        |j                        h d
k(  sJ t        d      D ]  }i }| j                  ||        d   dk  sJ d} | |      }|j                  t           }t        |      d	k(  sJ t        |j                  d         d	k(  sJ t!        |j                  d         dkD  sJ t        |D cg c]  }|j"                   c}      h dk(  sJ t        |D cg c]  }|j$                   c}      ddhk(  sJ t'               5 }	| j)                  |	       t+        j,                  |	      }
 |
|      }|j                  t           }t        |      d	k(  sJ t        |j                  d         d	k(  sJ t!        |j                  d         dkD  sJ t        |D cg c]  }|j"                   c}      h dk(  sJ t        |D cg c]  }|j$                   c}      ddhk(  sJ 	 d d d        y c c}w c c}w c c}w c c}w # 1 sw Y   y xY w)Nr   r   r0   r1   )r'   c                       S rH   rI   rJ   s   r+   rK   z1test_overfitting_IO_overlapping.<locals>.<lambda>  r   r-   rM   r=   rf   >   r   r   r   r   r   r   r   r   r~   >   London and Berlinr   r   r   r   )r   r	   r3   r4   r,   TRAIN_DATA_OVERLAPPINGr8   rA   rB   r   r@   r   r   r   rP   r   r   r_   r   r   r   r   r   )r&   r   r   r   r   r   r]   r   r   r   r   r   r   r(   s                @r+   test_overfitting_IO_overlappingr     s   A
)Cll9k8-DlEG"3-CDN,BCI==  &!+++w~~"AAAA2Y A

>y
@A )t### +I
i.CIIhEu:??u{{8$%***u{{8$%+++e,d		,- 2   
 ../E<3HHHH 
 N7G((1IH%6{a6<<)*a///6<<)*S000&1$DII12 7
 
 	
 

 F3DDKK348MMMMN N -
 / 2
 4N Ns7   2I1I6BJI;
/JJ 
J;
JJc                 0   t        j                  d      d        }t        d       t               }|j	                  | ddit
        d      }t        |      |j                  fd      }|j                  j                  d	      |j                  k(  sJ t        |j                        d
dhk(  sJ |j                  |        |d        |d        |d       t        |j                  g d             t        |j                  g d             y )Ntest_mixed_zero_suggesterc                      d dd} | S )N)opsc                   |
t               }g }g }| D ]U  }t        |      dkD  r4t        |      dz  dk(  r#|j                  d       |j                  d       E|j                  d       W |j                  |      }|j	                  |      }t        |      dkD  r't        |j                  j                  |      |      }|S t        |j                  j                  dd      |      }|S )Nr   re   )r   r"   r"   )r   r   r   r   )	r   rP   r%   	asarray2i	asarray1ir   xpvstackzeros)r   r   r   r   r]   lengths_arrayoutputs          r+   mixed_zero_suggesterzVtest_zero_suggestions.<locals>.make_mixed_zero_suggester.<locals>.mixed_zero_suggester  s    {%'EG &s8a<CHqLA$5LL(NN1%NN1%& MM%(EMM'2M5zA~e 4mD M  V3 ?OMr-   rI   )r   s    r+   make_mixed_zero_suggesterz8test_zero_suggestions.<locals>.make_mixed_zero_suggester  s    .2 	& $#r-   r   z@misc)r   r0   r1   c                       S rH   rI   rJ   s   r+   rK   z'test_zero_suggestions.<locals>.<lambda>-  r   r-   rM   r=   r   r   )r   r    onetwo two)r   r   three three threer    zfour four four four)r    r   r  )r   r   r   r	   r3   r4   r,   r8   rA   rB   rC   r   r@   r   r   rW   )r.   r   r&   r   r   r(   s        @r+   test_zero_suggestionsr  	  s     ]]./$ 0$, A
)Cll!#>?!
  G #3'N,BCI==  &'*;*;;;;w~~5("3333JJ~9J-GJ	NT	UV2	34r-   c                 4   t               }|j                  | dt        i      }t        |      |j	                  fd       g d}|D cg c]
  } ||       }}|j                  |       t        |      t        |      k(  sJ t        |d   j                  d         t        k(  sJ t        |d   j                  d         dk(  sJ |d   j                  d   d   j                  d	k(  sJ |d   j                  d   d
   j                  dk(  sJ y c c}w )Nr0   r1   c                       S rH   rI   rJ   s   r+   rK   z%test_set_candidates.<locals>.<lambda>C  rL   r-   rM   rV   r   r   r   Justrd   zJust a)r
   r3   r4   r,   r8   set_candidatesrP   r   r   r   r_   )r.   r&   r   r\   r_   r   r(   s         @r+   test_set_candidatesr  >  s   
*Cll4h(?l@G"3'NNN 6N7E #(($CI(D(4 t9E
"""Ql+,	999tAw}}\*+q0007==&q)..&8887==&q)..(::: )s   D	n_processr"   re   c                 2   t        t        t              s|dk  r}t               }|j	                  | dt
        i      }t        |      |j                  fd       g d}t        |j                  ||            }t        |      t        |      k(  sJ y y )Nre   r0   r1   c                       S rH   rI   rJ   s   r+   rK   z.test_spancat_multiprocessing.<locals>.<lambda>\  s    N r-   rM   rV   )r  )rY   r   r   r
   r3   r4   r,   r8   r   rW   rP   )r.   r  r&   r   r\   r   r(   s         @r+   test_spancat_multiprocessingr  U  s     /8,	Aj,,t[(,C,D&s+$:;
 CHHUiH894yCJ&&& 1>r-   )2r   r5   numpy.testingr   r   	thinc.apir   r   r   spacyr   spacy.lang.enr	   spacy.languager
   spacy.tokensr   spacy.tokens._dict_proxiesr   spacy.trainingr   
spacy.utilr   r   r   r   r4   SPANCAT_COMPONENTS
TRAIN_DATAr   r,   markparametrizer9   rE   rQ   rS   skiprc   r   r   r   r   r   r   r   r   r  r  r  rI   r-   r+   <module>r     s     A 7 7  ! # " 1 " > >!67  Gh1B0C%DEF#	8no>?@
 Gh1B0C%DEF"	8UVW 'Hb>	"#  '  !34 5 !34
# 5
# !34/ 5/ !34/ 5/ @A B. J-?-?` (H.9	.9bDDN`QFH*./,d,N^ !3415 515h !34; 5;, !34q!f-' . 5'r-   