void Step(
			FromProcessMeasurement<MemoryMeasurement> MemoryMeasurement,
			BotPreference UserPreference,
			IEnumerable<int> TaskCompletedId)
		{
			var StepPreviousIndex = StepCurrentState?.StepIndex;

			if (null == StepCurrentState)
			{
				StepCurrentState = new BotInstant();
			}
			else
			{
				History.Enqueue(StepCurrentState.CopyForBotHistory());

				History.TrimHeadToKeep(10);
			}

			StepCurrentState.StepIndex = (StepPreviousIndex + 1) ?? 0;
			StepCurrentState.MemoryMeasurement = MemoryMeasurement;
			StepCurrentState.UserPreference = UserPreference;

			StepCurrentState.SensorDataAccumulator = StepCurrentState.SensorDataAccumulator ?? new SensorDataAccumulator();

			StepCurrentState.SensorDataAccumulator?.Accumulate(MemoryMeasurement);

			TaskPropagateComplete(TaskCompletedId);

			TaskResolve();

			ListTask?.RemoveAll(Task => Task.Ended() || !((StepIndex - Task.BeginStepIndexInBot) < 30));
		}
		public BotPreference PreferenceReadFromUI(BotPreference Destination = null)
		{
			if (null == Destination)
			{
				Destination = new BotPreference();
			}

			Destination.TravelEnable = TravelTab?.HeaderToggleButtonIsChecked() ?? false;
			Destination.MineEnable = MineTab?.HeaderToggleButtonIsChecked() ?? false;

			return Destination;
		}
		public void Exchange(
			FromProcessMeasurement<MemoryMeasurement> MemoryMeasurement,
			BotPreference UserPreference,
			IEnumerable<int> TaskCompletedId)
		{
			if (null == MemoryMeasurement)
			{
				return;
			}

			var MemoryMeasurementIsNew =
				!(MemoryMeasurement?.EndeZait == StepCurrentState?.MemoryMeasurement?.EndeZait);

			if (MemoryMeasurementIsNew)
			{
				Step(MemoryMeasurement, UserPreference, TaskCompletedId);
			}
		}