From 7942e75fa8a2ea5079008c154ea113906399a985 Mon Sep 17 00:00:00 2001 From: nanli-emory <40213692+nanli-emory@users.noreply.github.com> Date: Thu, 15 Aug 2024 17:08:37 -0400 Subject: [PATCH 1/5] add `params` parameter at second position in BasicModule.countTissuePieces --- histoqc/BasicModule.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/histoqc/BasicModule.py b/histoqc/BasicModule.py index e426a0f..335c1d6 100644 --- a/histoqc/BasicModule.py +++ b/histoqc/BasicModule.py @@ -71,7 +71,7 @@ def finalProcessingArea(s, params): f"After BasicModule.finalProcessingArea NO tissue remains detectable! Downstream modules likely to be incorrect/fail") -def countTissuePieces(s): +def countTissuePieces(s, params): mask = s["img_mask_use"] stats = getMaskRegionsStats(mask) - s.addToPrintList("#pieces_of_tissue", str(stats.get('num', 0))) \ No newline at end of file + s.addToPrintList("#pieces_of_tissue", str(stats.get('num', 0))) From f43ce5e3cf8ac99a61c19f8e8ec8bba1fcc07e60 Mon Sep 17 00:00:00 2001 From: nanli-emory <40213692+nanli-emory@users.noreply.github.com> Date: Fri, 16 Aug 2024 15:45:41 -0400 Subject: [PATCH 2/5] Create data folder in tests --- histoqc/tests/data | 1 + 1 file changed, 1 insertion(+) create mode 100644 histoqc/tests/data diff --git a/histoqc/tests/data b/histoqc/tests/data new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/histoqc/tests/data @@ -0,0 +1 @@ + From a17b08ac1ad51ca06b6a5f49ec96c4ec707bb6a9 Mon Sep 17 00:00:00 2001 From: nanli-emory <40213692+nanli-emory@users.noreply.github.com> Date: Fri, 16 Aug 2024 15:46:33 -0400 Subject: [PATCH 3/5] Delete histoqc/tests/data --- histoqc/tests/data | 1 - 1 file changed, 1 deletion(-) delete mode 100644 histoqc/tests/data diff --git a/histoqc/tests/data b/histoqc/tests/data deleted file mode 100644 index 8b13789..0000000 --- a/histoqc/tests/data +++ /dev/null @@ -1 +0,0 @@ - From d002b2db2b02b8e3a2010c878dda5c19bcfa4ad5 Mon Sep 17 00:00:00 2001 From: nanli-emory Date: Fri, 16 Aug 2024 16:05:26 -0400 Subject: [PATCH 4/5] update test code to include BasicModule.countTissuePieces test case --- histoqc/SaveModule.py | 2 +- histoqc/tests/target/results.tsv | 6 +++--- histoqc/tests/test_images_tsv_results.py | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/histoqc/SaveModule.py b/histoqc/SaveModule.py index 627f8ca..a831ad3 100644 --- a/histoqc/SaveModule.py +++ b/histoqc/SaveModule.py @@ -37,7 +37,7 @@ def saveFinalMask(s, params): def saveAssociatedImage(s, key:str, dim:int): - logging.info(f"{s['filename']} - \tsave{key.capitalize()}") + logging.info(f"{s['filename']}- save{key.capitalize()}") osh = s["os_handle"] if not key in osh.associated_images: diff --git a/histoqc/tests/target/results.tsv b/histoqc/tests/target/results.tsv index 544d9fc..b75c8a3 100644 --- a/histoqc/tests/target/results.tsv +++ b/histoqc/tests/target/results.tsv @@ -1,7 +1,7 @@ #start_time: 2023-12-06 11:00:41.788659 -#pipeline: BasicModule.getBasicStats LightDarkModule.saveEqualisedImage LightDarkModule.minimumPixelIntensityNeighborhoodFiltering LightDarkModule.getIntensityThresholdPercent:darktissue BubbleRegionByRegion.detectSmoothness MorphologyModule.removeFatlikeTissue MorphologyModule.fillSmallHoles MorphologyModule.removeSmallObjects LocalTextureEstimationModule.estimateGreyComatrixFeatures:background BrightContrastModule.getContrast:background BrightContrastModule.getBrightnessGray:background BrightContrastModule.getBrightnessByChannelinColorSpace:RGB_background BlurDetectionModule.identifyBlurryRegions BasicModule.finalProcessingSpur BasicModule.finalProcessingArea HistogramModule.compareToTemplates HistogramModule.getHistogram LocalTextureEstimationModule.estimateGreyComatrixFeatures:final BrightContrastModule.getContrast BrightContrastModule.getBrightnessGray BrightContrastModule.getBrightnessByChannelinColorSpace:RGB BrightContrastModule.getBrightnessByChannelinColorSpace:YUV DeconvolutionModule.separateStains SaveModule.saveFinalMask SaveModule.saveMacro SaveModule.saveThumbnails BasicModule.finalComputations +#pipeline: BasicModule.getBasicStats LightDarkModule.saveEqualisedImage LightDarkModule.minimumPixelIntensityNeighborhoodFiltering LightDarkModule.getIntensityThresholdPercent:darktissue BubbleRegionByRegion.detectSmoothness MorphologyModule.removeFatlikeTissue MorphologyModule.fillSmallHoles MorphologyModule.removeSmallObjects LocalTextureEstimationModule.estimateGreyComatrixFeatures:background BrightContrastModule.getContrast:background BrightContrastModule.getBrightnessGray:background BrightContrastModule.getBrightnessByChannelinColorSpace:RGB_background BlurDetectionModule.identifyBlurryRegions BasicModule.finalProcessingSpur BasicModule.finalProcessingArea HistogramModule.compareToTemplates HistogramModule.getHistogram LocalTextureEstimationModule.estimateGreyComatrixFeatures:final BrightContrastModule.getContrast BrightContrastModule.getBrightnessGray BrightContrastModule.getBrightnessByChannelinColorSpace:RGB BrightContrastModule.getBrightnessByChannelinColorSpace:YUV DeconvolutionModule.separateStains SaveModule.saveFinalMask SaveModule.saveMacro SaveModule.saveThumbnails BasicModule.countTissuePieces BasicModule.finalComputations #outdir: /Users/nanli/Documents/github/HistoQC/histoqc/tests/new #config_file: /Users/nanli/Documents/github/HistoQC/histoqc/config/config_v2.1.ini #command_line_args: -c ./histoqc/config/config_v2.1.ini -o ./histoqc/tests/new -s 123 ./histoqc/tests/data/TCGA-EJ-5509-01A-01-BS1_ROI.svs -#dataset:filename comments image_bounding_box base_mag type levels height width mpp_x mpp_y comment brightestPixels dark flat_areas fatlike_tissue_removed_num_regions fatlike_tissue_removed_mean_area fatlike_tissue_removed_max_area fatlike_tissue_removed_percent small_tissue_filled_num_regions small_tissue_filled_mean_area small_tissue_filled_max_area small_tissue_filled_percent small_tissue_removed_num_regions small_tissue_removed_mean_area small_tissue_removed_max_area small_tissue_removed_percent background_contrast background_contrast_std background_dissimilarity background_dissimilarity_std background_homogeneity background_homogeneity_std background_ASM background_ASM_std background_energy background_energy_std background_correlation background_correlation_std background_tenenGrad_contrast background_michelson_contrast background_rms_contrast background_grayscale_brightness background_grayscale_brightness_std background_chan1_brightness background_chan1_brightness_std background_chan2_brightness background_chan2_brightness_std background_chan3_brightness background_chan3_brightness_std blurry_removed_num_regions blurry_removed_mean_area blurry_removed_max_area blurry_removed_percent spur_pixels areaThresh template1_MSE_hist template2_MSE_hist template3_MSE_hist template4_MSE_hist final_contrast final_contrast_std final_dissimilarity final_dissimilarity_std final_homogeneity final_homogeneity_std final_ASM final_ASM_std final_energy final_energy_std final_correlation final_correlation_std tenenGrad_contrast michelson_contrast rms_contrast grayscale_brightness grayscale_brightness_std chan1_brightness chan1_brightness_std chan2_brightness chan2_brightness_std chan3_brightness chan3_brightness_std chan1_brightness_YUV chan1_brightness_std_YUV chan2_brightness_YUV chan2_brightness_std_YUV chan3_brightness_YUV chan3_brightness_std_YUV deconv_c0_mean deconv_c0_std deconv_c1_mean deconv_c1_std deconv_c2_mean deconv_c2_std pixels_to_use warnings -TCGA-EJ-5509-01A-01-BS1_ROI.svs (0, 0, 4092, 4092) 20.0 aperio 1 4092 4092 0.50149999999999995 0.50149999999999995 Aperio Fake |AppMag = 20|MPP = 0.5015 0.2487945556640625 0.0063374702931080495 0.006582309532083608 0 0 0 0.0 165 1.8909090909090909 15 -0.006420149391937802 1 10.0 10 0.00020446134658247406 1.0098250225817402 1.6726571860607253 0.2528666764200787 0.4252018475618517 0.9337698968400423 0.1142845916582232 0.8404324661847189 0.2749993733706908 0.897567529038673 0.18656097394720528 0.5999317010355991 0.4234307078840679 9.538838020360488e-06 0.9268259509452782 0.18247882870888657 0.9186934437180535 0.005377040601787484 235.76269760173108 1.3349606666359373 233.56590731502072 1.473921948906114 236.81282683176053 0.9182862023596723 3 1744.6666666666667 4915 0.10703695372093502 0.0 0.0 0.0005713989005378889 0.00210218250820665 0.00037149510237524463 0.0022534729516800454 2.4557276884185666 1.068922962978307 1.1239287111502159 0.3038952269197558 0.529846271258571 0.10999022358426115 0.08367593565359072 0.02877052817684292 0.28140090494640624 0.06700348012554541 0.05568572651126721 0.19289829129121416 0.0007475161992457143 0.9268259509452782 0.16339142134781473 0.48661575224918774 0.16339142134781473 164.30908049925569 34.5809331872731 109.32547807168213 45.571779037831845 152.00957288446125 33.74422284266695 0.5122806353183663 0.1569209423864019 0.04125629187087427 0.017144963702879386 0.11586162500617757 0.04980135461685613 0.03480984437371579 0.020603328666024174 0.02379815335291759 0.01340663580142446 0.03387246974681185 0.014160677538799784 43665 |TCGA-EJ-5509-01A-01-BS1_ROI.svs- saveMacro Can't Read 'macro' Image from Slide's Associated Images +#dataset:filename comments image_bounding_box base_mag type levels height width mpp_x mpp_y comment brightestPixels dark flat_areas fatlike_tissue_removed_num_regions fatlike_tissue_removed_mean_area fatlike_tissue_removed_max_area fatlike_tissue_removed_percent small_tissue_filled_num_regions small_tissue_filled_mean_area small_tissue_filled_max_area small_tissue_filled_percent small_tissue_removed_num_regions small_tissue_removed_mean_area small_tissue_removed_max_area small_tissue_removed_percent background_contrast background_contrast_std background_dissimilarity background_dissimilarity_std background_homogeneity background_homogeneity_std background_ASM background_ASM_std background_energy background_energy_std background_correlation background_correlation_std background_tenenGrad_contrast background_michelson_contrast background_rms_contrast background_grayscale_brightness background_grayscale_brightness_std background_chan1_brightness background_chan1_brightness_std background_chan2_brightness background_chan2_brightness_std background_chan3_brightness background_chan3_brightness_std blurry_removed_num_regions blurry_removed_mean_area blurry_removed_max_area blurry_removed_percent spur_pixels areaThresh template1_MSE_hist template2_MSE_hist template3_MSE_hist template4_MSE_hist final_contrast final_contrast_std final_dissimilarity final_dissimilarity_std final_homogeneity final_homogeneity_std final_ASM final_ASM_std final_energy final_energy_std final_correlation final_correlation_std tenenGrad_contrast michelson_contrast rms_contrast grayscale_brightness grayscale_brightness_std chan1_brightness chan1_brightness_std chan2_brightness chan2_brightness_std chan3_brightness chan3_brightness_std chan1_brightness_YUV chan1_brightness_std_YUV chan2_brightness_YUV chan2_brightness_std_YUV chan3_brightness_YUV chan3_brightness_std_YUV deconv_c0_mean deconv_c0_std deconv_c1_mean deconv_c1_std deconv_c2_mean deconv_c2_std #pieces_of_tissue pixels_to_use warnings +TCGA-EJ-5509-01A-01-BS1_ROI.svs (0, 0, 4092, 4092) 20.0 aperio 1 4092 4092 0.50149999999999995 0.50149999999999995 Aperio Fake |AppMag = 20|MPP = 0.5015 0.2487945556640625 0.0063374702931080495 0.006582309532083608 0 0 0 0.0 165 1.8909090909090909 15 -0.006420149391937802 1 10.0 10 0.00020446134658247406 1.0098250225817402 1.6726571860607253 0.2528666764200787 0.4252018475618517 0.9337698968400423 0.1142845916582232 0.8404324661847189 0.2749993733706908 0.897567529038673 0.18656097394720528 0.5999317010355991 0.4234307078840679 9.538838020360488e-06 0.9268259509452782 0.18247882870888657 0.9186934437180535 0.005377040601787484 235.76269760173108 1.3349606666359373 233.56590731502072 1.473921948906114 236.81282683176053 0.9182862023596723 3 1744.6666666666667 4915 0.10703695372093502 0.0 0.0 0.0005713989005378889 0.00210218250820665 0.00037149510237524463 0.0022534729516800454 2.4557276884185666 1.068922962978307 1.1239287111502159 0.3038952269197558 0.529846271258571 0.10999022358426115 0.08367593565359072 0.02877052817684292 0.28140090494640624 0.06700348012554541 0.05568572651126721 0.19289829129121416 0.0007475161992457143 0.9268259509452782 0.16339142134781473 0.48661575224918774 0.16339142134781473 164.30908049925569 34.5809331872731 109.32547807168213 45.571779037831845 152.00957288446125 33.74422284266695 0.5122806353183663 0.1569209423864019 0.04125629187087427 0.017144963702879386 0.11586162500617757 0.04980135461685613 0.03480984437371579 0.020603328666024174 0.02379815335291759 0.01340663580142446 0.03387246974681185 0.014160677538799784 1 43665 |TCGA-EJ-5509-01A-01-BS1_ROI.svs- saveMacro Can't Read 'macro' Image from Slide's Associated Images diff --git a/histoqc/tests/test_images_tsv_results.py b/histoqc/tests/test_images_tsv_results.py index db3af47..3d56be3 100644 --- a/histoqc/tests/test_images_tsv_results.py +++ b/histoqc/tests/test_images_tsv_results.py @@ -89,10 +89,10 @@ def setUp(self): # tsv self.rs_name = "results.tsv" - # tsv_labels #### '#start_time:', - self.tsv_labels = ['#pipeline:', '#outdir:', '#command_line_args:', '#config_file:', '#dataset:'] + # tsv_labels #### '#start_time:', '#outdir:', '#config_file:', + self.tsv_labels = ['#pipeline:', '#command_line_args:', '#dataset:'] # tsv dataset fields - self.tsv_dataset_fields = ['filename','comments','image_bounding_box','base_mag','type','levels','height','width','mpp_x','mpp_y','comment','brightestPixels','dark','flat_areas','fatlike_tissue_removed_num_regions','fatlike_tissue_removed_mean_area','fatlike_tissue_removed_max_area','fatlike_tissue_removed_percent','small_tissue_filled_num_regions','small_tissue_filled_mean_area','small_tissue_filled_max_area','small_tissue_filled_percent','small_tissue_removed_num_regions','small_tissue_removed_mean_area','small_tissue_removed_max_area','small_tissue_removed_percent','background_contrast','background_contrast_std','background_dissimilarity','background_dissimilarity_std','background_homogeneity','background_homogeneity_std','background_ASM','background_ASM_std','background_energy','background_energy_std','background_correlation','background_correlation_std','background_tenenGrad_contrast','background_michelson_contrast','background_rms_contrast','background_grayscale_brightness','background_grayscale_brightness_std','background_chan1_brightness','background_chan1_brightness_std','background_chan2_brightness','background_chan2_brightness_std','background_chan3_brightness','background_chan3_brightness_std','blurry_removed_num_regions','blurry_removed_mean_area','blurry_removed_max_area','blurry_removed_percent','spur_pixels','areaThresh','template1_MSE_hist','template2_MSE_hist','template3_MSE_hist','template4_MSE_hist','final_contrast','final_contrast_std','final_dissimilarity','final_dissimilarity_std','final_homogeneity','final_homogeneity_std','final_ASM','final_ASM_std','final_energy','final_energy_std','final_correlation','final_correlation_std','tenenGrad_contrast','michelson_contrast','rms_contrast','grayscale_brightness','grayscale_brightness_std','chan1_brightness','chan1_brightness_std','chan2_brightness','chan2_brightness_std','chan3_brightness','chan3_brightness_std','chan1_brightness_YUV','chan1_brightness_std_YUV','chan2_brightness_YUV','chan2_brightness_std_YUV','chan3_brightness_YUV','chan3_brightness_std_YUV','deconv_c0_mean','deconv_c0_std','deconv_c1_mean','deconv_c1_std','deconv_c2_mean','deconv_c2_std','pixels_to_use','warnings'] + self.tsv_dataset_fields = ['filename','comments','image_bounding_box','base_mag','type','levels','height','width','mpp_x','mpp_y','comment','brightestPixels','dark','flat_areas','fatlike_tissue_removed_num_regions','fatlike_tissue_removed_mean_area','fatlike_tissue_removed_max_area','fatlike_tissue_removed_percent','small_tissue_filled_num_regions','small_tissue_filled_mean_area','small_tissue_filled_max_area','small_tissue_filled_percent','small_tissue_removed_num_regions','small_tissue_removed_mean_area','small_tissue_removed_max_area','small_tissue_removed_percent','background_contrast','background_contrast_std','background_dissimilarity','background_dissimilarity_std','background_homogeneity','background_homogeneity_std','background_ASM','background_ASM_std','background_energy','background_energy_std','background_correlation','background_correlation_std','background_tenenGrad_contrast','background_michelson_contrast','background_rms_contrast','background_grayscale_brightness','background_grayscale_brightness_std','background_chan1_brightness','background_chan1_brightness_std','background_chan2_brightness','background_chan2_brightness_std','background_chan3_brightness','background_chan3_brightness_std','blurry_removed_num_regions','blurry_removed_mean_area','blurry_removed_max_area','blurry_removed_percent','spur_pixels','areaThresh','template1_MSE_hist','template2_MSE_hist','template3_MSE_hist','template4_MSE_hist','final_contrast','final_contrast_std','final_dissimilarity','final_dissimilarity_std','final_homogeneity','final_homogeneity_std','final_ASM','final_ASM_std','final_energy','final_energy_std','final_correlation','final_correlation_std','tenenGrad_contrast','michelson_contrast','rms_contrast','grayscale_brightness','grayscale_brightness_std','chan1_brightness','chan1_brightness_std','chan2_brightness','chan2_brightness_std','chan3_brightness','chan3_brightness_std','chan1_brightness_YUV','chan1_brightness_std_YUV','chan2_brightness_YUV','chan2_brightness_std_YUV','chan3_brightness_YUV','chan3_brightness_std_YUV','deconv_c0_mean','deconv_c0_std','deconv_c1_mean','deconv_c1_std','deconv_c2_mean','deconv_c2_std','#pieces_of_tissue','pixels_to_use','warnings'] def tearDown(self): del self.suffixes From 808908a104b210473d2ff2354e2084131adfda9b Mon Sep 17 00:00:00 2001 From: nanli-emory Date: Thu, 22 Aug 2024 10:19:47 -0400 Subject: [PATCH 5/5] add the upated coverage.xml for test report --- histoqc/tests/coverage.xml | 1876 ++++++++++++++++++------------------ 1 file changed, 927 insertions(+), 949 deletions(-) diff --git a/histoqc/tests/coverage.xml b/histoqc/tests/coverage.xml index 99bdf26..beb3109 100644 --- a/histoqc/tests/coverage.xml +++ b/histoqc/tests/coverage.xml @@ -1,12 +1,12 @@ - - + + - /Users/nanli/Documents/github/HistoQC/histoqc + /home/nli31/github/nanli-emory/HistoQC/histoqc - + @@ -95,7 +95,7 @@ - + @@ -107,6 +107,7 @@ + @@ -229,86 +230,96 @@ - - + - - - + + + - - + + - - + + - + - + - + - + - + - + - + - - + + - + - - + + - - - + + + - + - + - - - + + + - - + + - + + + + + + + + + + + + - + @@ -343,8 +354,8 @@ - - + + @@ -356,11 +367,15 @@ - - + + + + + + - + @@ -386,24 +401,18 @@ - - - - - - - - + - - + + - - + + + - + @@ -424,7 +433,7 @@ - + @@ -447,7 +456,7 @@ - + @@ -466,12 +475,12 @@ - - - - - - + + + + + + @@ -565,27 +574,27 @@ - + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + @@ -612,26 +621,26 @@ - - - - - - + + + + + + - + - + - + @@ -651,93 +660,93 @@ - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + - + @@ -766,13 +775,13 @@ - - - - - - - + + + + + + + @@ -795,7 +804,7 @@ - + @@ -843,9 +852,9 @@ - - - + + + @@ -962,7 +971,7 @@ - + @@ -987,22 +996,27 @@ - - - + + + + - + + - - + + + + + - + @@ -1022,87 +1036,189 @@ - - - - - - - - - - - + + + + - - - - - - + + + + - + + - - + - + + - - + - + - - - - - - - - - + + + - - - + + - - - - + + + - - + - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -1125,7 +1241,7 @@ - + @@ -1140,16 +1256,16 @@ - - - - - + + + + + - - - + + + @@ -1171,245 +1287,245 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1419,7 +1535,7 @@ - + @@ -1460,93 +1576,94 @@ - + - + - - + + - + - - + + - + - + - - + + - - - + + + - + - - - + + + - + - + - - - + + + - + - - - - - - - - - + + + + + + + + - - + + - - - - - - - - - + + + + + + + + + - - - + + + - + + - + + - + @@ -1596,32 +1713,32 @@ - - - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + @@ -1632,154 +1749,156 @@ - - - - - - + + + + - - - - + + + + - + - + - + - + - + - + - + - + - + - - - + + + - + - - + + - - - - + + + + - - - + + + - + - - + + - - + + - - + + - - - - + + + + - + - + - + - + - - + + + - + + - - + + + - - - - - - + + + + + + - + - - + + - + - - + + - - - - + + + + - - - + + + - - - - - - + + + + + + + @@ -2106,9 +2225,9 @@ - + - + @@ -2116,59 +2235,59 @@ - - - - - - + + + + + + - - - - + + + + - + - - - - - - + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - + - + @@ -2232,10 +2351,10 @@ - - - - + + + + @@ -2262,47 +2381,47 @@ - + - - - - - - + + + + + + - - - - - - - - - - + + + + + + + + + + - + - + - - - - - - - + + + + + + + @@ -2318,21 +2437,21 @@ - + - - - - - + + + + + - + - + @@ -2342,23 +2461,23 @@ - - - - - - - - - - - - - + + + + + + + + + + + + + - + @@ -2391,43 +2510,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -2501,128 +2583,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -2652,86 +2612,104 @@ - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + - - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - + + + + + + + + +