private void Connect()
        {
            var definition = new { @event = "", message = "" };

            using (Ws = new WebSocket(Url))
            {
                Ws.SslConfiguration.EnabledSslProtocols = System.Security.Authentication.SslProtocols.Tls12;

                Ws.OnMessage += (sender, e) =>
                {
                    string data = e.Data;
                    Console.WriteLine("Received => " + data);
                    if (data.Contains("\"challenge\""))
                    {
                        Challenge       = JsonConvert.DeserializeAnonymousType(data, definition).message;
                        SignedChallenge = SignMessage(Challenge);
                        ChallengeRequestEvent.Signal();
                    }
                };

                Ws.OnOpen += (sender, e) =>
                             Console.WriteLine("Connected to {0}", Url);

                Ws.OnError += (sender, e) =>
                              Console.WriteLine("Received exception " + e.Message);

                Ws.OnClose += (sender, e) =>
                              Console.WriteLine("Connection Closed " + e.Reason);

                Ws.ConnectAsync();
                SetupPing();
                Console.ReadKey(true);
            }
        }
        public void SubscribePrivate(string feed)
        {
            if (Challenge == null)
            {
                RequestChallenge();
                ChallengeRequestEvent.Wait();
            }

            PrivateSubscription s = new PrivateSubscription("subscribe", feed, ApiKey, Challenge, SignedChallenge);
            string json           = JsonConvert.SerializeObject(s, Formatting.None, Settings);

            Console.WriteLine("private subscribe: " + json);
            Ws.Send(json);
        }