async Task DoShow(CancellationToken cancellationToken)
        {
            if (IsCoaching)
            {
                throw new InvalidOperationException("Coaching is under process.");
            }

            CancellationToken = cancellationToken;
            SkipTapped        = false;
            CurrentStep currentStep = null;

            try
            {
                // Create and show background which contains the next and skip button
                await AddButtons(cancellationToken);

                for (Index = 0; Index < stepsList.Count; Index++)
                {
                    var step = stepsList[Index];

                    FixButtonsConditions();

                    if (ShouldItTerminate())
                    {
                        return;
                    }

                    // Show the step by showing it text and element.
                    currentStep = await ShowStep(step);

                    if (ShouldItTerminate())
                    {
                        return;
                    }

                    // Wait for next, skip or time delay (If applicable) to continue.
                    if (Settings.MoveOnByTime)
                    {
                        await Task.WhenAny(OnNextTapped.Task, OnSkipTapped.Task, OnBackTapped.Task, currentStep.OnPopOverClosed.Task, Task.Delay(Settings.Delay));
                    }
                    else
                    {
                        await Task.WhenAny(OnNextTapped.Task, OnSkipTapped.Task, OnBackTapped.Task, currentStep.OnPopOverClosed.Task);
                    }

                    if (ShouldItTerminate())
                    {
                        return;
                    }

                    // Hide the step by showing it text and element.
                    await HideStep(currentStep);
                }
            }
            finally
            {
                await Task.WhenAll(RemoveButtons(), HideStep(currentStep));
            }
        }
        async Task HideStep(CurrentStep currentStep)
        {
            if (currentStep == null)
            {
                return;
            }

            await currentStep.Hide();
        }
        async Task <CurrentStep> ShowStep(Step step)
        {
            OnNextTapped = new TaskCompletionSource <bool>();
            OnSkipTapped = new TaskCompletionSource <bool>();
            OnBackTapped = new TaskCompletionSource <bool>();

            var currentStep = new CurrentStep(step.Element, step.Text, Settings);

            await currentStep.Show();

            return(currentStep);
        }