#!/usr/bin/env python

import os
import re
import sys
import logging
import optparse
import subprocess
import traceback

# Initialize logging object
logger = logging.getLogger()

# Use pegasus-config to find our lib path
bin_dir = os.path.normpath(os.path.join(os.path.dirname(sys.argv[0])))
pegasus_config = os.path.join(bin_dir, "pegasus-config") + " --noeoln --python"
lib_dir = subprocess.Popen(pegasus_config, stdout=subprocess.PIPE, shell=True).communicate()[0]
pegasus_config = os.path.join(bin_dir, "pegasus-config") + " --noeoln --python-externals"
lib_ext_dir = subprocess.Popen(pegasus_config, stdout=subprocess.PIPE, shell=True).communicate()[0]

# Insert this directory in our search path
os.sys.path.insert(0, lib_ext_dir)
os.sys.path.insert(0, lib_dir)

import Pegasus.common

from Pegasus.tools import utils
from Pegasus.tools import db_utils
from Pegasus.plots_stats import utils as stats_utils
from netlogger.analysis.workflow.stampede_statistics import StampedeStatistics
from netlogger.analysis.schema.schema_check import SchemaVersionError

# Regular expressions
re_parse_property = re.compile(r'([^:= \t]+)\s*[:=]?\s*(.*)')

# Global variables
prog_base = os.path.split(sys.argv[0])[1]	# Name of this program

workflow_summary_file_name = "summary"
workflow_summary_time_file_name = "summary-time"
workflow_statistics_file_name = "workflow"
job_statistics_file_name = "jobs"
logical_transformation_statistics_file_name = "breakdown"
time_statistics_file_name = "time"
time_statistics_per_host_file_name = "time-per-host"
text_file_extension = ".txt"
csv_file_extension = ".csv"
calc_wf_stats = False
calc_wf_summary = False
calc_jb_stats = False
calc_tf_stats = False
calc_ti_stats = False
time_filter = None
NEW_LINE_STR ="\n"
DEFAULT_OUTPUT_DIR = "statistics"

# Transformations file column names
transformation_stats_col_name_text = ["Transformation", "Count", "Succeeded", "Failed", "Min", "Max", "Mean", "Total"]
transformation_stats_col_name_csv = ["Workflow_Id", "Dax_Label", "Transformation", "Count", "Succeeded", "Failed", "Min", "Max", "Mean", "Total"]
transformation_stats_col_size = [60, 12, 12, 12, 20, 20, 20, 12]

# Jobs file column names
job_stats_col_name_text = ['#Job', 'Try', 'Site', 'Kickstart', 'Mult', 'Kickstart-Mult', 'CPU-Time', 'Post', 'CondorQTime', 'Resource', 'Runtime', 'Seqexec', 'Seqexec-Delay', 'Exitcode', 'Hostname']
job_stats_col_name_csv = ['Workflow_Id', 'Dax_Label', 'Job', 'Try', 'Site', 'Kickstart', 'Mult', 'Kickstart-Mult', 'CPU-Time', 'Post', 'CondorQTime', 'Resource', 'Runtime', 'Seqexec', 'Seqexec-Delay', 'Exitcode', 'Hostname']
job_stats_col_size = [60, 4, 15, 12, 6, 16, 12, 12, 12, 12, 12, 12, 15, 10, 30]

# Summary file column names
workflow_summary_col_name_csv = ["Type", "Succeeded", "Failed", "Incomplete", "Total", "Retries", "Total_Run)"]
workflow_summary_col_name_text = ["Type", "Succeeded", "Failed", "Incomplete", "Total", " ", "Retries", "Total Run (Retries Included)"]
workflow_summary_col_size = [20, 20, 20, 20, 20, 5, 20, 20]
workflow_time_summary_col_name_csv = ["Stat_Type", "time_seconds"]

# Workflow file column names
workflow_status_col_name_text = ["#", "Type", "Succeeded", "Failed", "Incomplete", "Total", " ",
                                   "Retries", "Total Run (Retries Included)", "Workflow Retries"]
workflow_status_col_name_csv = ["Workflow_Id", "Dax_Label", "Type", "Succeeded", "Failed", "Incomplete",
                                "Total", "Retries", "Total_Run", "Workflow_Retries"]
workflow_status_col_size = [40, 15, 12, 12, 12, 12, 5, 12, 30, 18]

# Time file column names
time_stats_col_name_csv = ["Stat_Type", "Date", "Count", "Runtime"]
time_stats_col_name_text = ["Date", "Count", "Runtime"]
time_stats_col_size = [30, 20, 20]
time_host_stats_col_name_csv = ["Stat_Type", "Date", "Host", "Count", "Runtime(sec)"]
time_host_stats_col_name_text = ["Date", "Host", "Count", "Runtime (sec)"]
time_host_stats_col_size = [30, 80, 20, 20]

class JobStatistics:
	def __init__(self):
		self.name = None
		self.site = None
		self.kickstart = None
                self.multiplier_factor = None
                self.kickstart_mult = None
                self.remote_cpu_time = None
		self.post = None
		self.condor_delay = None
		self.resource = None
		self.runtime = None
		self.condorQlen =None
		self.seqexec = None
		self.seqexec_delay = None
		self.retry_count = 0
                self.exitcode = None
                self.hostname = None
	
	def getFormattedJobStatistics(self, output_format):
		"""
		Returns the formatted job statistics information  
		@return:    formatted job statistics information
		"""
		formatted_job_stats = [self.name]
                if output_format == "text":
                        formatted_job_stats.append(" " + str(self.retry_count))
                else:
                        formatted_job_stats.append(str(self.retry_count))
		if self.site is None:
			formatted_job_stats.append('-')
		else:
			formatted_job_stats.append(self.site)
		formatted_job_stats.append(round_to_str(self.kickstart))
                formatted_job_stats.append(str(self.multiplier_factor))
                formatted_job_stats.append(round_to_str(self.kickstart_mult))
                if self.remote_cpu_time is None:
			formatted_job_stats.append('-')
                else:
                        formatted_job_stats.append(round_to_str(self.remote_cpu_time))
		formatted_job_stats.append(round_to_str(self.post))
		formatted_job_stats.append(round_to_str(self.condor_delay))
		formatted_job_stats.append(round_to_str(self.resource))
		formatted_job_stats.append(round_to_str(self.runtime))
		formatted_job_stats.append(round_to_str(self.seqexec))
		formatted_job_stats.append(round_to_str(self.seqexec_delay))
                formatted_job_stats.append(str(self.exitcode))
                formatted_job_stats.append(self.hostname)

		return formatted_job_stats

def setup_logger(level_str):
	"""
	Sets the logging level  
	@param level_str:  logging level
	"""
	level_str = level_str.lower()
	if level_str == "debug":
		logger.setLevel(logging.DEBUG)
	if level_str == "warning":
		logger.setLevel(logging.WARNING)
	if level_str == "error":
		logger.setLevel(logging.ERROR)
	if level_str == "info":
		logger.setLevel(logging.INFO)
	return

def formatted_wf_summary_legends_part1():
	"""
	Returns the first part of the workflow summary legend  
	@return :  workflow summary legend
	"""
        formatted_wf_statistics_legend = ""
	formatted_wf_statistics_legend += """
# Workflow summary:
#               Summary of the workflow execution. It shows total
#		tasks/jobs/sub workflows run, how many succeeded/failed etc.
#		In case of hierarchical workflow the calculation shows the 
#		statistics across all the sub workflows.It shows the following 
#		statistics about tasks, jobs and sub workflows.
#		* Succeeded - total count of succeeded tasks/jobs/sub workflows.
#		* Failed - total count of failed tasks/jobs/sub workflows.
#		* Incomplete - total count of tasks/jobs/sub workflows that are 
#		  not in succeeded or failed state. This includes all the jobs 
#		  that are not submitted, submitted but not completed etc. This  
#		  is calculated as  difference between 'total' count and sum of 
#		  'succeeded' and 'failed' count.
#		* Total - total count of tasks/jobs/sub workflows.
#		* Retries - total retry count of tasks/jobs/sub workflows.
#		* Total Run - total count of tasks/jobs/sub workflows executed 
#		  during workflow run. This is the cumulative of retries, 
#		  succeeded and failed count. 
"""
        return formatted_wf_statistics_legend

def formatted_wf_summary_legends_part2():
	"""
	Returns the second part of the workflow summary legend  
	@return :  workflow summary legend
	"""
        formatted_wf_statistics_legend = ""
	formatted_wf_statistics_legend += """
# Workflow wall time:
#               The walltime from the start of the workflow execution
#		to the end as reported by the DAGMAN.In case of rescue dag the value
#		is the cumulative of all retries.
"""
	formatted_wf_statistics_legend += """
# Workflow cumulative job wall time:
#               The sum of the walltime of all jobs as reported by kickstart. 
#		In case of job retries the value is the cumulative of all retries.
#		For workflows having sub workflow jobs (i.e SUBDAG and SUBDAX jobs),
#		the walltime value includes jobs from the sub workflows as well.
"""
	formatted_wf_statistics_legend += """
# Cumulative job walltime as seen from submit side:
#               The sum of the walltime of all jobs as reported by DAGMan.
#		This is similar to the regular cumulative job walltime, but includes
#		job management overhead and delays. In case of job retries the value is
#		the cumulative of all retries. For workflows having sub workflow jobs 
#		(i.e SUBDAG and SUBDAX jobs), the walltime value includes jobs
#		from the sub workflows as well.
"""
	return formatted_wf_statistics_legend

def formatted_wf_summary_legends_txt():
	"""
	Returns the complete workflow summary legend  
	@return :  workflow summary legend
	"""
	formatted_wf_statistics_legend ="# legends\n"
        formatted_wf_statistics_legend += formatted_wf_summary_legends_part1()
        formatted_wf_statistics_legend += formatted_wf_summary_legends_part2()

	return formatted_wf_statistics_legend

def formatted_wf_summary_legends_csv1():
	"""
	Returns the workflow summary legend for the first summary csv file
	@return :  workflow summary legend
	"""
	formatted_wf_statistics_legend ="# legends\n"
        formatted_wf_statistics_legend += formatted_wf_summary_legends_part1()

	return formatted_wf_statistics_legend

def formatted_wf_summary_legends_csv2():
	"""
	Returns the workflow summary legend for the second summary csv file
	@return :  workflow summary legend
	"""
	formatted_wf_statistics_legend ="# legends\n"
        formatted_wf_statistics_legend += formatted_wf_summary_legends_part2()

	return formatted_wf_statistics_legend

def formatted_wf_status_legends():
	"""
	Returns the workflow table legend
	@return :  workflow table legend
	"""
	formatted_wf_statistics_legend ="# legends\n"
	
	formatted_wf_statistics_legend +="""
#Workflow summary - Summary of the workflow execution. It shows total
#		tasks/jobs/sub workflows run, how many succeeded/failed etc.
#		In case of hierarchical workflow the calculation shows the 
#		statistics of each individual sub workflow.The file also 
#		contains a 'Total' table at the bottom which is the cummulative 
#		of all the individual statistics details.t shows the following 
#		statistics about tasks, jobs and sub workflows.
#
#		* Workflow Retries - number of times a workflow was retried.
#		* Succeeded - total count of succeeded tasks/jobs/sub workflows.
#		* Failed - total count of failed tasks/jobs/sub workflows.
#		* Incomplete - total count of tasks/jobs/sub workflows that are 
#		  not in succeeded or failed state. This includes all the jobs 
#		  that are not submitted, submitted but not completed etc. This  
#		  is calculated as  difference between 'total' count and sum of 
#		  'succeeded' and 'failed' count.
#		* Total - total count of tasks/jobs/sub workflows.
#		* Retries - total retry count of tasks/jobs/sub workflows.
#		* Total Run - total count of tasks/jobs/sub workflows executed 
#		  during workflow run. This is the cumulative of retries, 
#		  succeeded and failed count.
#

"""
	return formatted_wf_statistics_legend
	
def formatted_job_stats_legends():
	"""
	Returns the job table legend 
	@return :  job table legend
	"""
	formatted_job_stats_legend = "# legends\n"
	formatted_job_stats_legend += "# Job            - name of the job\n"
	formatted_job_stats_legend += "# Try            - number representing the job instance run count\n"
	formatted_job_stats_legend += "# Site           - site where the job ran\n"
	formatted_job_stats_legend += "# Kickstart      - actual duration of the job instance in seconds on the remote compute node\n"
        formatted_job_stats_legend += "# Mult           - multiplier factor specified by the user\n"
        formatted_job_stats_legend += "# Kickstart-Mult - Kickstart time multiplied by the multiplier factor\n"
        formatted_job_stats_legend += "# CPU-Time       - remote cpu time computed as the stime + utime\n"
	formatted_job_stats_legend += "# Post           - postscript time as reported by DAGMan\n"
	formatted_job_stats_legend += "# CondorQTime    - time between submission by DAGMan and the remote Grid submission. It is an estimate of the time spent in the condor q on the submit node\n"
	formatted_job_stats_legend += "# Resource       - time between the remote Grid submission and start of remote execution. It is an estimate of the time job spent in the remote queue\n"
	formatted_job_stats_legend += "# Runtime        - time spent on the resource as seen by Condor DAGMan. Is always >=kickstart\n"
	formatted_job_stats_legend += "# Seqexec        - time taken for the completion of a clustered job\n"
	formatted_job_stats_legend += "# Seqexec-Delay  - time difference between the time for the completion of a clustered job and sum of all the individual tasks kickstart time\n"
        formatted_job_stats_legend += "# Exitcode       - exitcode for this job\n"
        formatted_job_stats_legend += "# Hostname       - name of the host where the job ran, as reported by kickstart\n"
	return formatted_job_stats_legend

def formatted_transformation_stats_legends():
	"""
	Returns the transformation table legend
	@return :  transformation table legend
	"""	
	formatted_transformation_stats_legend="# legends\n"
	formatted_transformation_stats_legend +="# Transformation - name of the transformation.\n"
	formatted_transformation_stats_legend +="# Count          - the number of times the invocations corresponding to the transformation was executed.\n"
	formatted_transformation_stats_legend +="# Succeeded      - the count of the succeeded invocations corresponding to the transformation.\n"
	formatted_transformation_stats_legend +="# Failed         - the count of the failed invocations corresponding to the transformation.\n"
	formatted_transformation_stats_legend +="# Min(sec)       - the minimum invocation runtime value corresponding to the transformation.\n"
	formatted_transformation_stats_legend +="# Max(sec)       - the maximum invocation runtime value corresponding to the transformation.\n"
	formatted_transformation_stats_legend +="# Mean(sec)      - the mean of the invocation runtime corresponding to the transformation.\n"
	formatted_transformation_stats_legend +="# Total(sec)     - the cumulative of invocation runtime corresponding to the transformation.\n"
	return formatted_transformation_stats_legend

def formatted_time_stats_legends_text():
	"""
	Returns the time table legend
	@return :  time table legend
	"""	
	filter = str(time_filter)
	formatted_time_stats_legend = "# legends" + NEW_LINE_STR
	formatted_time_stats_legend += "# Job instance statistics per " + filter + "         : the number of job instances run, total runtime sorted by " + filter+ NEW_LINE_STR
	formatted_time_stats_legend += "# Invocation statistics per " + filter + "           : the number of invocations , total runtime sorted by " + filter+ NEW_LINE_STR
	formatted_time_stats_legend += "# Job instance statistics by host per " + filter + " : the number of job instance run, total runtime on each host sorted by " + filter+ NEW_LINE_STR
	formatted_time_stats_legend += "# Invocation by host per " + filter + "              : the number of invocations, total runtime on each host sorted by " + filter + NEW_LINE_STR
	
	return formatted_time_stats_legend	

def formatted_time_stats_legends_csv():
	"""
	Returns the time table legend
	@return :  time table legend
	"""	
	filter = str(time_filter)
	formatted_time_stats_legend = "# legends" + NEW_LINE_STR
	formatted_time_stats_legend += "# Job instance statistics per " + filter + " : the number of job instances run, total runtime sorted by " + filter+ NEW_LINE_STR
	formatted_time_stats_legend += "# Invocation statistics per " + filter + "   : the number of invocations , total runtime sorted by " + filter+ NEW_LINE_STR
	
	return formatted_time_stats_legend	

def formatted_time_host_stats_legends_csv():
	"""
	Returns the time table legend
	@return :  time table legend
	"""	
	filter = str(time_filter)
	formatted_time_stats_legend = "# legends" + NEW_LINE_STR
	formatted_time_stats_legend += "# Job instance statistics by host per " + filter + " : the number of job instance run, total runtime on each host sorted by " + filter + NEW_LINE_STR
	formatted_time_stats_legend += "# Invocation by host per " + filter + "              : the number of invocations, total runtime on each host sorted by " + filter + NEW_LINE_STR
	
	return formatted_time_stats_legend	

def write_to_file(file_path, mode, content):
	"""
	Utility method for writing content to a given file
	@param file_path :  file path
	@param mode :   file writing mode 'a' append , 'w' write
	@param content :  content to write to file 
	"""
	try:
		fh = open(file_path, mode)
		fh.write(content)
	except IOError:
		logger.error("Unable to write to file " + file_path)
		sys.exit(1)
	else:
		fh.close()

def format_seconds(duration):
	"""
	Utility for converting time to a readable format
	@param duration :  time in seconds and miliseconds
	@return time in format day,hour, min,sec
	"""
	return stats_utils.format_seconds(duration)

def convert_to_str(value):
	"""
	Utility for returning a str representation of the given value.
	Return '-' if value is None
	@parem value : the given value that need to be converted to string
	"""
	if value is None:
		return '-'
	return str(value)

def print_row(content, column_format, output_format):
	"""
	Utility method for generating formatted row based on the column format given
	@param content        :  list of column values
	@param column_format  :  column_size of each columns
	"""
	row_str = ""
        if output_format == "text":
                for index in range(len(content)):
                        row_str += (content[index].ljust(column_format[index]))
        elif output_format == "csv":
                for word in content:
                        if row_str != "":
                                row_str += ","
                        row_str += word
        else:
                print "%s: error: output format %s not recognized!" % (prog_base, output_format)
                sys.exit(1)
	return row_str
	
def print_workflow_details(output_db_url, wf_uuid, output_dir):
	"""
	Prints the workflow statistics information of all workflows
	@param output_db_url :  time in seconds and miliseconds
	@param wf_uuid  : uuid of the top level workflow
	"""
	
	try:
		expanded_workflow_stats = StampedeStatistics(output_db_url)
		expanded_workflow_stats.initialize(wf_uuid)
        except SchemaVersionError:
                logger.error("------------------------------------------------------")
                logger.error("Database schema mismatch! Please run the upgrade tool")
                logger.error("to upgrade the database to the latest schema version.")
                sys.exit(1)
 	except:
 		logger.error("Failed to load the database." + output_db_url )
 		logger.warning(traceback.format_exc())
		sys.exit(1)
 	
 	# print workflow statistics
	wf_uuid_list = [wf_uuid]
	desc_wf_uuid_list = expanded_workflow_stats.get_descendant_workflow_ids()
	for wf_det in desc_wf_uuid_list:
		wf_uuid_list.append(wf_det.wf_uuid)
	
	if calc_wf_stats:
                # Do it for the text file
		wf_stats_file_txt = os.path.join(output_dir,
                                                 workflow_statistics_file_name + text_file_extension)
		write_to_file(wf_stats_file_txt, "w", formatted_wf_status_legends())
		workflow_status_table_header_str = print_row(workflow_status_col_name_text,
                                                             workflow_status_col_size,
                                                             "text")
		workflow_status_table_header_str += NEW_LINE_STR
		write_to_file(wf_stats_file_txt, "a", workflow_status_table_header_str)
                # Now output the csv file too
		wf_stats_file_csv = os.path.join(output_dir,
                                                 workflow_statistics_file_name + csv_file_extension)
		write_to_file(wf_stats_file_csv, "w", formatted_wf_status_legends())
		workflow_status_table_header_str = print_row(workflow_status_col_name_csv,
                                                             workflow_status_col_size,
                                                             "csv")
		workflow_status_table_header_str += NEW_LINE_STR
		write_to_file(wf_stats_file_csv, "a", workflow_status_table_header_str)
	if calc_jb_stats:
                # Write the text file
		jobs_stats_file_txt = os.path.join(output_dir, job_statistics_file_name + text_file_extension)
		write_to_file(jobs_stats_file_txt, "w", formatted_job_stats_legends())
                # Now write the csv file
		jobs_stats_file_csv = os.path.join(output_dir, job_statistics_file_name + csv_file_extension)
		write_to_file(jobs_stats_file_csv, "w", formatted_job_stats_legends())
	if calc_tf_stats:
                # Write the text file
		transformation_stats_file_txt = os.path.join(output_dir,
                                                             logical_transformation_statistics_file_name +
                                                             text_file_extension)
		write_to_file(transformation_stats_file_txt, "w", formatted_transformation_stats_legends())
                # Now write the csv file
		transformation_stats_file_csv = os.path.join(output_dir,
                                                             logical_transformation_statistics_file_name +
                                                             csv_file_extension)
		write_to_file(transformation_stats_file_csv, "w", formatted_transformation_stats_legends())
	if calc_ti_stats:
                # Create the text file
		time_stats_file_txt = os.path.join(output_dir, time_statistics_file_name + text_file_extension)
		write_to_file(time_stats_file_txt, "w", formatted_time_stats_legends_text())
		content = print_statistics_by_time_and_host(expanded_workflow_stats, "text",
                                                            combined=True, per_host=True)
		write_to_file(time_stats_file_txt, "a", content)
                # Now create the csv file
		time_stats_file_csv = os.path.join(output_dir, time_statistics_file_name + csv_file_extension)
		write_to_file(time_stats_file_csv, "w", formatted_time_stats_legends_csv())
		content = print_statistics_by_time_and_host(expanded_workflow_stats, "csv",
                                                            combined=True, per_host=False)
		write_to_file(time_stats_file_csv, "a", content)
                # Now create the second, per-host csv file
                time_stats_file2_csv = os.path.join(output_dir, time_statistics_per_host_file_name +
                                                    csv_file_extension)
		write_to_file(time_stats_file2_csv, "w", formatted_time_host_stats_legends_csv())
		content = print_statistics_by_time_and_host(expanded_workflow_stats, "csv",
                                                            combined=False, per_host=True)
		write_to_file(time_stats_file2_csv, "a", content)
	if calc_jb_stats or calc_tf_stats or calc_wf_stats:
		for sub_wf_uuid in wf_uuid_list:
			try:
				individual_workflow_stats = StampedeStatistics(output_db_url, False)
				individual_workflow_stats.initialize(sub_wf_uuid)
                        except SchemaVersionError:
                                logger.error("------------------------------------------------------")
                                logger.error("Database schema mismatch! Please run the upgrade tool")
                                logger.error("to upgrade the database to the latest schema version.")
                                sys.exit(1)
			except:
 				logger.error("Failed to load the database." + output_db_url )
 				logger.warning(traceback.format_exc())
				sys.exit(1)
			wf_det = individual_workflow_stats.get_workflow_details()[0]
			workflow_id =  str(sub_wf_uuid)
                        dax_label = str(wf_det.dax_label)
			logger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gger.info("Generating statistics information about the workflow "gge