/// <summary>
        /// Handle SimulatePassingCar message.
        /// </summary>
        /// <param name="msg">The message to handle.</param>
        private void Handle(SimulatePassingCar msg)
        {
            //  simulate car entry
            int            entryLane      = _rnd.Next(1, 4);
            ActorSelection entryCamera    = Context.System.ActorSelection($"/user/entrycam{entryLane}");
            DateTime       entryTimestamp = DateTime.Now;
            VehiclePassed  vehiclePassed  = new VehiclePassed(msg.VehicleId, entryTimestamp);

            entryCamera.Tell(vehiclePassed);

            // simulate car exit
            int            exitLane      = _rnd.Next(1, 4);
            TimeSpan       delay         = TimeSpan.FromSeconds(_rnd.Next(_minExitDelayInS, _maxExitDelayInS) + _rnd.NextDouble());
            DateTime       exitTimestamp = entryTimestamp.Add(delay);
            ActorSelection exitCamera    = Context.System.ActorSelection($"/user/exitcam{entryLane}");

            vehiclePassed = new VehiclePassed(msg.VehicleId, exitTimestamp);
            Context.System.Scheduler.ScheduleTellOnce(delay, exitCamera, vehiclePassed, Self);

            // handle progress
            _carsSimulated++;
            if (_carsSimulated < _numberOfCars)
            {
                SimulatePassingCar simulatePassingCar = new SimulatePassingCar(GenerateRandomLicenseNumber());
                Context.System.Scheduler.ScheduleTellOnce(
                    _rnd.Next(_minEntryDelayInMS, _maxEntryDelayInMS), Self, simulatePassingCar, Self);
            }
            else
            {
                Self.Tell(new Shutdown());
            }
        }
        /// <summary>
        /// Handle StartSimulation message.
        /// </summary>
        /// <param name="msg">The message to handle.</param>
        private void Handle(StartSimulation msg)
        {
            // initialize state
            _numberOfCars  = msg.NumberOfCars;
            _carsSimulated = 0;
            _rnd           = new Random();

            // start simulationloop
            SimulatePassingCar simulatePassingCar = new SimulatePassingCar(GenerateRandomLicenseNumber());

            Context.System.Scheduler.ScheduleTellOnce(
                _rnd.Next(_minEntryDelayInMS, _maxEntryDelayInMS), Self, simulatePassingCar, Self);
        }