Having tested the main components of the simulation, we now proceed to test the actual simulation. We do this by checking the logic of the results since the individual components have already been tested. Before doing this however, we must first bring in the required simulation modules. We will need everything developed for the simulation except for the functions which generate arrival times as we will be providing standardized arrival times to ease in fact checking.

Load Required Code Modules

Event codes:

event_arrive_park = 1
event_enter_park = 2
event_leave_park = 30
event_leave_dining = 31
event_leave_ride = 32
event_process_attraction = 40
event_choose_experience = 50
event_choose_attraction = 51
event_choose_dining = 52

choose_turnstile() utility function:

choose_turnstile <- function(turnstiles, rule){
  if (rule == "shortest"){
    shortest <- 1 #index into turnstiles, not necessarily turnstile id
    line_length <- turnstiles[[shortest]]$agents_waiting

    #find the first shortest line
    for (i in 1:length(turnstiles)){
      if (turnstiles[[i]]$agents_waiting < line_length){
        shortest <- i
        line_length <- turnstiles[[i]]$agents_waiting
      }
    }

    return(shortest)
  }
}

layover() utility function:

layover <- function(turnstile, time){
  return(turnstile$calculate_wait_time(time) + turnstile$service_time)
}

turnstile class:

Turnstile <- R6::R6Class(
  "Turnstile",
  inherit = SimpleQueue
)

SimpleQueue class:

SimpleQueue <- R6::R6Class(
  "SimpleQueue",

  public = list(
    initialize = function(id, service_time){

      #initialize with unique turnstile id and zero agents waiting
      private$.id <- id
      private$.service_time <- service_time
      private$.agents_waiting <- 0
    },

    add_agent = function(current_time){
      if(!missing(current_time)){
        private$.agents_waiting <- private$.agents_waiting + 1

        if(is.na(private$.service_complete_at)){
          private$.service_complete_at <- current_time + private$.service_time
        }
      } else {
        stop("Cannot add agent without knowing the current time\n")
      }
      invisible(self)
    },

    remove_agent = function(){

      private$.agents_waiting = private$.agents_waiting - 1
      private$.service_complete_at <- private$.service_complete_at + private$.service_time

      if (private$.agents_waiting <= 0){
        private$.agents_waiting = 0
        private$.service_complete_at <- NA
      }

      invisible(self)
    },

    calculate_wait_time = function(current_time){
      if(missing(current_time)){
        stop("Cannot calculate current wait time without current time\n")
      } else {
        current_wait_time <- (private$.service_time * (private$.agents_waiting - 1)) +
          (private$.service_complete_at - current_time)

        #if we return a negative wait time, that means no one is in line, so
        #replace with zero
        if (is.na(current_wait_time) || current_wait_time < 0){
          current_wait_time <- 0
        }

        return(current_wait_time)
      }
    }
  ),

  active = list(
    id = function(value){
      if(missing(value)){
        private$.id
      } else{
        stop("Cannot set `$turnstile_id` after instantiation\n")
      }
    },

    service_time = function(value){
      if(missing(value)){
        private$.service_time
      } else{
        stop("Cannot change `$service_time` after instantiation\n")
      }
    },

    agents_waiting = function(value){
      if(missing(value)){
        private$.agents_waiting
      } else {
        stop("Cannot set `$agents_waiting`\n")
      }
    },

    service_complete_at = function(value){
      if(missing(value)){
        private$.service_complete_at
      } else{
        stop("cannot set `$service_complete_at`, use `$add_agent\n`")
      }
    }
  ),

  private = list(
    .id = -1,
    .service_time = -1,
    .agents_waiting = -1,
    .service_complete_at = NA
  )
)

Event record class:

Event <- R6::R6Class(
  "Event",

  public = list(
    initialize = function(agent_id = NA, trigger_time, arrive_park = NA, event_type,
                          remaining_attractions=NA, turnstile_chosen = NA,
                          remaining_dining = NA, attractions_visited = NA,
                          dining_visited = NA, attraction_index = NA){
      private$.agent_id <- agent_id
      private$.event_type <- event_type
      private$.trigger_time <- trigger_time
      private$.arrive_park <- arrive_park
      private$.remaining_attractions <- remaining_attractions
      private$.turnstile_chosen <- turnstile_chosen
      private$.remaining_dining <- remaining_dining
      private$.attractions_visited <- attractions_visited
      private$.dining_visited <- dining_visited
      private$.attraction_index <- attraction_index
      private$.data <- list()
    }
  ),

  active = list(
    agent_id = function(value){
      if(missing(value)){
        private$.agent_id
      } else{
        stop("Cannot set `$agent_id`\n")
      }
    },

    event_type = function(value){
      if(missing(value)){
        private$.event_type
      } else {
        private$.event_type <- value
      }
    },

    trigger_time = function(value){
      if(missing(value)){
        private$.trigger_time
      } else {
        private$.trigger_time <- value
      }
    },

    arrive_park = function(value){
      if(missing(value)){
        private$.arrive_park
      } else{
        stop("Cannot change `$arrive_park` after instantiation\n")
      }
    },

    retired = function(value){
      if(missing(value)){
        private$.retired
      } else{
        private$.retired <- value
      }
    },

    remaining_attractions = function(value){
      if(missing(value)){
        private$.remaining_attractions
      } else {
        private$.remaining_attractions <- value
      }
    },

    turnstile_chosen = function(value){
      if(missing(value)){
        private$.turnstile_chosen
      } else {
        private$.turnstile_chosen <- value
      }
    },

    remaining_dining = function(value){
      if(missing(value)){
        private$.remaining_dining
      } else{
        private$.remaining_dining <- value
      }
    },

    attractions_visited = function(value){
      if(missing(value)){
        Filter(Negate(is.na),private$.attractions_visited)
      } else{
        private$.attractions_visited <- c(private$.attractions_visited, value)
      }
    },

    dining_visited = function(value){
      if(missing(value)){
        Filter(Negate(is.na),private$.dining_visited)
      } else{
        private$.dining_visited <- c(private$.dining_visited, value)
      }
    },

    attraction_index = function(value){
      if(missing(value)){
        private$.attraction_index
      } else{
        private$.attraction_index <- value
      }
    },

    data = function(value){
      if(missing(value)){
        private$.data
      } else{
        private$.data <- append(private$.data, value)
      }
    }
  ),

  private = list(
    .agent_id = -1,
    .event_type = -1,
    .trigger_time = NA,
    .arrive_park = NA,
    .remaining_attractions = -1,
    .retired = FALSE,
    .turnstile_chosen = NA,
    .remaining_dining = NA,
    .attractions_visited = NA,
    .dining_visited = NA,
    .attraction_index = NA,
    .data = NULL
  )
)

generate_route_length() function:

generate_route_length <- function(n, route_length_mean, route_length_std){
  floor(rnorm(n, route_length_mean, route_length_std))
}

Attraction class:

Attraction <- R6::R6Class(
  "Attraction",

  public = list(

    initialize = function(name, short_name, duration, batch_size, unique_id){
      private$validate(name, short_name, duration, batch_size, unique_id)

      private$.name <- name
      private$.short_name <- short_name
      private$.duration <- duration
      private$.batch_size <- batch_size
      private$.line <- Line$new(unique_id)
    }
  ),

  active = list(
    name = function(value){
      if(missing(value)){
        private$.name
      } else{
        stop("Cannot set `$name`\n")
      }
    },

    short_name = function(value){
      if(missing(value)){
        private$.short_name
      } else{
        stop("Cannot set `$short_name`\n")
      }
    },

    duration = function(value){
      if(missing(value)){
        private$.duration
      } else{
        stop("Cannot set `$duration`\n")
      }
    },

    batch_size = function(value){
      if(missing(value)){
        private$.batch_size
      } else{
        stop("Cannot set `$batch_size`\n")
      }
    },

    line = function(value){
      if(missing(value)){
        private$.line
      } else{
        stop("Cannot set `$line` after instantiation\n")
      }
    }
  ),

  private = list(
    .name = NULL,
    .short_name = NULL,
    .duration = NA,
    .batch_size = NA,
    .line = NULL,

    validate = function(name, short_name, duration, batch_size, unique_id){
      stopifnot(is.character(name))
      stopifnot(is.character(short_name))
      stopifnot(is.numeric(duration) || is.na(duration))
      stopifnot(is.numeric(batch_size))
      stopifnot(is.numeric(unique_id))
    }
  )
)

Line class:

Line <- R6::R6Class(
  "Line",

  public = list(

    initialize = function(id){
      private$.id <- id
      private$.queue <- datastructures::queue()
    },

    add_agent = function(agent){
      invisible(datastructures::insert(private$.queue, agent))
      invisible(self)
    },

    remove_agent = function(n = 1){
      removed <- mapply(function(i){
        datastructures::pop(private$.queue)
      }, 1:n)

      #idea for this came from
      #https://stackoverflow.com/questions/33004238/r-removing-null-elements-from-a-list
      return(Filter(Negate(is.null), removed))
    }
  ),

  active = list(
    id = function(value){
      if(missing(value)){
        private$.id
      } else {
        stop("Cannot set `$id` after instantiation\n")
      }
    },

    num_of_agents = function(value){
      if(missing(value)){
        datastructures::size(private$.queue)
      } else{
        stop("Cannot set `$num_of_events`, use add_agent() or remove_agent()\n")
      }
    },

    queue = function(value){
      if(missing(value)){
        private$.queue
      } else {
        stop("Cannot set `$queue`, use add_event() or remove_event()")
      }
    }
  ),

  private = list(
    .id = -1,
    .queue = NULL
  )
)

Dining class:

Dining <- R6::R6Class(
  "Dining",

  public = list(
    initialize = function(name, short_name, category_code, capacity, unique_id){
      private$validate(name, short_name, category_code, capacity, unique_id)

      private$.name <- name
      private$.short_name <- short_name
      private$.category_code <- category_code
      private$.capacity <- capacity
      private$.id <- unique_id
      private$.currently_dining <- 0
    },

    add_diner = function(){
      private$.currently_dining <- private$.currently_dining + 1
      invisible(self)
    },

    remove_diner = function(){
      private$.currently_dining <- private$.currently_dining - 1

      if (private$.currently_dining <= 0){
        private$.currently_dining <- 0
      }

      invisible(self)
    }
  ),

  active = list(

    name = function(value){
      if(missing(value)){
        private$.name
      } else{
        stop("Cannot set `$value\n`")
      }
    },

    short_name = function(value){
      if(missing(value)){
        private$.short_name
      } else{
        stop("Cannot set `$short_name`\n")
      }
    },

    category_code = function(value){
      if(missing(value)){
        private$.category_code
      } else{
        stop("Cannot set `$category_code\n`")
      }
    },

    capacity = function(value){
      if(missing(value)){
        private$.capacity
      } else{
        stop("Cannot set `$capacity\n`")
      }
    },

    unique_id = function(value){
      if(missing(value)){
        private$.unique_id
      } else {
        stop("Cannot set `$unique_id`\n")
      }
    },

    service_time = function(value){
      if(missing(value)){

        #returns the service time in seconds
        if(private$.category_code == "quick-service"){
          sample(c(25, 30, 35, 40, 45, 50) *60, 1)
        } else if (private$.category_code == "table-service"){
          sample(c(45,50,55,60,65,70,75)*60, 1)
        } else {
          -1
        }
      } else {
        stop("Cannot set `$service_time`; function of `$category_code`\n")
      }
    },

    currently_dining = function(value){
      if(missing(value)){
        private$.currently_dining
      } else {
        stop("Cannot set `$currently_dining`; use add_diner() and remove_diner()\n")
      }
    }
  ),

  private = list(
    .name = NULL,
    .short_name = NULL,
    .category_code = NULL,
    .capacity = NULL,
    .id = -1,
    .currently_dining = NA,

    validate = function(name, short_name, category_code, capacity, unique_id){
      stopifnot(is.character(name))
      stopifnot(is.character(short_name))
      stopifnot(is.character(category_code))
      stopifnot(is.numeric(capacity))
      stopifnot(is.numeric(unique_id))
    }
  )
)

Testing

We start by preparing the data for the simulation. We begin by setting the dataset URLs (we use data.world for dataset storage).

magic_kingdom_attractions_path = "https://query.data.world/s/bjxzwnu7cyom6ymj3x3ker63rvv6ca"
magic_kingdom_dining_path = "https://query.data.world/s/lxpgmylxhduebtvobxe3zol3iat3np"

Next, we preprocess the data.

library(foreach)

magic_kingdom_attractions_raw <- read.csv(magic_kingdom_attractions_path,
                                          stringsAsFactors = FALSE)

magic_kingdom_attractions <- foreach::foreach(i = 1:nrow(magic_kingdom_attractions_raw)) %do% {

  #create an attraction object
  #name, shortname, duration (comes in seconds) and batch size
  Attraction$new(magic_kingdom_attractions_raw[i, 1],
                 magic_kingdom_attractions_raw[i, 2],
                 magic_kingdom_attractions_raw[i, 3],
                 magic_kingdom_attractions_raw[i, 4],
                 i)
}

#extract dining experiences
magic_kingdom_dining_raw <- read.csv(magic_kingdom_dining_path,
                                     stringsAsFactors = FALSE)
magic_kingdom_dining <- foreach::foreach(i = 1:nrow(magic_kingdom_dining_raw)) %do% {

  #create an attraction object
  #name, shortname, duration (comes in minutes; convert to hours) and batch size
  Dining$new(magic_kingdom_dining_raw[i, 1],
             magic_kingdom_dining_raw[i, 2],
             magic_kingdom_dining_raw[i, 3],
             magic_kingdom_dining_raw[i, 4],
             i)
}

Setup Simulation

Now we setup the simulation. We use easy to work with times in order to enhance the readability of the program and to enable fast fact checking.

#parameters for the generate_route_length() function
route_length_mean = 10 #means visiting 10 attractions
route_length_std = 2
required_dining = 1
constant_departure = 10*60 #10 minutes in seconds

#set the simulation end time
simulation_end_time = 3*60*60 #3 hours in seconds

#set the turnstile service time
turnstile_service_time = 10 #10 seconds

#define the number of turnstiles to keep open
num_of_turnstiles <- 10
turnstile_rule <- "shortest"

#log info
logging = TRUE
filepath = file.path("..","..","logs","sim_log.txt")

#instantiate turnstiles
turnstiles <- mapply(function(i){
    Turnstile$new(i, turnstile_service_time)
  }, 1:num_of_turnstiles)

#setup master event queue
master_event_queue <- datastructures::fibonacci_heap("integer")

#initialize attractions by scheduling the first event
#instantiate a progress bar
pb <- progress::progress_bar$new(total = length(magic_kingdom_attractions))

#load master event queue with the attraction's next pickup of agents (i.e. the duration)
invisible(
  mapply(function(i){
    event <- Event$new(trigger_time = magic_kingdom_attractions[[i]]$duration,
                       event_type = event_process_attraction,
                       attraction_index = i)
    datastructures::insert(master_event_queue, event$trigger_time, event)
    pb$tick()
  }, 1:length(magic_kingdom_attractions))
)

Testing: We test the scheduling of the initial departure times as follows:

#pop off the attraction scheduling
results <- mapply(function(i){
  event <- datastructures::pop(master_event_queue)[[1]]
  c(event$attraction_index, event$trigger_time)
}, 1:length(magic_kingdom_attractions))

#generate original in comparable format
durations <- mapply(function(i){
  c(i, magic_kingdom_attractions[[i]]$duration)
}, 1:length(magic_kingdom_attractions))

#compare popped values to original
print(paste("Pass", !(FALSE %in% (results == durations[,results[1,]]))))
## [1] "Pass TRUE"

In order to test, we scheduled the times in the queue. Then, we popped the attraction departure times off the queue and compared them to the original data. The data returned from popping off the queue and the original data should be equal.

We now redo the event queue setup (since in testing, we removed them from the queue):

#setup master event queue
master_event_queue <- datastructures::fibonacci_heap("integer")

#initialize attractions by scheduling the first event
#instantiate a progress bar
pb <- progress::progress_bar$new(total = length(magic_kingdom_attractions))

#load master event queue with the attraction's next pickup of agents (i.e. the duration)
invisible(
  mapply(function(i){
    event <- Event$new(trigger_time = magic_kingdom_attractions[[i]]$duration,
                       event_type = event_process_attraction,
                       attraction_index = i)
    datastructures::insert(master_event_queue, event$trigger_time, event)
    pb$tick()
  }, 1:length(magic_kingdom_attractions))
)

Now, we setup the arrivals. Once again, we use easy arrival times to assist in fact checking.

#setup agent arrivals
agent_arrivals <- c(1,30,53,21,9,37) #in seconds

#instantiate a progress bar
pb <- progress::progress_bar$new(total = length(agent_arrivals))

#load master event queue with arrivals
invisible(
  mapply(function(i){
  datastructures::insert(master_event_queue, as.integer(agent_arrivals[i]), 
                         Event$new(agent_id = i, 
                                   trigger_time = agent_arrivals[i], 
                                   arrive_park = agent_arrivals[i],
                                   event_type = event_arrive_park,
                                   remaining_attractions = 
                                     generate_route_length(1, route_length_mean,
                                                           route_length_std),
                                   remaining_dining = required_dining
                                   ))
  pb$tick()
  }, 1:length(agent_arrivals))
)
#instantiate current time by setting it equal to the very first item in the master event queue
cur_time = datastructures::peek(master_event_queue)[[1]]$trigger_time

write(paste("cur_time", "agent_id", "attr_index","trig_event_type", "next_trigger_time",
            "next_event_type", "turnstile_chosen", "rem_attractions", "rem_dining",
            "attr_visited", "dining_visited", "arrive_park","retired",
            sep = ","), file = filepath)

#perform the simulation until we go past the simulation end time or we run out of simulation events
while (!is.null(cur_time) && (cur_time < simulation_end_time)){

  #grab the next event record
  event <- datastructures::pop(master_event_queue)[[1]]

  #output the current time so you can know where in the simulation you are
  if (logging){
    cat(paste("\r\014Current Time:", cur_time))
    triggering_event_type <- event$event_type
  }

  if (event$event_type == event_arrive_park){
    #agent has arrived at park so,

    #pick the shortest line and add it to the event record
    shortest_line <- choose_turnstile(turnstiles, turnstile_rule)
    event$turnstile_chosen <- shortest_line

    #schedule next event
    event$event_type <- event_enter_park
    event$trigger_time <- event$trigger_time + layover(turnstiles[[shortest_line]], cur_time)

    #place the agent into the line
    turnstiles[[shortest_line]]$add_agent(cur_time)

  }

  else if (event$event_type == event_enter_park){
    #agent has entered park so,

    #remove agent from turnstile line
    turnstiles[[event$turnstile_chosen]]$remove_agent()

    #schedule next event (immediately upon entry)
    event$event_type <- event_choose_experience

  }

  else if (event$event_type == event_choose_experience){

    # if we still have to dine, determine if that time is now
    #experience_chosen = 0: choose attraction experience
    #experience_chosen = 1: choose dining experience
    #experience_chosen = -1: terminate
    if(event$remaining_dining > 0){
      #if we still have attractions remaining to visit, make the dining choice
      #based on a bionomial
      if (event$remaining_attractions > 0){
        #determine whether to visit an attraction or dining experience
        #based on bionomial distribution
        experience_chosen = rbinom(1, 1, 0.5)
      } else {
        #otherwise, all attractions have been visited so the only remaining
        #thing is to eat
        experience_chosen = 1
      }
    } else if (event$remaining_attractions > 0) {
      experience_chosen = 0
    } else {
      experience_chosen = -1
    }

    #determine where to send the event
    if (experience_chosen == 0){
      event$event_type <- event_choose_attraction
    } else if (experience_chosen == 1){
      event$event_type <- event_choose_dining
    } else {
      #change the event type as we are now ready to terminate after the constant
      #departure time
      event$event_type <- event_leave_park
      event$trigger_time <- event$trigger_time + constant_departure
    }
  }

  else if (event$event_type == event_choose_attraction){

      #randomly pick an attraction
      attraction_index <- sample.int(length(magic_kingdom_attractions), 1)

      #log which attraction we visited
      event$attractions_visited <- attraction_index

      #reduce the number of attraction
      event$remaining_attractions <- event$remaining_attractions - 1

      #retire the event
      event$retired <- TRUE
      event$trigger_time <- NA
      event$event_type <- event_leave_ride

      #add agent to attraction queue
      #note: if the `agent_id` field of the event is defined, the event record
      #doubles as an agent
      magic_kingdom_attractions[[attraction_index]]$line$add_agent(event)

  }

  else if (event$event_type == event_choose_dining){

    #randomly pick a dining experience
    dining_index <- sample.int(length(magic_kingdom_dining), 1)

    #determine the dining category
    cat_code <- magic_kingdom_dining[[dining_index]]$category_code

    #determine whether we have to check capacity
    if (cat_code == "table-service"){
      capacity <- magic_kingdom_dining[[dining_index]]$capacity
      cur_dining <- magic_kingdom_dining[[dining_index]]$currently_dining
      if(cur_dining < capacity){
        #log which dining experience was visited
        event$dining_visited <- dining_index

        #reduce the number of dining experiences
        event$remaining_dining <- event$remaining_dining - 1

        #add diner
        magic_kingdom_dining[[dining_index]]$add_diner()

        #draw service time
        service_time <- magic_kingdom_dining[[dining_index]]$service_time

        #set trigger time and next event type
        event$event_type <- event_leave_dining
        event$trigger_time <- event$trigger_time + service_time
      } else {
        #cannot dine at dining experience because of capacity, go back and choose
        #another experience
        event$event_type <- event_choose_experience
      }
    } else if (cat_code == "quick-service"){
      #log which dining experience was visited
      event$dining_visited <- dining_index

      #reduce the number of dining experiences
      event$remaining_dining <- event$remaining_dining - 1

      #draw service time
      service_time <- magic_kingdom_dining[[dining_index]]$service_time

      #set trigger time and next event type
      event$event_type <- event_choose_experience
      event$trigger_time <- event$trigger_time + service_time
    } else {
      stop("Invalid category code!")
    }

  }

  else if (event$event_type == event_leave_dining){
    #remove the diner
    magic_kingdom_dining[[event$dining_visited]]$remove_diner()
    event$event_type <- event_choose_experience
  }

  else if (event$event_type == event_leave_park){
    #agent is leaving park so,

    event$event_type <- -1
    event$trigger_time <- NA
    event$retired <- TRUE

  }

  else if (event$event_type == event_process_attraction){
    #an attraction needs to be processed so,

    #grab the attraction index, attraction batch size and the previous line size
    #(those waiting prior to the attraction departure)
    attraction_index <- event$attraction_index
    batch_size <- magic_kingdom_attractions[[attraction_index]]$batch_size
    previous_line_size <- magic_kingdom_attractions[[attraction_index]]$line$num_of_agents

    #simulate the attraction running by removing the waiting agents
    finished_agents <- magic_kingdom_attractions[[attraction_index]]$line$remove_agent(batch_size)

    #now, we have to reschedule all the popped off events
    if (length(finished_agents) > 0){
      invisible(mapply(function(i){

        #grab the ith event and,
        finished_event <- finished_agents[[i]]

        #update the next event type,
        finished_event$event_type <- event_leave_ride

        #come out of retirement (for the event gets added to the master event queue),
        finished_event$retired <- FALSE

        #set the trigger time for the above event
        #remember, we still have to simulate the ride by incorporating the duration
        #of the ride into the next trigger time
        finished_event$trigger_time <- cur_time +
          (magic_kingdom_attractions[[attraction_index]]$duration)

        #insert into master event queue
        datastructures::insert(master_event_queue,
                               finished_event$trigger_time,
                               finished_event)
      }, 1:length(finished_agents)))
    }

    #schedule the next attraction event
    #this is equal to the current time plus the duration of the ride
    event$trigger_time <- cur_time +
      (magic_kingdom_attractions[[attraction_index]]$duration)

  }

  else if (event$event_type == event_leave_ride){
    #agent has riden the ride, choose another experience

    event$event_type <- event_choose_experience
  }

  else{
    stop("Unknown event type\n")
  }

  #print(paste(cur_time, event$attractions_visited))

  #outputs the contents of the event record if logging is enabled
  if (logging){
    write(paste(cur_time, event$agent_id, event$attraction_index,
                triggering_event_type, event$trigger_time,
                event$event_type, event$turnstile_chosen, event$remaining_attractions,
                event$remaining_dining,
                stringi::stri_c(event$attractions_visited, collapse = " "),
                stringi::stri_c(event$dining_visited, collapse = " "),
                event$arrive_park, event$retired,
                sep = ","),
          file=filepath, append = TRUE)
  }

  #add the event record back to the priority queue if the event has not been
  #retired (i.e. the agent has left)
  if(!event$retired){
    datastructures::insert(master_event_queue, as.integer(event$trigger_time), event)
  }

  #advance time to the next event epoch
  cur_time <- datastructures::peek(master_event_queue)[[1]]$trigger_time
}
## 
Current Time: 1
Current Time: 9
Current Time: 11
Current Time: 11
Current Time: 11
Current Time: 19
Current Time: 19
Current Time: 19
Current Time: 21
Current Time: 30
Current Time: 31
Current Time: 31
Current Time: 31
Current Time: 37
Current Time: 40
Current Time: 40
Current Time: 40
Current Time: 47
Current Time: 47
Current Time: 47
Current Time: 53
Current Time: 60
Current Time: 60
Current Time: 63
Current Time: 63
Current Time: 63
Current Time: 90
Current Time: 90
Current Time: 90
Current Time: 90
Current Time: 120
Current Time: 120
Current Time: 120
Current Time: 120
Current Time: 180
Current Time: 180
Current Time: 180
Current Time: 180
Current Time: 180
Current Time: 180
Current Time: 180
Current Time: 180
Current Time: 180
Current Time: 180
Current Time: 180
Current Time: 240
Current Time: 240
Current Time: 240
Current Time: 240
Current Time: 240
Current Time: 255
Current Time: 270
Current Time: 270
Current Time: 270
Current Time: 270
Current Time: 270
Current Time: 300
Current Time: 300
Current Time: 360
Current Time: 360
Current Time: 360
Current Time: 360
Current Time: 360
Current Time: 360
Current Time: 360
Current Time: 360
Current Time: 360
Current Time: 360
Current Time: 360
Current Time: 360
Current Time: 360
Current Time: 420
Current Time: 420
Current Time: 420
Current Time: 420
Current Time: 450
Current Time: 450
Current Time: 450
Current Time: 450
Current Time: 450
Current Time: 480
Current Time: 480
Current Time: 480
Current Time: 480
Current Time: 480
Current Time: 480
Current Time: 510
Current Time: 540
Current Time: 540
Current Time: 540
Current Time: 540
Current Time: 540
Current Time: 540
Current Time: 540
Current Time: 540
Current Time: 540
Current Time: 540
Current Time: 540
Current Time: 540
Current Time: 600
Current Time: 600
Current Time: 600
Current Time: 600
Current Time: 600
Current Time: 600
Current Time: 600
Current Time: 600
Current Time: 630
Current Time: 630
Current Time: 630
Current Time: 630
Current Time: 660
Current Time: 660
Current Time: 720
Current Time: 720
Current Time: 720
Current Time: 720
Current Time: 720
Current Time: 720
Current Time: 720
Current Time: 720
Current Time: 720
Current Time: 720
Current Time: 720
Current Time: 720
Current Time: 720
Current Time: 720
Current Time: 720
Current Time: 720
Current Time: 750
Current Time: 765
Current Time: 780
Current Time: 780
Current Time: 810
Current Time: 810
Current Time: 810
Current Time: 810
Current Time: 810
Current Time: 840
Current Time: 840
Current Time: 840
Current Time: 840
Current Time: 840
Current Time: 840
Current Time: 840
Current Time: 900
Current Time: 900
Current Time: 900
Current Time: 900
Current Time: 900
Current Time: 900
Current Time: 900
Current Time: 900
Current Time: 900
Current Time: 900
Current Time: 900
Current Time: 900
Current Time: 900
Current Time: 900
Current Time: 930
Current Time: 960
Current Time: 960
Current Time: 960
Current Time: 960
Current Time: 960
Current Time: 960
Current Time: 960
Current Time: 990
Current Time: 990
Current Time: 990
Current Time: 990
Current Time: 1020
Current Time: 1020
Current Time: 1020
Current Time: 1080
Current Time: 1080
Current Time: 1080
Current Time: 1080
Current Time: 1080
Current Time: 1080
Current Time: 1080
Current Time: 1080
Current Time: 1080
Current Time: 1080
Current Time: 1080
Current Time: 1080
Current Time: 1080
Current Time: 1080
Current Time: 1080
Current Time: 1140
Current Time: 1140
Current Time: 1170
Current Time: 1170
Current Time: 1170
Current Time: 1170
Current Time: 1200
Current Time: 1200
Current Time: 1200
Current Time: 1200
Current Time: 1200
Current Time: 1200
Current Time: 1200
Current Time: 1200
Current Time: 1200
Current Time: 1200
Current Time: 1200
Current Time: 1200
Current Time: 1200
Current Time: 1200
Current Time: 1200
Current Time: 1260
Current Time: 1260
Current Time: 1260
Current Time: 1260
Current Time: 1260
Current Time: 1260
Current Time: 1260
Current Time: 1260
Current Time: 1260
Current Time: 1260
Current Time: 1260
Current Time: 1260
Current Time: 1260
Current Time: 1260
Current Time: 1275
Current Time: 1320
Current Time: 1320
Current Time: 1320
Current Time: 1320
Current Time: 1350
Current Time: 1350
Current Time: 1350
Current Time: 1350
Current Time: 1350
Current Time: 1350
Current Time: 1380
Current Time: 1380
Current Time: 1380
Current Time: 1440
Current Time: 1440
Current Time: 1440
Current Time: 1440
Current Time: 1440
Current Time: 1440
Current Time: 1440
Current Time: 1440
Current Time: 1440
Current Time: 1440
Current Time: 1440
Current Time: 1440
Current Time: 1440
Current Time: 1440
Current Time: 1440
Current Time: 1440
Current Time: 1440
Current Time: 1440
Current Time: 1440
Current Time: 1440
Current Time: 1500
Current Time: 1500
Current Time: 1500
Current Time: 1530
Current Time: 1530
Current Time: 1530
Current Time: 1530
Current Time: 1530
Current Time: 1560
Current Time: 1560
Current Time: 1560
Current Time: 1560
Current Time: 1620
Current Time: 1620
Current Time: 1620
Current Time: 1620
Current Time: 1620
Current Time: 1620
Current Time: 1620
Current Time: 1620
Current Time: 1620
Current Time: 1620
Current Time: 1620
Current Time: 1620
Current Time: 1680
Current Time: 1680
Current Time: 1680
Current Time: 1680
Current Time: 1680
Current Time: 1680
Current Time: 1680
Current Time: 1680
Current Time: 1710
Current Time: 1710
Current Time: 1710
Current Time: 1710
Current Time: 1740
Current Time: 1740
Current Time: 1785
Current Time: 1800
Current Time: 1800
Current Time: 1800
Current Time: 1800
Current Time: 1800
Current Time: 1800
Current Time: 1800
Current Time: 1800
Current Time: 1800
Current Time: 1800
Current Time: 1800
Current Time: 1800
Current Time: 1800
Current Time: 1800
Current Time: 1800
Current Time: 1800
Current Time: 1800
Current Time: 1800
Current Time: 1800
Current Time: 1800
Current Time: 1800
Current Time: 1860
Current Time: 1860
Current Time: 1860
Current Time: 1860
Current Time: 1860
Current Time: 1860
Current Time: 1890
Current Time: 1890
Current Time: 1890
Current Time: 1890
Current Time: 1890
Current Time: 1920
Current Time: 1920
Current Time: 1920
Current Time: 1920
Current Time: 1920
Current Time: 1920
Current Time: 1920
Current Time: 1920
Current Time: 1920
Current Time: 1920
Current Time: 1980
Current Time: 1980
Current Time: 1980
Current Time: 1980
Current Time: 1980
Current Time: 1980
Current Time: 1980
Current Time: 1980
Current Time: 1980
Current Time: 1980
Current Time: 1980
Current Time: 2040
Current Time: 2040
Current Time: 2040
Current Time: 2040
Current Time: 2040
Current Time: 2070
Current Time: 2070
Current Time: 2070
Current Time: 2070
Current Time: 2100
Current Time: 2100
Current Time: 2100
Current Time: 2100
Current Time: 2160
Current Time: 2160
Current Time: 2160
Current Time: 2160
Current Time: 2160
Current Time: 2160
Current Time: 2160
Current Time: 2160
Current Time: 2160
Current Time: 2160
Current Time: 2160
Current Time: 2160
Current Time: 2160
Current Time: 2160
Current Time: 2160
Current Time: 2160
Current Time: 2160
Current Time: 2160
Current Time: 2160
Current Time: 2160
Current Time: 2160
Current Time: 2160
Current Time: 2160
Current Time: 2160
Current Time: 2220
Current Time: 2220
Current Time: 2250
Current Time: 2250
Current Time: 2250
Current Time: 2250
Current Time: 2250
Current Time: 2250
Current Time: 2280
Current Time: 2280
Current Time: 2280
Current Time: 2280
Current Time: 2295
Current Time: 2340
Current Time: 2340
Current Time: 2340
Current Time: 2340
Current Time: 2340
Current Time: 2340
Current Time: 2340
Current Time: 2340
Current Time: 2340
Current Time: 2340
Current Time: 2340
Current Time: 2400
Current Time: 2400
Current Time: 2400
Current Time: 2400
Current Time: 2400
Current Time: 2400
Current Time: 2400
Current Time: 2400
Current Time: 2400
Current Time: 2400
Current Time: 2400
Current Time: 2400
Current Time: 2400
Current Time: 2430
Current Time: 2430
Current Time: 2430
Current Time: 2430
Current Time: 2430
Current Time: 2460
Current Time: 2460
Current Time: 2520
Current Time: 2520
Current Time: 2520
Current Time: 2520
Current Time: 2520
Current Time: 2520
Current Time: 2520
Current Time: 2520
Current Time: 2520
Current Time: 2520
Current Time: 2520
Current Time: 2520
Current Time: 2520
Current Time: 2520
Current Time: 2520
Current Time: 2520
Current Time: 2520
Current Time: 2520
Current Time: 2520
Current Time: 2520
Current Time: 2550
Current Time: 2580
Current Time: 2580
Current Time: 2610
Current Time: 2610
Current Time: 2610
Current Time: 2610
Current Time: 2640
Current Time: 2640
Current Time: 2640
Current Time: 2640
Current Time: 2640
Current Time: 2700
Current Time: 2700
Current Time: 2700
Current Time: 2700
Current Time: 2700
Current Time: 2700
Current Time: 2700
Current Time: 2700
Current Time: 2700
Current Time: 2700
Current Time: 2700
Current Time: 2700
Current Time: 2700
Current Time: 2700
Current Time: 2700
Current Time: 2760
Current Time: 2760
Current Time: 2760
Current Time: 2760
Current Time: 2760
Current Time: 2790
Current Time: 2790
Current Time: 2790
Current Time: 2790
Current Time: 2790
Current Time: 2805
Current Time: 2820
Current Time: 2820
Current Time: 2880
Current Time: 2880
Current Time: 2880
Current Time: 2880
Current Time: 2880
Current Time: 2880
Current Time: 2880
Current Time: 2880
Current Time: 2880
Current Time: 2880
Current Time: 2880
Current Time: 2880
Current Time: 2880
Current Time: 2880
Current Time: 2880
Current Time: 2880
Current Time: 2880
Current Time: 2880
Current Time: 2940
Current Time: 2940
Current Time: 2940
Current Time: 2940
Current Time: 2970
Current Time: 2970
Current Time: 2970
Current Time: 2970
Current Time: 2970
Current Time: 3000
Current Time: 3000
Current Time: 3000
Current Time: 3000
Current Time: 3000
Current Time: 3000
Current Time: 3000
Current Time: 3000
Current Time: 3000
Current Time: 3000
Current Time: 3000
Current Time: 3000
Current Time: 3000
Current Time: 3000
Current Time: 3000
Current Time: 3019
Current Time: 3019
Current Time: 3019
Current Time: 3060
Current Time: 3060
Current Time: 3060
Current Time: 3060
Current Time: 3060
Current Time: 3060
Current Time: 3060
Current Time: 3060
Current Time: 3060
Current Time: 3060
Current Time: 3060
Current Time: 3060
Current Time: 3120
Current Time: 3120
Current Time: 3120
Current Time: 3120
Current Time: 3120
Current Time: 3150
Current Time: 3150
Current Time: 3150
Current Time: 3150
Current Time: 3150
Current Time: 3180
Current Time: 3180
Current Time: 3240
Current Time: 3240
Current Time: 3240
Current Time: 3240
Current Time: 3240
Current Time: 3240
Current Time: 3240
Current Time: 3240
Current Time: 3240
Current Time: 3240
Current Time: 3240
Current Time: 3240
Current Time: 3240
Current Time: 3240
Current Time: 3240
Current Time: 3300
Current Time: 3300
Current Time: 3315
Current Time: 3330
Current Time: 3330
Current Time: 3330
Current Time: 3330
Current Time: 3360
Current Time: 3360
Current Time: 3360
Current Time: 3360
Current Time: 3360
Current Time: 3360
Current Time: 3360
Current Time: 3360
Current Time: 3360
Current Time: 3420
Current Time: 3420
Current Time: 3420
Current Time: 3420
Current Time: 3420
Current Time: 3420
Current Time: 3420
Current Time: 3420
Current Time: 3420
Current Time: 3420
Current Time: 3420
Current Time: 3480
Current Time: 3480
Current Time: 3480
Current Time: 3480
Current Time: 3510
Current Time: 3510
Current Time: 3510
Current Time: 3510
Current Time: 3510
Current Time: 3540
Current Time: 3540
Current Time: 3570
Current Time: 3600
Current Time: 3600
Current Time: 3600
Current Time: 3600
Current Time: 3600
Current Time: 3600
Current Time: 3600
Current Time: 3600
Current Time: 3600
Current Time: 3600
Current Time: 3600
Current Time: 3600
Current Time: 3600
Current Time: 3600
Current Time: 3600
Current Time: 3600
Current Time: 3600
Current Time: 3600
Current Time: 3600
Current Time: 3600
Current Time: 3600
Current Time: 3600
Current Time: 3600
Current Time: 3600
Current Time: 3600
Current Time: 3600
Current Time: 3600
Current Time: 3600
Current Time: 3600
Current Time: 3600
Current Time: 3660
Current Time: 3660
Current Time: 3690
Current Time: 3690
Current Time: 3690
Current Time: 3690
Current Time: 3720
Current Time: 3720
Current Time: 3720
Current Time: 3720
Current Time: 3720
Current Time: 3750
Current Time: 3780
Current Time: 3780
Current Time: 3780
Current Time: 3780
Current Time: 3780
Current Time: 3780
Current Time: 3780
Current Time: 3780
Current Time: 3780
Current Time: 3780
Current Time: 3780
Current Time: 3780
Current Time: 3780
Current Time: 3780
Current Time: 3780
Current Time: 3825
Current Time: 3840
Current Time: 3840
Current Time: 3840
Current Time: 3840
Current Time: 3840
Current Time: 3840
Current Time: 3840
Current Time: 3870
Current Time: 3870
Current Time: 3870
Current Time: 3870
Current Time: 3900
Current Time: 3900
Current Time: 3960
Current Time: 3960
Current Time: 3960
Current Time: 3960
Current Time: 3960
Current Time: 3960
Current Time: 3960
Current Time: 3960
Current Time: 3960
Current Time: 3960
Current Time: 3960
Current Time: 3960
Current Time: 3960
Current Time: 4020
Current Time: 4020
Current Time: 4050
Current Time: 4050
Current Time: 4050
Current Time: 4050
Current Time: 4050
Current Time: 4050
Current Time: 4080
Current Time: 4080
Current Time: 4080
Current Time: 4080
Current Time: 4080
Current Time: 4080
Current Time: 4140
Current Time: 4140
Current Time: 4140
Current Time: 4140
Current Time: 4140
Current Time: 4140
Current Time: 4140
Current Time: 4140
Current Time: 4140
Current Time: 4140
Current Time: 4140
Current Time: 4140
Current Time: 4140
Current Time: 4140
Current Time: 4200
Current Time: 4200
Current Time: 4200
Current Time: 4200
Current Time: 4200
Current Time: 4200
Current Time: 4200
Current Time: 4200
Current Time: 4200
Current Time: 4200
Current Time: 4200
Current Time: 4230
Current Time: 4230
Current Time: 4230
Current Time: 4230
Current Time: 4260
Current Time: 4260
Current Time: 4320
Current Time: 4320
Current Time: 4320
Current Time: 4320
Current Time: 4320
Current Time: 4320
Current Time: 4320
Current Time: 4320
Current Time: 4320
Current Time: 4320
Current Time: 4320
Current Time: 4320
Current Time: 4320
Current Time: 4320
Current Time: 4320
Current Time: 4320
Current Time: 4320
Current Time: 4320
Current Time: 4320
Current Time: 4335
Current Time: 4380
Current Time: 4380
Current Time: 4410
Current Time: 4410
Current Time: 4410
Current Time: 4410
Current Time: 4440
Current Time: 4440
Current Time: 4440
Current Time: 4440
Current Time: 4500
Current Time: 4500
Current Time: 4500
Current Time: 4500
Current Time: 4500
Current Time: 4500
Current Time: 4500
Current Time: 4500
Current Time: 4500
Current Time: 4500
Current Time: 4500
Current Time: 4500
Current Time: 4500
Current Time: 4500
Current Time: 4500
Current Time: 4500
Current Time: 4500
Current Time: 4500
Current Time: 4500
Current Time: 4500
Current Time: 4560
Current Time: 4560
Current Time: 4560
Current Time: 4560
Current Time: 4560
Current Time: 4590
Current Time: 4590
Current Time: 4590
Current Time: 4590
Current Time: 4590
Current Time: 4590
Current Time: 4590
Current Time: 4590
Current Time: 4590
Current Time: 4620
Current Time: 4620
Current Time: 4620
Current Time: 4620
Current Time: 4650
Current Time: 4680
Current Time: 4680
Current Time: 4680
Current Time: 4680
Current Time: 4680
Current Time: 4680
Current Time: 4680
Current Time: 4680
Current Time: 4680
Current Time: 4680
Current Time: 4680
Current Time: 4680
Current Time: 4680
Current Time: 4680
Current Time: 4680
Current Time: 4680
Current Time: 4740
Current Time: 4740
Current Time: 4770
Current Time: 4770
Current Time: 4770
Current Time: 4770
Current Time: 4800
Current Time: 4800
Current Time: 4800
Current Time: 4800
Current Time: 4800
Current Time: 4800
Current Time: 4800
Current Time: 4800
Current Time: 4800
Current Time: 4800
Current Time: 4800
Current Time: 4800
Current Time: 4800
Current Time: 4800
Current Time: 4845
Current Time: 4860
Current Time: 4860
Current Time: 4860
Current Time: 4860
Current Time: 4860
Current Time: 4860
Current Time: 4860
Current Time: 4860
Current Time: 4860
Current Time: 4860
Current Time: 4860
Current Time: 4860
Current Time: 4920
Current Time: 4920
Current Time: 4920
Current Time: 4920
Current Time: 4950
Current Time: 4950
Current Time: 4950
Current Time: 4950
Current Time: 4950
Current Time: 4980
Current Time: 4980
Current Time: 5040
Current Time: 5040
Current Time: 5040
Current Time: 5040
Current Time: 5040
Current Time: 5040
Current Time: 5040
Current Time: 5040
Current Time: 5040
Current Time: 5040
Current Time: 5040
Current Time: 5040
Current Time: 5040
Current Time: 5040
Current Time: 5040
Current Time: 5040
Current Time: 5040
Current Time: 5040
Current Time: 5040
Current Time: 5040
Current Time: 5100
Current Time: 5100
Current Time: 5100
Current Time: 5130
Current Time: 5130
Current Time: 5130
Current Time: 5130
Current Time: 5130
Current Time: 5160
Current Time: 5160
Current Time: 5160
Current Time: 5160
Current Time: 5220
Current Time: 5220
Current Time: 5220
Current Time: 5220
Current Time: 5220
Current Time: 5220
Current Time: 5220
Current Time: 5220
Current Time: 5220
Current Time: 5220
Current Time: 5220
Current Time: 5250
Current Time: 5280
Current Time: 5280
Current Time: 5280
Current Time: 5280
Current Time: 5280
Current Time: 5280
Current Time: 5310
Current Time: 5310
Current Time: 5310
Current Time: 5310
Current Time: 5340
Current Time: 5340
Current Time: 5355
Current Time: 5400
Current Time: 5400
Current Time: 5400
Current Time: 5400
Current Time: 5400
Current Time: 5400
Current Time: 5400
Current Time: 5400
Current Time: 5400
Current Time: 5400
Current Time: 5400
Current Time: 5400
Current Time: 5400
Current Time: 5400
Current Time: 5400
Current Time: 5400
Current Time: 5400
Current Time: 5400
Current Time: 5400
Current Time: 5400
Current Time: 5400
Current Time: 5400
Current Time: 5400
Current Time: 5460
Current Time: 5460
Current Time: 5460
Current Time: 5460
Current Time: 5460
Current Time: 5460
Current Time: 5460
Current Time: 5490
Current Time: 5490
Current Time: 5490
Current Time: 5490
Current Time: 5520
Current Time: 5520
Current Time: 5520
Current Time: 5520
Current Time: 5520
Current Time: 5520
Current Time: 5580
Current Time: 5580
Current Time: 5580
Current Time: 5580
Current Time: 5580
Current Time: 5580
Current Time: 5580
Current Time: 5580
Current Time: 5580
Current Time: 5580
Current Time: 5580
Current Time: 5580
Current Time: 5610
Current Time: 5640
Current Time: 5640
Current Time: 5640
Current Time: 5640
Current Time: 5670
Current Time: 5670
Current Time: 5670
Current Time: 5670
Current Time: 5670
Current Time: 5700
Current Time: 5700
Current Time: 5700
Current Time: 5700
Current Time: 5760
Current Time: 5760
Current Time: 5760
Current Time: 5760
Current Time: 5760
Current Time: 5760
Current Time: 5760
Current Time: 5760
Current Time: 5760
Current Time: 5760
Current Time: 5760
Current Time: 5760
Current Time: 5760
Current Time: 5760
Current Time: 5760
Current Time: 5760
Current Time: 5760
Current Time: 5760
Current Time: 5760
Current Time: 5760
Current Time: 5760
Current Time: 5820
Current Time: 5820
Current Time: 5850
Current Time: 5850
Current Time: 5850
Current Time: 5850
Current Time: 5850
Current Time: 5865
Current Time: 5880
Current Time: 5880
Current Time: 5880
Current Time: 5880
Current Time: 5880
Current Time: 5880
Current Time: 5880
Current Time: 5940
Current Time: 5940
Current Time: 5940
Current Time: 5940
Current Time: 5940
Current Time: 5940
Current Time: 5940
Current Time: 5940
Current Time: 5940
Current Time: 5940
Current Time: 5940
Current Time: 5940
Current Time: 6000
Current Time: 6000
Current Time: 6000
Current Time: 6000
Current Time: 6000
Current Time: 6000
Current Time: 6000
Current Time: 6000
Current Time: 6000
Current Time: 6000
Current Time: 6000
Current Time: 6000
Current Time: 6000
Current Time: 6000
Current Time: 6000
Current Time: 6000
Current Time: 6030
Current Time: 6030
Current Time: 6030
Current Time: 6030
Current Time: 6060
Current Time: 6060
Current Time: 6120
Current Time: 6120
Current Time: 6120
Current Time: 6120
Current Time: 6120
Current Time: 6120
Current Time: 6120
Current Time: 6120
Current Time: 6120
Current Time: 6120
Current Time: 6120
Current Time: 6120
Current Time: 6120
Current Time: 6120
Current Time: 6120
Current Time: 6120
Current Time: 6120
Current Time: 6180
Current Time: 6180
Current Time: 6210
Current Time: 6210
Current Time: 6210
Current Time: 6210
Current Time: 6210
Current Time: 6240
Current Time: 6240
Current Time: 6240
Current Time: 6240
Current Time: 6240
Current Time: 6240
Current Time: 6300
Current Time: 6300
Current Time: 6300
Current Time: 6300
Current Time: 6300
Current Time: 6300
Current Time: 6300
Current Time: 6300
Current Time: 6300
Current Time: 6300
Current Time: 6300
Current Time: 6300
Current Time: 6300
Current Time: 6300
Current Time: 6300
Current Time: 6300
Current Time: 6300
Current Time: 6360
Current Time: 6360
Current Time: 6360
Current Time: 6360
Current Time: 6375
Current Time: 6390
Current Time: 6390
Current Time: 6390
Current Time: 6390
Current Time: 6420
Current Time: 6420
Current Time: 6480
Current Time: 6480
Current Time: 6480
Current Time: 6480
Current Time: 6480
Current Time: 6480
Current Time: 6480
Current Time: 6480
Current Time: 6480
Current Time: 6480
Current Time: 6480
Current Time: 6480
Current Time: 6480
Current Time: 6480
Current Time: 6480
Current Time: 6480
Current Time: 6480
Current Time: 6480
Current Time: 6480
Current Time: 6480
Current Time: 6480
Current Time: 6480
Current Time: 6480
Current Time: 6480
Current Time: 6510
Current Time: 6540
Current Time: 6540
Current Time: 6570
Current Time: 6570
Current Time: 6570
Current Time: 6570
Current Time: 6600
Current Time: 6600
Current Time: 6600
Current Time: 6600
Current Time: 6600
Current Time: 6600
Current Time: 6600
Current Time: 6600
Current Time: 6630
Current Time: 6660
Current Time: 6660
Current Time: 6660
Current Time: 6660
Current Time: 6660
Current Time: 6660
Current Time: 6660
Current Time: 6660
Current Time: 6660
Current Time: 6660
Current Time: 6660
Current Time: 6660
Current Time: 6660
Current Time: 6660
Current Time: 6720
Current Time: 6720
Current Time: 6720
Current Time: 6720
Current Time: 6720
Current Time: 6720
Current Time: 6720
Current Time: 6720
Current Time: 6720
Current Time: 6720
Current Time: 6750
Current Time: 6750
Current Time: 6750
Current Time: 6750
Current Time: 6750
Current Time: 6750
Current Time: 6750
Current Time: 6780
Current Time: 6780
Current Time: 6840
Current Time: 6840
Current Time: 6840
Current Time: 6840
Current Time: 6840
Current Time: 6840
Current Time: 6840
Current Time: 6840
Current Time: 6840
Current Time: 6840
Current Time: 6840
Current Time: 6840
Current Time: 6840
Current Time: 6885
Current Time: 6900
Current Time: 6900
Current Time: 6900
Current Time: 6930
Current Time: 6930
Current Time: 6930
Current Time: 6930
Current Time: 6960
Current Time: 6960
Current Time: 6960
Current Time: 6960
Current Time: 6960
Current Time: 7020
Current Time: 7020
Current Time: 7020
Current Time: 7020
Current Time: 7020
Current Time: 7020
Current Time: 7020
Current Time: 7020
Current Time: 7020
Current Time: 7020
Current Time: 7020
Current Time: 7020
Current Time: 7080
Current Time: 7080
Current Time: 7080
Current Time: 7080
Current Time: 7110
Current Time: 7110
Current Time: 7110
Current Time: 7110
Current Time: 7140
Current Time: 7140
Current Time: 7140
Current Time: 7140
Current Time: 7140
Current Time: 7200
Current Time: 7200
Current Time: 7200
Current Time: 7200
Current Time: 7200
Current Time: 7200
Current Time: 7200
Current Time: 7200
Current Time: 7200
Current Time: 7200
Current Time: 7200
Current Time: 7200
Current Time: 7200
Current Time: 7200
Current Time: 7200
Current Time: 7200
Current Time: 7200
Current Time: 7200
Current Time: 7200
Current Time: 7200
Current Time: 7200
Current Time: 7200
Current Time: 7200
Current Time: 7200
Current Time: 7200
Current Time: 7200
Current Time: 7200
Current Time: 7200
Current Time: 7200
Current Time: 7200
Current Time: 7200
Current Time: 7200
Current Time: 7200
Current Time: 7200
Current Time: 7200
Current Time: 7200
Current Time: 7200
Current Time: 7260
Current Time: 7260
Current Time: 7290
Current Time: 7290
Current Time: 7290
Current Time: 7290
Current Time: 7290
Current Time: 7320
Current Time: 7320
Current Time: 7320
Current Time: 7320
Current Time: 7380
Current Time: 7380
Current Time: 7380
Current Time: 7380
Current Time: 7380
Current Time: 7380
Current Time: 7380
Current Time: 7380
Current Time: 7380
Current Time: 7380
Current Time: 7380
Current Time: 7395
Current Time: 7440
Current Time: 7440
Current Time: 7440
Current Time: 7440
Current Time: 7440
Current Time: 7440
Current Time: 7470
Current Time: 7470
Current Time: 7470
Current Time: 7470
Current Time: 7500
Current Time: 7500
Current Time: 7500
Current Time: 7560
Current Time: 7560
Current Time: 7560
Current Time: 7560
Current Time: 7560
Current Time: 7560
Current Time: 7560
Current Time: 7560
Current Time: 7560
Current Time: 7560
Current Time: 7560
Current Time: 7560
Current Time: 7560
Current Time: 7560
Current Time: 7560
Current Time: 7560
Current Time: 7560
Current Time: 7560
Current Time: 7560
Current Time: 7620
Current Time: 7620
Current Time: 7650
Current Time: 7650
Current Time: 7650
Current Time: 7650
Current Time: 7650
Current Time: 7650
Current Time: 7680
Current Time: 7680
Current Time: 7680
Current Time: 7680
Current Time: 7680
Current Time: 7680
Current Time: 7680
Current Time: 7680
Current Time: 7680
Current Time: 7680
Current Time: 7740
Current Time: 7740
Current Time: 7740
Current Time: 7740
Current Time: 7740
Current Time: 7740
Current Time: 7740
Current Time: 7740
Current Time: 7740
Current Time: 7740
Current Time: 7740
Current Time: 7800
Current Time: 7800
Current Time: 7800
Current Time: 7800
Current Time: 7800
Current Time: 7800
Current Time: 7800
Current Time: 7800
Current Time: 7830
Current Time: 7830
Current Time: 7830
Current Time: 7830
Current Time: 7830
Current Time: 7860
Current Time: 7860
Current Time: 7905
Current Time: 7920
Current Time: 7920
Current Time: 7920
Current Time: 7920
Current Time: 7920
Current Time: 7920
Current Time: 7920
Current Time: 7920
Current Time: 7920
Current Time: 7920
Current Time: 7920
Current Time: 7920
Current Time: 7920
Current Time: 7920
Current Time: 7920
Current Time: 7920
Current Time: 7980
Current Time: 7980
Current Time: 7980
Current Time: 7980
Current Time: 8010
Current Time: 8010
Current Time: 8010
Current Time: 8010
Current Time: 8040
Current Time: 8040
Current Time: 8040
Current Time: 8040
Current Time: 8100
Current Time: 8100
Current Time: 8100
Current Time: 8100
Current Time: 8100
Current Time: 8100
Current Time: 8100
Current Time: 8100
Current Time: 8100
Current Time: 8100
Current Time: 8100
Current Time: 8100
Current Time: 8100
Current Time: 8100
Current Time: 8100
Current Time: 8100
Current Time: 8100
Current Time: 8100
Current Time: 8100
Current Time: 8100
Current Time: 8100
Current Time: 8160
Current Time: 8160
Current Time: 8160
Current Time: 8160
Current Time: 8160
Current Time: 8160
Current Time: 8160
Current Time: 8190
Current Time: 8190
Current Time: 8190
Current Time: 8190
Current Time: 8220
Current Time: 8220
Current Time: 8250
Current Time: 8280
Current Time: 8280
Current Time: 8280
Current Time: 8280
Current Time: 8280
Current Time: 8280
Current Time: 8280
Current Time: 8280
Current Time: 8280
Current Time: 8280
Current Time: 8280
Current Time: 8280
Current Time: 8280
Current Time: 8280
Current Time: 8340
Current Time: 8340
Current Time: 8370
Current Time: 8370
Current Time: 8370
Current Time: 8370
Current Time: 8370
Current Time: 8370
Current Time: 8400
Current Time: 8400
Current Time: 8400
Current Time: 8400
Current Time: 8400
Current Time: 8400
Current Time: 8400
Current Time: 8400
Current Time: 8400
Current Time: 8400
Current Time: 8400
Current Time: 8400
Current Time: 8400
Current Time: 8400
Current Time: 8400
Current Time: 8400
Current Time: 8400
Current Time: 8400
Current Time: 8400
Current Time: 8400
Current Time: 8400
Current Time: 8400
Current Time: 8400
Current Time: 8400
Current Time: 8415
Current Time: 8460
Current Time: 8460
Current Time: 8460
Current Time: 8460
Current Time: 8460
Current Time: 8460
Current Time: 8460
Current Time: 8460
Current Time: 8460
Current Time: 8460
Current Time: 8460
Current Time: 8520
Current Time: 8520
Current Time: 8520
Current Time: 8520
Current Time: 8550
Current Time: 8550
Current Time: 8550
Current Time: 8550
Current Time: 8550
Current Time: 8550
Current Time: 8550
Current Time: 8550
Current Time: 8580
Current Time: 8580
Current Time: 8640
Current Time: 8640
Current Time: 8640
Current Time: 8640
Current Time: 8640
Current Time: 8640
Current Time: 8640
Current Time: 8640
Current Time: 8640
Current Time: 8640
Current Time: 8640
Current Time: 8640
Current Time: 8640
Current Time: 8640
Current Time: 8640
Current Time: 8640
Current Time: 8640
Current Time: 8640
Current Time: 8640
Current Time: 8640
Current Time: 8640
Current Time: 8640
Current Time: 8670
Current Time: 8700
Current Time: 8700
Current Time: 8730
Current Time: 8730
Current Time: 8730
Current Time: 8730
Current Time: 8760
Current Time: 8760
Current Time: 8760
Current Time: 8760
Current Time: 8820
Current Time: 8820
Current Time: 8820
Current Time: 8820
Current Time: 8820
Current Time: 8820
Current Time: 8820
Current Time: 8820
Current Time: 8820
Current Time: 8820
Current Time: 8820
Current Time: 8820
Current Time: 8820
Current Time: 8820
Current Time: 8820
Current Time: 8820
Current Time: 8880
Current Time: 8880
Current Time: 8880
Current Time: 8880
Current Time: 8880
Current Time: 8910
Current Time: 8910
Current Time: 8910
Current Time: 8910
Current Time: 8910
Current Time: 8925
Current Time: 8940
Current Time: 8940
Current Time: 9000
Current Time: 9000
Current Time: 9000
Current Time: 9000
Current Time: 9000
Current Time: 9000
Current Time: 9000
Current Time: 9000
Current Time: 9000
Current Time: 9000
Current Time: 9000
Current Time: 9000
Current Time: 9000
Current Time: 9000
Current Time: 9000
Current Time: 9000
Current Time: 9000
Current Time: 9000
Current Time: 9000
Current Time: 9000
Current Time: 9000
Current Time: 9000
Current Time: 9000
Current Time: 9000
Current Time: 9000
Current Time: 9060
Current Time: 9060
Current Time: 9090
Current Time: 9090
Current Time: 9090
Current Time: 9090
Current Time: 9120
Current Time: 9120
Current Time: 9120
Current Time: 9120
Current Time: 9120
Current Time: 9120
Current Time: 9180
Current Time: 9180
Current Time: 9180
Current Time: 9180
Current Time: 9180
Current Time: 9180
Current Time: 9180
Current Time: 9180
Current Time: 9180
Current Time: 9180
Current Time: 9180
Current Time: 9180
Current Time: 9180
Current Time: 9240
Current Time: 9240
Current Time: 9240
Current Time: 9240
Current Time: 9240
Current Time: 9240
Current Time: 9240
Current Time: 9240
Current Time: 9270
Current Time: 9270
Current Time: 9270
Current Time: 9270
Current Time: 9300
Current Time: 9300
Current Time: 9300
Current Time: 9360
Current Time: 9360
Current Time: 9360
Current Time: 9360
Current Time: 9360
Current Time: 9360
Current Time: 9360
Current Time: 9360
Current Time: 9360
Current Time: 9360
Current Time: 9360
Current Time: 9360
Current Time: 9360
Current Time: 9360
Current Time: 9360
Current Time: 9360
Current Time: 9360
Current Time: 9360
Current Time: 9360
Current Time: 9420
Current Time: 9420
Current Time: 9420
Current Time: 9435
Current Time: 9450
Current Time: 9450
Current Time: 9450
Current Time: 9450
Current Time: 9450
Current Time: 9450
Current Time: 9450
Current Time: 9450
Current Time: 9450
Current Time: 9480
Current Time: 9480
Current Time: 9480
Current Time: 9480
Current Time: 9540
Current Time: 9540
Current Time: 9540
Current Time: 9540
Current Time: 9540
Current Time: 9540
Current Time: 9540
Current Time: 9540
Current Time: 9540
Current Time: 9540
Current Time: 9540
Current Time: 9600
Current Time: 9600
Current Time: 9600
Current Time: 9600
Current Time: 9600
Current Time: 9600
Current Time: 9600
Current Time: 9600
Current Time: 9600
Current Time: 9600
Current Time: 9600
Current Time: 9600
Current Time: 9600
Current Time: 9600
Current Time: 9630
Current Time: 9630
Current Time: 9630
Current Time: 9630
Current Time: 9660
Current Time: 9660
Current Time: 9660
Current Time: 9660
Current Time: 9660
Current Time: 9690
Current Time: 9720
Current Time: 9720
Current Time: 9720
Current Time: 9720
Current Time: 9720
Current Time: 9720
Current Time: 9720
Current Time: 9720
Current Time: 9720
Current Time: 9720
Current Time: 9720
Current Time: 9720
Current Time: 9720
Current Time: 9720
Current Time: 9720
Current Time: 9750
Current Time: 9780
Current Time: 9780
Current Time: 9810
Current Time: 9810
Current Time: 9810
Current Time: 9810
Current Time: 9840
Current Time: 9840
Current Time: 9840
Current Time: 9840
Current Time: 9840
Current Time: 9900
Current Time: 9900
Current Time: 9900
Current Time: 9900
Current Time: 9900
Current Time: 9900
Current Time: 9900
Current Time: 9900
Current Time: 9900
Current Time: 9900
Current Time: 9900
Current Time: 9900
Current Time: 9900
Current Time: 9900
Current Time: 9945
Current Time: 9960
Current Time: 9960
Current Time: 9960
Current Time: 9960
Current Time: 9990
Current Time: 9990
Current Time: 9990
Current Time: 9990
Current Time: 9990
Current Time: 10020
Current Time: 10020
Current Time: 10080
Current Time: 10080
Current Time: 10080
Current Time: 10080
Current Time: 10080
Current Time: 10080
Current Time: 10080
Current Time: 10080
Current Time: 10080
Current Time: 10080
Current Time: 10080
Current Time: 10080
Current Time: 10080
Current Time: 10080
Current Time: 10080
Current Time: 10080
Current Time: 10080
Current Time: 10080
Current Time: 10080
Current Time: 10080
Current Time: 10080
Current Time: 10080
Current Time: 10080
Current Time: 10080
Current Time: 10140
Current Time: 10140
Current Time: 10170
Current Time: 10170
Current Time: 10170
Current Time: 10170
Current Time: 10200
Current Time: 10200
Current Time: 10200
Current Time: 10200
Current Time: 10200
Current Time: 10200
Current Time: 10200
Current Time: 10200
Current Time: 10200
Current Time: 10200
Current Time: 10200
Current Time: 10200
Current Time: 10230
Current Time: 10230
Current Time: 10230
Current Time: 10230
Current Time: 10260
Current Time: 10260
Current Time: 10260
Current Time: 10260
Current Time: 10260
Current Time: 10260
Current Time: 10260
Current Time: 10260
Current Time: 10260
Current Time: 10260
Current Time: 10260
Current Time: 10260
Current Time: 10320
Current Time: 10320
Current Time: 10320
Current Time: 10320
Current Time: 10320
Current Time: 10350
Current Time: 10350
Current Time: 10350
Current Time: 10350
Current Time: 10350
Current Time: 10380
Current Time: 10380
Current Time: 10440
Current Time: 10440
Current Time: 10440
Current Time: 10440
Current Time: 10440
Current Time: 10440
Current Time: 10440
Current Time: 10440
Current Time: 10440
Current Time: 10440
Current Time: 10440
Current Time: 10440
Current Time: 10440
Current Time: 10440
Current Time: 10440
Current Time: 10440
Current Time: 10455
Current Time: 10500
Current Time: 10500
Current Time: 10500
Current Time: 10500
Current Time: 10500
Current Time: 10530
Current Time: 10530
Current Time: 10530
Current Time: 10530
Current Time: 10530
Current Time: 10560
Current Time: 10560
Current Time: 10560
Current Time: 10560
Current Time: 10560
Current Time: 10560
Current Time: 10560
Current Time: 10620
Current Time: 10620
Current Time: 10620
Current Time: 10620
Current Time: 10620
Current Time: 10620
Current Time: 10620
Current Time: 10620
Current Time: 10620
Current Time: 10620
Current Time: 10620
Current Time: 10680
Current Time: 10680
Current Time: 10680
Current Time: 10680
Current Time: 10710
Current Time: 10710
Current Time: 10710
Current Time: 10710
Current Time: 10710
Current Time: 10740
Current Time: 10740

The results of the simulation are as follows:

results <- read.csv("../../logs/sim_log.txt", stringsAsFactors = FALSE)
only_agents <- results[which(results$next_event_type != 40),]
DT::datatable(results)

We now show only the agents (as we assume from prior testing that the attraction processing is correct) to ensure the flow is working properly.

DT::datatable(only_agents)

After comparing the results, all of the agents have passed based upon how they flowed through the simulation. We created the following diagram that describes the simulation flow and checked that the log file produced follows the flow.