o
    Niޖ                     @   sF  d Z ddlmZ ddlmZ ddlmZ ddlZddlZddlZddlm	Z	 ddl
Zddlm  mZ ddlmZ dZdZd	Zd
ZdZdZdZdZdZdZdZdZedZ G dd dej!j"Z#G dd dej!j$Z%dd Z&dd Z'			d4ddZ(d d! Z)d5d"d#Z*d6d%d&Z+d'd( Z,d)d* Z-	+	,	-d7d.d/Z.	+	0	1	-d8d2d3Z/dS )9zCBIS-DDSM mammography dataset.    )absolute_import)division)print_functionN)logginga  The CBIS-DDSM (Curated Breast Imaging Subset of DDSM) is an updated and
standardized version of the Digital Database for Screening Mammography (DDSM).
The DDSM is a database of 2,620 scanned film mammography studies.
It contains normal, benign, and malignant cases with verified pathology
information.

The default config is made of patches extracted from the original mammograms,
following the description from http://arxiv.org/abs/1708.09427, in order to
frame the task to solve in a traditional image classification setting.

Because special software and libraries are needed to download and read the
images contained in the dataset, TFDS assumes that the user has downloaded the
original DCIM files and converted them to PNG.

The following commands (or equivalent) should be used to generate the PNG files,
in order to guarantee reproducible results:

```
  find $DATASET_DCIM_DIR -name '*.dcm' | \
  xargs -n1 -P8 -I{} bash -c 'f={}; dcmj2pnm $f | convert - ${f/.dcm/.png}'
```
aH  @misc{CBIS_DDSM_Citation,
  doi = {10.7937/k9/tcia.2016.7o02s9cy},
  url = {https://wiki.cancerimagingarchive.net/x/lZNXAQ},
  author = {Sawyer-Lee,  Rebecca and Gimenez,  Francisco and Hoogi,  Assaf and Rubin,  Daniel},
  title = {Curated Breast Imaging Subset of DDSM},
  publisher = {The Cancer Imaging Archive},
  year = {2016},
}
@article{TCIA_Citation,
  author = {
    K. Clark and B. Vendt and K. Smith and J. Freymann and J. Kirby and
    P. Koppel and S. Moore and S. Phillips and D. Maffitt and M. Pringle and
    L. Tarbox and F. Prior
  },
  title = {{The Cancer Imaging Archive (TCIA): Maintaining and Operating a
  Public Information Repository}},
  journal = {Journal of Digital Imaging},
  volume = {26},
  month = {December},
  year = {2013},
  pages = {1045-1057},
}
@article{DBLP:journals/corr/abs-1708-09427,
  author    = {Li Shen},
  title     = {End-to-end Training for Whole Image Breast Cancer Diagnosis using
               An All Convolutional Design},
  journal   = {CoRR},
  volume    = {abs/1708.09427},
  year      = {2017},
  url       = {http://arxiv.org/abs/1708.09427},
  archivePrefix = {arXiv},
  eprint    = {1708.09427},
  timestamp = {Mon, 13 Aug 2018 16:48:35 +0200},
  biburl    = {https://dblp.org/rec/bib/journals/corr/abs-1708-09427},
  bibsource = {dblp computer science bibliography, https://dblp.org}
}
zhttps://wiki.cancerimagingarchive.net/download/attachments/22516629/calc_case_description_test_set.csv?version=1&modificationDate=1506796343686&api=v2zhttps://wiki.cancerimagingarchive.net/download/attachments/22516629/calc_case_description_train_set.csv?version=1&modificationDate=1506796349666&api=v2zhttps://wiki.cancerimagingarchive.net/download/attachments/22516629/mass_case_description_test_set.csv?version=1&modificationDate=1506796343175&api=v2zhttps://wiki.cancerimagingarchive.net/download/attachments/22516629/mass_case_description_train_set.csv?version=1&modificationDate=1506796355038&api=v2)CCMLO)LEFTRIGHT   )BENIGNBENIGN_WITHOUT_CALLBACK	MALIGNANT   zr^.*/(?P<study>1.3.6.1.4.1.9590.100.1.2.[0-9.]+)/(?P<series>1.3.6.1.4.1.9590.100.1.2.[0-9.]+)/(?P<instance>.+).dcm$c                       s"   e Zd ZdZd fdd	Z  ZS )CuratedBreastImagingDDSMConfigz+BuilderConfig for CuratedBreastImagingDDSM.Nc                    s8   t jdd|d< tt| jdi | || _|| _d S )Nz2.0.0z6New split API (https://tensorflow.org/datasets/splits)version )tfdscoreVersionsuperr   __init__
image_size
patch_size)selfr   r   kwargs	__class__r   f/home/ubuntu/.local/lib/python3.10/site-packages/tensorflow_datasets/image_classification/cbis_ddsm.pyr   }   s   
z'CuratedBreastImagingDDSMConfig.__init__)NN)__name__
__module____qualname____doc__r   __classcell__r   r   r   r   r   z   s    r   c                   @   s   e Zd ZdZdZedddddedd	d
eddd
gZdd Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd  Z			!	!d%d"d#Zd$S )&CuratedBreastImagingDDSMz&Curated Breast Imaging Subset of DDSM.z  You can download the images from
  https://wiki.cancerimagingarchive.net/display/Public/CBIS-DDSM
  Please look at the source file (cbis_ddsm.py) to see the instructions
  on how to convert them into png (using dcmj2pnm).
  patcheszPatches containing both calsification and mass cases, plus pathces with no abnormalities. Designed as a traditional 5-class classification task.i  i     r'   )namedescriptionr   r   original-calczFOriginal images of the calcification cases compressed in lossless PNG.)r(   r)   original-massz=Original images of the mass cases compressed in lossless PNG.c                 C   sP   | j | j| jd}| jj|vrtd| jjtjj	| t
|| jj  dtdS )N)r*   r+   r$   &Builder config named {} not supported!z>https://wiki.cancerimagingarchive.net/display/Public/CBIS-DDSM)builderr)   featureshomepagecitation)_get_features_original_calc_get_features_original_mass_get_features_patchesbuilder_configr(   
ValueErrorformatr   r   DatasetInfo_DESCRIPTION	_CITATION)r   features_fn_mapr   r   r   _info   s   zCuratedBreastImagingDDSM._infoc                 C   s~   t j t jjtdt jjddt jjtdt j t jjdtj	dt jjddt jjt
dt jjtdt jjtdddS )	N)namesNN   )shaper   )r?   dtype)num_classesidmask
assessment	pathologysubtlety)rC   breastimageviewpatientabnormalities)r   r.   Text
ClassLabel_BREAST_LABELSImage_IMAGE_VIEW_LABELSTensortfint32_ASSESSMENT_NUM_CLASSES_PATHOLOGY_LABELS_SUBTELTY_NUM_CLASSESr   r   r   r   _get_features_original_base   s   z4CuratedBreastImagingDDSM._get_features_original_basec              
   C   |   |   }|d tjjtjtj	dddtjjtjtj	dddd tj
tj|d |d< tj|S )NrL   image_classificationzcbis_ddsm_calc_types.txt
names_filez cbis_ddsm_calc_distributions.txt)	calc_typecalc_distributionrY   updater   r.   rN   r   get_tfds_pathospathjoinSequenceFeaturesDictr   r.   r   r   r   r1      s,   z4CuratedBreastImagingDDSM._get_features_original_calcc              
   C   rZ   )NrL   r[   zcbis_ddsm_mass_shapes.txtr\   zcbis_ddsm_mass_margins.txt)
mass_shapemass_marginsr`   rh   r   r   r   r2      s*   z4CuratedBreastImagingDDSM._get_features_original_massc                 C   sB   t jt j t jjdddt jjt jtj	
ddddS )Nr=   jpeg)r?   encoding_formatr[   zcbis_ddsm_patch_labels.txtr\   rC   rI   label)r   r.   rg   rM   rP   rN   r   rb   rc   rd   re   rX   r   r   r   r3      s   z.CuratedBreastImagingDDSM._get_features_patchesc                 C   s>   | j jdv r| |S | j jdkr| |S td| j j)N)r*   r+   r$   r,   )r4   r(   _split_generators_original_split_generators_patchesr5   r6   )r   
dl_managerr   r   r   _split_generators   s   

z*CuratedBreastImagingDDSM._split_generatorsc                 C   s   | j jdkrt}t}n| j jdkrt}t}n	td| j j||d}||}t	|j
|}tjjtjj| j|dddtjjtjj| j|dddgS )	Nr*   r+   r,   )testtrainT)generate_fnpatients_datayield_from_train_csvr(   
gen_kwargsF)r4   r(   _CALC_TEST_CSV_URL_CALC_TRAIN_CSV_URL_MASS_TEST_CSV_URL_MASS_TRAIN_CSV_URLr5   r6   download_and_extract_load_csv_files
manual_dirr   r   SplitGeneratorSplitTRAIN_generate_examples_originalTEST)r   rq   test_url	train_url	resourcesresource_pathsrv   r   r   r   ro     s6   

z3CuratedBreastImagingDDSM._split_generators_originalc              	   C   s   t tttd}dd | D }||}t|j|}t|\}}}t	||}	t	||}
t	||}t
jjt
jj| j|
| jj| jjddt
jjt
jj| j|	| jj| jjddt
jjt
jj| j|| jj| jjddgS )N)z	calc-testz
calc-trainz	mass-testz
mass-trainc                 S   s(   i | ]\}}|t jj|t jjjd qS ))urlextract_method)r   downloadResourceExtractMethod
NO_EXTRACT).0keyr   r   r   r   
<dictcomp>-  s    
zFCuratedBreastImagingDDSM._split_generators_patches.<locals>.<dictcomp>)ru   rv   r   r   rx   )rz   r{   r|   r}   itemsr~   r   r   _split_patients_select_patients_datar   r   r   r   r   _generate_examples_patchesr4   r   r   r   
VALIDATION)r   rq   resources_urlsr   r   rv   patients_testpatients_trainpatients_validpatients_data_testpatients_data_trainpatients_data_validr   r   r   rp   &  sR   




		z2CuratedBreastImagingDDSM._split_generators_patchesc                 K   s   |di |S )zYields examples.Nr   r   )r   ru   r   r   r   r   _generate_examplesj  s   z+CuratedBreastImagingDDSM._generate_examplesc              
   #   s     fdd}t | D ]4\}}t | D ])\}}||r@|d |d |d |d |d dd	 |d
 D d}|d |fV  qqd S )Nc                    s    r| d dkS | d dkS )Ncsv_keyrt   rs   r   )examplerw   r   r   _include_example_in_splitp  s   zWCuratedBreastImagingDDSM._generate_examples_original.<locals>._include_example_in_splitrC   rK   rI   rJ   rH   c                 S   s   g | ]}d d |  D qS )c                 S   s   i | ]\}}|d vr||qS ))typer   r   kvr   r   r   r     s    zSCuratedBreastImagingDDSM._generate_examples_original.<locals>.<listcomp>.<dictcomp>r   r   abnormalityr   r   r   
<listcomp>  s
    
zHCuratedBreastImagingDDSM._generate_examples_original.<locals>.<listcomp>rL   )rC   rK   rI   rJ   rH   rL   )sortedr   )r   rv   rw   r   _patient_examplesr   recordr   r   r   r   n  s$   z4CuratedBreastImagingDDSM._generate_examples_original
   c                 #   s   t jdt|  t| D ]\}}t| D ]\}}t|d |d  fdd|d D }	dd |	D }
t|d |	|
D ]\\}}}|d d	rPd	}nd
}|d dkr]|d }n|d dkrh|d }nt	d|d  t
t |d ||||D ]\}}d|d |d |f }|t j|dd|d}||fV  q}qAt
t |d |	|
||D ]\}}d|d |f }|t j|dddd}||fV  qqqd S )NE# rI   r   c                    s   g | ]}t |d   jdqS )rD   r   )_read_imager?   r   rI   r   r   r     s    zGCuratedBreastImagingDDSM._generate_examples_patches.<locals>.<listcomp>rL   c                 S   s   g | ]	}t |d kqS )r   npsum)r   rD   r   r   r   r         rF   r   BENINGr   calc_CALCIFICATIONmass_MASSzUnknown abnormality type: %rrD   z%s/abnorm_%s/patch_%drC   )axisrm   z%s/background_%d
BACKGROUND)r   randomseedlenr   r   r   zip
startswithr5   	enumerate_sample_positive_patchesexpand_dims_sample_negative_patches)r   rv   r   r   $num_positive_patches_per_abnormality num_background_patches_per_imager   r   r   abnormalities_masksabnormalities_areasr   abnormality_maskabnormality_areabenign_or_malignantrn   r   patchpatch_idr   id_r   r   r   r     sl   





z3CuratedBreastImagingDDSM._generate_examples_patchesN)r%   r&   r   r   )r   r   r    r!   MANUAL_DOWNLOAD_INSTRUCTIONSr   BUILDER_CONFIGSr;   rY   r1   r2   r3   rr   ro   rp   r   r   r   r   r   r   r   r#      sB    	"Dr#   c                 C   s(  i }t | D ]\}}tjj|d}t|}t|dD ]\}}dd | D }t	
d|d }	dD ]1}
||
 dd	||
< tjj| g||
 d
R  ||
< tjj||
 shtd||||
 f q7|d }|d }t|d }t|}t|}|j|jkr||}}n|j|jkrtd|||j|j|jg q t|d ||d |d |d d}d|v rd|v rd|d< |d |d< |d |d< nd|v rd|v rd|d< |d |d< |d |d< ntd|	|d  |d! |d |d" |g|d#}t|| q W d$   n	1 sw   Y  q|S )%aG  Load the ground-truth data from the given dictionary of CSV files.

  Args:
    manual_dir: Path of the directory containing the images.
    dictionary_of_csv_files: Dictionary containing the key and filepath of each
      CSV file to load.

  Returns:
    A dictionary containing the ground-truth loaded from the CSV files.
  r   c                 S   s   i | ]	\}}||  qS r   )stripr   r   r   r   r     r   z#_load_csv_files.<locals>.<dictcomp>z\g<study>/\g<series>image file path)r   ROI mask file pathcropped image file pathz.dcmz.png/zCError processing line %d from csv file %s: Image %r does not exist!r   r   zError processing line %d from csv file %s: No suitable mask for the given image (expected size: %r, candidate sizes: %r). This abnormality will NOT be included in the dataset.zabnormality idrE   rF   rG   rB   z	calc typezcalc distributionr   r   r^   r_   z
mass shapezmass marginsr   ri   rj   z%CSV file is missing required columns.zleft or right breast
patient_idz
image view)rC   rH   rK   rI   rJ   rL   r   N)r   r   rS   iogfileGFilecsv
DictReaderr   _DCIM_REGEXsubreplacerc   rd   re   splitexistsr5   r   r?   r   errorint_append_example_to_data)r   dictionary_of_csv_filesdatar   csv_pathf
csv_readerirow
example_idr   mask_file_pathcrop_file_path
full_image
mask_image
crop_imager   r   r   r   r   r     sv   
"

Er   c                 C   s   |d }|d }|| v rq|| |d  v re|| | | d ks J || | | d ks,J |d | | | d ks:J |d | | | d ksHJ |d | | | d ksVJ | | | d  |d  dS || |d  |d < dS |d |i| |d < dS )z0Append the given example to the data dictionary.rC   rK   rH   rI   rJ   rL   N)extend)r   r   r   r   r   r   r   r     s   r   333333?{Gz?(\µ?c           
      C   s   |dkr|dkr|dksJ t || | d dk sJ tt|  }t jjdd t j| t|t	| }|d| }|t|t	|  }||| }||d }	t
|t
|t
|	fS )zJSplit the patients in the data dictionary into test, train and valid sets.r         ?g&.>r   )r   N)r   absr   listkeysr   r   shuffler   r   set)
r   test_fractiontrain_fractionvalid_fractionall_patient_idscutoff_testr   cutoff_trainr   r   r   r   r   r   1  s   r   c                    s    fdd|   D S )Nc                    s   i | ]\}}| v r||qS r   r   r   patient_idsr   r   r   D  s    z)_select_patients_data.<locals>.<dictcomp>r   )r   r	  r   r  r   r   C  s   r   c                 C   s   t jjj}tjj| d/}|jt	j
| t	jd|jd}|r3|||d |d f}|j|ks3J |W  d   S 1 s?w   Y  dS )zERead an image and optionally resize it (size must be: height, width).rb)r@   )flagsr>   r   N)r   r   lazy_importscv2rS   r   r   r   imdecoder   
fromstringreaduint8IMREAD_GRAYSCALEresizer?   )filepathr   r  r   rI   r   r   r   r   G  s   
$r   皙?c                    s~   t jjj t|  | } | |d j\}} | j	 j
\}}} fdd|D }t|} t|||d jS )z6Get the binary mask of the breast region of the image.   c                       g | ]}  |qS r   contourArear   contr  r   r   r   [      z$_get_breast_mask.<locals>.<listcomp>)r   r   r  r  r   max	thresholdTHRESH_BINARYfindContours	RETR_LISTCHAIN_APPROX_SIMPLEr   argmaxdrawContours
zeros_likeFILLED)rI   min_breast_color_thresholdr  r   image_binarycontourscontours_areasbiggest_contour_idxr   r  r   _get_breast_maskT  s   



r-  c                    sF   t jjj  |  j j\}}} fdd|D }t|}|| S )Nc                    r  r   r  r  r  r   r   r   f  r  z&_get_roi_from_mask.<locals>.<listcomp>)	r   r   r  r  r!  r"  r#  r   r$  )rD   r   r*  r+  r,  r   r  r   _get_roi_from_maskb  s   



r.  c              	   C   s|   |d |d  }t ||D ].\}}t|| | |d  |||d  f dk}	|	| }
|	| }|
|ks8||kr; dS qdS )aF  Return True if the given patch overlaps significantly with any abnormality.

  Given a patch and a single abnormality, the overlap between the two is
  significant if, and only if, the relative area of the intersection of the two
  w.r.t. the area of the patch is above `min_overlap_threshold` OR the
  area of the intersection w.r.t. the total abnormality area is above
  `min_overlap_threshold`.

  Args:
    y: Top-most coordinate of the patch.
    x: Left-most coordinate of the patch.
    patch_size: Tuple with (height, width) of the patch.
    abnormalities_masks: List with the binary mask of each abnormality.
    abnormalities_areas: List with the total area of each abnormality.
    min_overlap_threshold:

  Returns:
    Returns True if the above condition is met for any of the given
    abnormalities, or False otherwise.
  r   r>   TF)r   r   r   )yxr   r   r   min_overlap_threshold
patch_areaabnorm_maskabnorm_areaabnorm_in_patch_areaabnorm_in_patch_wrt_patchabnorm_in_patch_wrt_abnormr   r   r   /_patch_overlaps_any_abnormality_above_thresholdk  s   &r8  r   ?d   c                 c   s   t jjj}t|}	||	\}
}}}d}|dkrt||d t||d }}t||d t||d }}|td| |  }|
td| |  }|| t||  }|
| t||  }t|d}t|d}tt|| j	d |d  d |}tt|| j	d |d  d |}|}|| d || d  |k rt
d|||| || d || d  }t|D ]=}tj||d }tj||d }t||||g|g|r|d7 }| |||d  |||d  f V  ||kr dS q|d }t
d|| |dkstd	||||f )
a  Sample random patches from the image overlapping with the given abnormality.

  The abnormal area of the patch with respect to either (a) the total area of
  the patch, or (b) the total area of the abnormality, must be at least
  `min_overlap_threshold` (i.e. 90% by default).

  After `max_number_of_trials_per_threshold` samples, if not enough patches
  meeting this requirement have been generated, the `min_overlap_threshold` is
  reduced by 5%. This procedure is repeated until min_overlap_threshold < 0.1
  (which should not happen ever, if the dataset is correct).

  Args:
    image: Image to patch from.
    abnormality_filepath: Only used for logging.
    abnormality_mask: Binary mask of the abnormality in the image.
    abnormality_area: Precomputed area of the abnormality.
    patch_size: Size of the patch to extract.
    number_of_patches: Number of patches to sample around the abnormality ROI.
    min_overlap_threshold: Minimum relative area of the patch overlapping with
      the abnormality.
    max_number_of_trials_per_threshold: Maximum number of random samples to try
      before reducing the `min_overlap_threshold` by 5%.

  Yields:
    The patch cropped from the input image.
  r   皙?r>   r   zThe sampling region for patches of size %r with min_overlap_threshold=%f contains less possible patches than max_number_of_trials_per_threshold=%d, in abnormality %sNffffff?zrOverlapping constraints relaxed to min_overlap_threshold=%f while sampling positive patches for the abnormality %szOnly %d positive patches of size %r could be sampled satisfying the current conditions (min. relative overlapping area = %f) for the abnormality %s)r   r   r  r  r.  boundingRectr  minr   r?   r   debugranger   r   randintr8  r5   )rI   abnormality_filepathr   r   r   number_of_patchesr1  "max_number_of_trials_per_thresholdr  abnormality_roiabnorm_xabnorm_yabnorm_wabnorm_hnumber_of_yielded_patchesmax_hmin_hmax_wmin_wmin_ymin_xmax_ymax_xeffective_range_sizer   patch_ypatch_xr   r   r   r     sf   
"


""
-r         ?ffffff?c	                 #   sX   t jjj}	t|   fdd}
t }|	|\}}}}d}dkr!|dk r!t|d t|d }}t|d t|d }}|t	d |  }|t	d |  }|| t	|  }|| t	|  }t|d}t|d}tt|| j
d d  d |}tt|| j
d d  d |}|}|| d || d  |k rtd|| || d || d  }t|D ]A}tj||d }tj||d }|
||rt|||||s|d7 }| ||d  ||d  f V  ||kr d	S qƈd
 |d }td|| dkr!|dk s+td|||f )a  Sample background patches from the image.

  The relative area of breast tissue in the patch must be, at least,
  `min_breast_overlap_threshold` of the total patch area. This is to prevent
  too easy negative examples.

  Similarly, the relative area of the abnormal tissue in the patch must be,
  at most, `max_abnorm_overlap_threshold`

  The relative area of the patch must overlap with the breast tissue with,
  at least, `min_breast_overlap_threshold` (relative) pixels.
  In addition, it must also overlap with abnormal tissue with, at most,
  `max_abnorm_overlap_threshold` (relative) pixels.

  Args:
    image: Image to patch from.
    image_filepath: Only used for logging.
    abnormalities_masks: List of binary mask of each abnormality in the image.
    abnormalities_areas: List of precomputed area of each abnormality.
    patch_size: Size of the patch to extract.
    number_of_patches: Number of negative patches to sample from the image.
    min_breast_overlap_threshold: Minimum (relative) number of breast pixels in
      the patch.
    max_abnorm_overlap_threshold: Maximum (relative) number of abnormal pixels
      in the patch.
    max_number_of_trials_per_threshold: Maximum number of random samples to try
      before reducing the `min_breast_overlap_threshold` by 5% and increasing
      the `max_abnorm_overlap_threshold` by 5%.

  Yields:
    The patch cropped from the input image.
  c                    sF    | | d  ||d  f }t |dkd d   kS )z7Return True if the patch contains enough breast pixels.r   r>   r   )r/  r0  breast_in_patchbreast_maskmin_breast_overlap_thresholdr   r   r   $patch_overlapping_breast_is_feasible$  s   $zF_sample_negative_patches.<locals>.patch_overlapping_breast_is_feasibler   r;  r9  r>   r   zThe sampling region for negative patches of size %r with min_breast_overlap_threshold=%f contains less possible patches than max_number_of_trials_per_threshold=%d, in mammography %sNr<  g?zOverlapping constraints relaxed to min_breast_overlap_threshold=%f and max_abnorm_overlap_threshold=%f while sampling negative patches for the mammography %szOnly %d negative patches of size %r could be sampled satisfying the current conditions (min. relative overlapping area with breast = %f, max. relative overlapping area with abnormalities = %f) for the mammography %s)r   r   r  r  r-  r.  r=  r  r>  r   r?   r   r?  r@  r   r   rA  r8  r5   )rI   image_filepathr   r   r   rC  r[  max_abnorm_overlap_thresholdrD  r  r\  
breast_roibreast_xbreast_ybreast_wbreast_hrJ  rK  rL  rM  rN  rO  rP  rQ  rR  rS  r   rT  rU  r   rY  r   r     sx   
)



""


0r   )r   r   r   )N)r  )r   r9  r:  )r   rV  rW  r:  )0r!   
__future__r   r   r   r   rc   reabslr   numpyr   tensorflow.compat.v2compatv2rS   tensorflow_datasets.public_api
public_apir   r8   r9   rz   r{   r|   r}   rQ   rO   _BREAST_DENSITY_NUM_CLASSESrV   rU   rW   compiler   r   BuilderConfigr   GeneratorBasedBuilderr#   r   r   r   r   r   r-  r.  r8  r   r   r   r   r   r   <module>   sd   '  EV


	)
m