private async void PingTimerCallback(object state)
        {
            try
            {
                await SendMessage("Ping", CancellationToken.None).ConfigureAwait(false);

                _lastPingTime = DateTime.UtcNow;
            }
            catch
            {
                var lastActivityDate = new[] { _lastPingTime, Session.LastActivityDate }
                    .Max();

                var timeSinceLastPing = DateTime.UtcNow - lastActivityDate;

                // We don't want to stop the session due to one single request failure
                // At the same time, we don't want the timeout to be too long because it will
                // be sitting in active sessions available for remote control, when it's not
                if (timeSinceLastPing >= TimeSpan.FromMinutes(5))
                {
                    ReportSessionEnded();
                }
            }
        }
        internal static string Escape(string text)
        {
            var array = new[]
	            {
		            '[',
		            '\\',
		            '^',
		            '$',
		            '.',
		            '|',
		            '?',
		            '*',
		            '+',
		            '(',
		            ')'
	            };

            var stringBuilder = new StringBuilder();
            var i = 0;
            var length = text.Length;

            while (i < length)
            {
                var character = text[i];

                if (Array.IndexOf(array, character) != -1)
                {
                    stringBuilder.Append("\\" + character.ToString());
                }
                else
                {
                    stringBuilder.Append(character);
                }
                i++;
            }
            return stringBuilder.ToString();
        }
        internal static string GetSearchTitle(string name)
        {
            var ignoreWords = new[] {
                "The",
	            "A",
	            "An"
            };

            var num = ignoreWords.Length - 1;
            for (var i = 0; i <= num; i++)
            {
                if (name.StartsWith(ignoreWords[i] + " ", StringComparison.OrdinalIgnoreCase))
                {
                    return name.Remove(0, ignoreWords[i].Length + 1).Trim() + ", " + ignoreWords[i];
                }
            }
            return name;
        }