Jump to content

Fake Players on WHO List


Recommended Posts

anyone interested in testing this..?

diff --git a/src/game/MiscHandler.cpp b/src/game/MiscHandler.cpp
index bf03a30..5126203 100644
--- a/src/game/MiscHandler.cpp
+++ b/src/game/MiscHandler.cpp
@@ -73,187 +73,40 @@ void WorldSession::HandleWhoOpcode( WorldPacket & recv_data )
    DEBUG_LOG( "WORLD: Recvd CMSG_WHO Message" );
    //recv_data.hexlike();

-    uint32 clientcount = 0;
-
-    uint32 level_min, level_max, racemask, classmask, zones_count, str_count;
-    uint32 zoneids[10];                                     // 10 is client limit
-    std::string player_name, guild_name;
-
-    recv_data >> level_min;                                 // maximal player level, default 0
-    recv_data >> level_max;                                 // minimal player level, default 100 (MAX_LEVEL)
-    recv_data >> player_name;                               // player name, case sensitive...
-
-    recv_data >> guild_name;                                // guild name, case sensitive...
-
-    recv_data >> racemask;                                  // race mask
-    recv_data >> classmask;                                 // class mask
-    recv_data >> zones_count;                               // zones count, client limit=10 (2.0.10)
-
-    if(zones_count > 10)
-        return;                                             // can't be received from real client or broken packet
-
-    for(uint32 i = 0; i < zones_count; ++i)
-    {
-        uint32 temp;
-        recv_data >> temp;                                  // zone id, 0 if zone is unknown...
-        zoneids[i] = temp;
-        DEBUG_LOG("Zone %u: %u", i, zoneids[i]);
-    }
-
-    recv_data >> str_count;                                 // user entered strings count, client limit=4 (checked on 2.0.10)
-
-    if(str_count > 4)
-        return;                                             // can't be received from real client or broken packet
-
-    DEBUG_LOG("Minlvl %u, maxlvl %u, name %s, guild %s, racemask %u, classmask %u, zones %u, strings %u", level_min, level_max, player_name.c_str(), guild_name.c_str(), racemask, classmask, zones_count, str_count);
-
-    std::wstring str[4];                                    // 4 is client limit
-    for(uint32 i = 0; i < str_count; ++i)
-    {
-        std::string temp;
-        recv_data >> temp;                                  // user entered string, it used as universal search pattern(guild+player name)?
-
-        if(!Utf8toWStr(temp,str[i]))
-            continue;
-
-        wstrToLower(str[i]);
-
-        DEBUG_LOG("String %u: %s", i, temp.c_str());
-    }
-
-    std::wstring wplayer_name;
-    std::wstring wguild_name;
-    if(!(Utf8toWStr(player_name, wplayer_name) && Utf8toWStr(guild_name, wguild_name)))
-        return;
-    wstrToLower(wplayer_name);
-    wstrToLower(wguild_name);
-
-    // client send in case not set max level value 100 but mangos support 255 max level,
-    // update it to show GMs with characters after 100 level
-    if(level_max >= MAX_LEVEL)
-        level_max = STRONG_MAX_LEVEL;
-
-    uint32 team = _player->GetTeam();
-    uint32 security = GetSecurity();
-    bool allowTwoSideWhoList = sWorld.getConfig(CONFIG_BOOL_ALLOW_TWO_SIDE_WHO_LIST);
-    AccountTypes gmLevelInWhoList = (AccountTypes)sWorld.getConfig(CONFIG_UINT32_GM_LEVEL_IN_WHO_LIST);
-
+    //KICHO: Who List Player Stats                          0    1    2     3     4      5    6       7
+    QueryResult *result = CharacterDatabase.PQuery("SELECT guid,name,race,class,gender,level,zone,COUNT(guid) FROM characters WHERE online!=0");
+    Field *fields = result->Fetch();
+
+    //uint32
+    uint32 clientcount = fields[7].GetUInt32();    //online count (player number)
+    uint32 race = fields[2].GetUInt32();        //player race
+    uint32 class_ = fields[3].GetUInt32();        //player class
+    uint32 lvl = fields[5].GetUInt32();            //player level
+    uint32 pzoneid = fields[6].GetUInt32();        //player in zone
+    //string
+    std::string pname  = fields[1].GetCppString();    //player name
+    std::string gname  = fields[1].GetCppString();    //guild name (not implemented yet)
+
+    //KICHO: World Packet
    WorldPacket data( SMSG_WHO, 50 );                       // guess size
    data << uint32(clientcount);                            // clientcount place holder, listed count
    data << uint32(clientcount);                            // clientcount place holder, online count

-    // TODO: Guard Player map
-    HashMapHolder<Player>::MapType& m = sObjectAccessor.GetPlayers();
-    for(HashMapHolder<Player>::MapType::const_iterator itr = m.begin(); itr != m.end(); ++itr)
-    {
-        if (security == SEC_PLAYER)
-        {
-            // player can see member of other team only if CONFIG_BOOL_ALLOW_TWO_SIDE_WHO_LIST
-            if (itr->second->GetTeam() != team && !allowTwoSideWhoList )
-                continue;
-
-            // player can see MODERATOR, GAME MASTER, ADMINISTRATOR only if CONFIG_GM_IN_WHO_LIST
-            if (itr->second->GetSession()->GetSecurity() > gmLevelInWhoList)
-                continue;
-        }
-
-        // do not process players which are not in world
-        if(!(itr->second->IsInWorld()))
-            continue;
-
-        // check if target is globally visible for player
-        if (!(itr->second->IsVisibleGloballyFor(_player)))
-            continue;
-
-        // check if target's level is in level range
-        uint32 lvl = itr->second->getLevel();
-        if (lvl < level_min || lvl > level_max)
-            continue;
-
-        // check if class matches classmask
-        uint32 class_ = itr->second->getClass();
-        if (!(classmask & (1 << class_)))
-            continue;
-
-        // check if race matches racemask
-        uint32 race = itr->second->getRace();
-        if (!(racemask & (1 << race)))
-            continue;
-
-        uint32 pzoneid = itr->second->GetZoneId();
-
-        bool z_show = true;
-        for(uint32 i = 0; i < zones_count; ++i)
-        {
-            if(zoneids[i] == pzoneid)
-            {
-                z_show = true;
-                break;
-            }
-
-            z_show = false;
-        }
-        if (!z_show)
-            continue;
-
-        std::string pname = itr->second->GetName();
-        std::wstring wpname;
-        if(!Utf8toWStr(pname,wpname))
-            continue;
-        wstrToLower(wpname);
-
-        if (!(wplayer_name.empty() || wpname.find(wplayer_name) != std::wstring::npos))
-            continue;
-
-        std::string gname = sObjectMgr.GetGuildNameById(itr->second->GetGuildId());
-        std::wstring wgname;
-        if(!Utf8toWStr(gname,wgname))
-            continue;
-        wstrToLower(wgname);
-
-        if (!(wguild_name.empty() || wgname.find(wguild_name) != std::wstring::npos))
-            continue;
-
-        std::string aname;
-        if(AreaTableEntry const* areaEntry = GetAreaEntryByAreaID(itr->second->GetZoneId()))
-            aname = areaEntry->area_name[GetSessionDbcLocale()];
-
-        bool s_show = true;
-        for(uint32 i = 0; i < str_count; ++i)
-        {
-            if (!str[i].empty())
-            {
-                if (wgname.find(str[i]) != std::wstring::npos ||
-                    wpname.find(str[i]) != std::wstring::npos ||
-                    Utf8FitTo(aname, str[i]) )
-                {
-                    s_show = true;
-                    break;
-                }
-                s_show = false;
-            }
-        }
-        if (!s_show)
-            continue;
-
        data << pname;                                      // player name
-        data << gname;                                      // guild name
+        data << gname;                                      // guild name (not implemented yet)
        data << uint32( lvl );                              // player level
        data << uint32( class_ );                           // player class
        data << uint32( race );                             // player race
        data << uint8(0);                                   // new 2.4.0
        data << uint32( pzoneid );                          // player zone id

-        // 50 is maximum player count sent to client
-        if ((++clientcount) == 50)
-            break;
-    }
-
-    uint32 count = m.size();
    data.put( 0, clientcount );                             // insert right count, listed count
-    data.put( 4, count > 50 ? count : clientcount );        // insert right count, online count
+    data.put( 4, clientcount );                             // insert right count, online count

    SendPacket(&data);
+
+    delete result;
+
    DEBUG_LOG( "WORLD: Send SMSG_WHO Message" );
}

Link to comment
Share on other sites

  • Replies 81
  • Created
  • Last Reply

Top Posters In This Topic

anyone interested in testing this..?

i try this script but dont work fine :(

dont insert all user but only last loging user is well.

exaple:

______unknow 80 unknow

______unknow 80 unknow

______unknow 80 unknow

pazzly ulduar 80 rogue

:(

Link to comment
Share on other sites

  • 2 months later...

Well.. Check out what I got.

diff -r ed1c46f19079 src/server/game/Server/Protocol/Handlers/MiscHandler.cpp
--- a/src/server/game/Server/Protocol/Handlers/MiscHandler.cpp    Thu Jul 29 11:15:09 2010 -0300
+++ b/src/server/game/Server/Protocol/Handlers/MiscHandler.cpp    Thu Jul 29 16:55:30 2010 -0300
@@ -340,6 +340,37 @@
            break;
    }

+    if (clientcount < sWorld.getConfig(CONFIG_MAX_WHO))
+    {
+        // Fake players                             0,   1,   2,    3,    4,   5
+        QueryResult_AutoPtr result = CharacterDatabase.Query("SELECT guid,name,race,class,level,zone FROM characters WHERE online = 2");
+        if (result)
+        {
+            do
+            {
+                Field *fields = result->Fetch();
+
+                std::string pname = fields[1].GetCppString();
+                std::string gname;
+                uint8 lvl = fields[4].GetUInt32();
+                uint32 class_ = fields[3].GetUInt32();
+                uint32 race = fields[2].GetUInt32();
+                uint32 pzoneid = fields[5].GetUInt32();
+
+                data << pname;                              // player name
+                data << gname;                              // guild name
+                data << uint32(lvl);                        // player level
+                data << uint32(class_);                     // player class
+                data << uint32(race);                       // player race
+                data << uint8(0);                           // new 2.4.0
+                data << uint32(pzoneid);                    // player zone id
+
+                if ((++clientcount) == sWorld.getConfig(CONFIG_MAX_WHO))
+                    break;
+            } while (result->NextRow());
+        }
+    }
+
    uint32 count = m.size();
    data.put( 0, clientcount );                             // insert right count, listed count
    data.put( 4, count > 50 ? count : clientcount );        // insert right count, online count

You need to create some chars and set online = 2;

Link to comment
Share on other sites

Can someone test this? This new version prevents the server from sending "no player xxx currently online" to the sender.

diff -r 30d2a0da9458 src/server/game/Server/Protocol/Handlers/ChatHandler.cpp
--- a/src/server/game/Server/Protocol/Handlers/ChatHandler.cpp    Tue Jul 27 14:44:40 2010 -0300
+++ b/src/server/game/Server/Protocol/Handlers/ChatHandler.cpp    Thu Jul 29 19:55:28 2010 -0300
@@ -248,7 +248,9 @@
            uint32 pSecurity = player ? player->GetSession()->GetSecurity() : SEC_PLAYER;
            if (!player || (tSecurity <= SEC_VIP && pSecurity > SEC_VIP && !player->isAcceptWhispers()))
            {
-                SendPlayerNotFoundNotice(to);
+                QueryResult_AutoPtr result = CharacterDatabase.PQuery("SELECT guid FROM characters WHERE name = '%s' AND online = 2", to.c_str());
+                if (!result)
+                    SendPlayerNotFoundNotice(to);
                return;
            }

diff -r 30d2a0da9458 src/server/game/Server/Protocol/Handlers/MiscHandler.cpp
--- a/src/server/game/Server/Protocol/Handlers/MiscHandler.cpp    Tue Jul 27 14:44:40 2010 -0300
+++ b/src/server/game/Server/Protocol/Handlers/MiscHandler.cpp    Thu Jul 29 19:55:28 2010 -0300
@@ -340,6 +340,37 @@
            break;
    }

+    if (clientcount < sWorld.getConfig(CONFIG_MAX_WHO))
+    {
+        // Fake players                                                 0,   1,   2,    3,    4,   5
+        QueryResult_AutoPtr result = CharacterDatabase.Query("SELECT guid,name,race,class,level,zone FROM characters WHERE online = 2");
+        if (result)
+        {
+            do
+            {
+                Field *fields = result->Fetch();
+
+                std::string pname = fields[1].GetCppString();
+                std::string gname;
+                uint8 lvl = fields[4].GetUInt32();
+                uint32 class_ = fields[3].GetUInt32();
+                uint32 race = fields[2].GetUInt32();
+                uint32 pzoneid = fields[5].GetUInt32();
+
+                data << pname;                              // player name
+                data << gname;                              // guild name
+                data << uint32(lvl);                        // player level
+                data << uint32(class_);                     // player class
+                data << uint32(race);                       // player race
+                data << uint8(0);                           // new 2.4.0
+                data << uint32(pzoneid);                    // player zone id
+
+                if ((++clientcount) == sWorld.getConfig(CONFIG_MAX_WHO))
+                    break;
+            } while (result->NextRow());
+        }
+    }
+
    uint32 count = m.size();
    data.put( 0, clientcount );                             // insert right count, listed count
    data.put( 4, count > 50 ? count : clientcount );        // insert right count, online count

Link to comment
Share on other sites

typo:

uint8 lvl = fields[4].GetUInt32();

uint8 lvl = fields[4].GetUInt8();

also why use online = 2 ? that won't show players which are REALLY online...isn't it better to use online != 0 so it will show fake players with online=2 and real players with online=1

Link to comment
Share on other sites

Hi, thanks for the reply!

The reason is that I didn't remove any original code, so the HashMapHolder loop sends the real online players and then I added another one to send fake online players only if there is less then 49 real online players.

I tested and it worked just fine.

Thanks!

Link to comment
Share on other sites

i think you didn't understand my question I know why you didn't remove any original code but I'm asking why use in sql query WHERE online = 2 , wouldn't it be simplier to use where online != 0 because it would show real & fake players.

i've done few mods so it can compile with clean mangos

Working nice with 10298 :)

diff --git a/src/game/ChatHandler.cpp b/src/game/ChatHandler.cpp
index 6d778db..347ec1f 100644
--- a/src/game/ChatHandler.cpp
+++ b/src/game/ChatHandler.cpp
@@ -209,7 +209,10 @@ void WorldSession::HandleMessagechatOpcode( WorldPacket & recv_data )
            uint32 pSecurity = player ? player->GetSession()->GetSecurity() : SEC_PLAYER;
            if (!player || (tSecurity == SEC_PLAYER && pSecurity > SEC_PLAYER && !player->isAcceptWhispers()))
            {
-                SendPlayerNotFoundNotice(to);
+                QueryResult *result = CharacterDatabase.PQuery("SELECT guid FROM characters WHERE name = '%s' AND online != 0", to.c_str());
+                if (!result)
+                    SendPlayerNotFoundNotice(to);
+
                return;
            }

diff --git a/src/game/MiscHandler.cpp b/src/game/MiscHandler.cpp
index 6e4f43c..0046bfc 100644
--- a/src/game/MiscHandler.cpp
+++ b/src/game/MiscHandler.cpp
@@ -249,11 +249,43 @@ void WorldSession::HandleWhoOpcode( WorldPacket & recv_data )
            break;
    }

+    if (clientcount < 49)
+    {
+        // Fake players on WHO LIST                            0,   1,    2,   3,    4,   5
+        QueryResult *result = CharacterDatabase.Query("SELECT guid,name,race,class,level,zone FROM characters WHERE online>1");
+        if (result)
+        {
+            do
+            {
+                Field *fields = result->Fetch();
+
+                std::string pname = fields[1].GetCppString();
+                std::string gname;
+                uint8 lvl = fields[4].GetUInt8();
+                uint32 class_ = fields[3].GetUInt32();
+                uint32 race = fields[2].GetUInt32();
+                uint32 pzoneid = fields[5].GetUInt32();
+
+                data << pname;                              // player name
+                data << gname;                              // guild name
+                data << uint32(lvl);                        // player level
+                data << uint32(class_);                     // player class
+                data << uint32(race);                       // player race
+                data << uint8(0);                           // new 2.4.0
+                data << uint32(pzoneid);                    // player zone id
+
+                if ((++clientcount) == 49)
+                    break;
+            } while (result->NextRow());
+        }
+     delete result;
+    }
+
    uint32 count = m.size();
    data.put( 0, clientcount );                             // insert right count, listed count
    data.put( 4, count > 50 ? count : clientcount );        // insert right count, online count

    SendPacket(&data);

    DEBUG_LOG( "WORLD: Send SMSG_WHO Message" );
}

Link to comment
Share on other sites

you didn't understood my question...nevermind

updated patch due to recent gender field change in [10318]

diff --git a/src/game/ChatHandler.cpp b/src/game/ChatHandler.cpp
index 6d778db..6217dc4 100644
--- a/src/game/ChatHandler.cpp
+++ b/src/game/ChatHandler.cpp
@@ -209,8 +209,13 @@ void WorldSession::HandleMessagechatOpcode( WorldPacket & recv_data )
            uint32 pSecurity = player ? player->GetSession()->GetSecurity() : SEC_PLAYER;
            if (!player || (tSecurity == SEC_PLAYER && pSecurity > SEC_PLAYER && !player->isAcceptWhispers()))
            {
-                SendPlayerNotFoundNotice(to);
+                QueryResult *result = CharacterDatabase.PQuery("SELECT guid FROM characters WHERE name = '%s' AND online != 0", to.c_str());
+                if (!result)
+                    SendPlayerNotFoundNotice(to);
+
                return;
+
+                delete result;
            }

            if (!sWorld.getConfig(CONFIG_BOOL_ALLOW_TWO_SIDE_INTERACTION_CHAT) && tSecurity == SEC_PLAYER && pSecurity == SEC_PLAYER )
diff --git a/src/game/MiscHandler.cpp b/src/game/MiscHandler.cpp
index 6e4f43c..105bb65 100644
--- a/src/game/MiscHandler.cpp
+++ b/src/game/MiscHandler.cpp
@@ -249,11 +249,44 @@ void WorldSession::HandleWhoOpcode( WorldPacket & recv_data )
            break;
    }

+    if (clientcount < 49)
+    {
+        // Fake players on WHO LIST                            0,   1,    2,   3,    4,   5     6
+        QueryResult *result = CharacterDatabase.Query("SELECT guid,name,race,class,level,zone,gender FROM characters WHERE online>1");
+        if (result)
+        {
+            do
+            {
+                Field *fields = result->Fetch();
+
+                std::string pname = fields[1].GetCppString();
+                std::string gname;
+                uint8 lvl = fields[4].GetUInt8();
+                uint32 class_ = fields[3].GetUInt32();
+                uint32 race = fields[2].GetUInt32();
+                uint32 pzoneid = fields[5].GetUInt32();
+                uint8 gender = fields[6].GetUInt8();
+
+                data << pname;                              // player name
+                data << gname;                              // guild name
+                data << uint32(lvl);                        // player level
+                data << uint32(class_);                     // player class
+                data << uint32(race);                       // player race
+                data << uint8(gender);                      // player gender
+                data << uint32(pzoneid);                    // player zone id
+
+                if ((++clientcount) == 49)
+                    break;
+            } while (result->NextRow());
+        }
+        delete result;
+    }
+
    uint32 count = m.size();
    data.put( 0, clientcount );                             // insert right count, listed count
    data.put( 4, count > 50 ? count : clientcount );        // insert right count, online count

    SendPacket(&data);
    DEBUG_LOG( "WORLD: Send SMSG_WHO Message" );
}

Link to comment
Share on other sites

Kicho wehn you have time can you look this for ManGos Zero Pls =)

I did, need test.

diff --git a/src/game/ChatHandler.cpp b/src/game/ChatHandler.cpp
index 0d80814..cca4e42 100644
--- a/src/game/ChatHandler.cpp
+++ b/src/game/ChatHandler.cpp
@@ -198,10 +198,15 @@ void WorldSession::HandleMessagechatOpcode( WorldPacket & recv_data )
            uint32 pSecurity = player ? player->GetSession()->GetSecurity() : SEC_PLAYER;
            if (!player || (tSecurity == SEC_PLAYER && pSecurity > SEC_PLAYER && !player->isAcceptWhispers()))
            {
-                WorldPacket data(SMSG_CHAT_PLAYER_NOT_FOUND, (to.size()+1));
-                data<<to;
-                SendPacket(&data);
-                return;
+                QueryResult *result = CharacterDatabase.PQuery("SELECT guid FROM characters WHERE name = '%s' AND online > 1", to.c_str());
+                if (!result)
+                {
+                     WorldPacket data(SMSG_CHAT_PLAYER_NOT_FOUND, (to.size()+1));
+                    data<<to;
+                    SendPacket(&data);
+                }
+                return;
+                delete result;
            }

            if (!sWorld.getConfig(CONFIG_BOOL_ALLOW_TWO_SIDE_INTERACTION_CHAT) && tSecurity == SEC_PLAYER && pSecurity == SEC_PLAYER )
diff --git a/src/game/MiscHandler.cpp b/src/game/MiscHandler.cpp
index 75a9798..97d5168 100644
--- a/src/game/MiscHandler.cpp
+++ b/src/game/MiscHandler.cpp
@@ -157,9 +157,9 @@ void WorldSession::HandleWhoOpcode( WorldPacket & recv_data )
                continue;
        }

-        // do not process players which are not in world
+        /* // do not process players which are not in world
        if(!(itr->second->IsInWorld()))
-            continue;
+            continue; */

        // check if target is globally visible for player
        if (!(itr->second->IsVisibleGloballyFor(_player)))
@@ -247,6 +247,38 @@ void WorldSession::HandleWhoOpcode( WorldPacket & recv_data )
        if ((++clientcount) == 49)
            break;
    }
+    if (clientcount < 49)
+    {
+        // Fake players on WHO LIST                            0,   1,    2,   3,    4,   5     6
+        QueryResult *result = CharacterDatabase.Query("SELECT guid,name,race,class,level,zone,gender FROM characters WHERE online>1");
+        if (result)
+        {
+            do
+            {
+                Field *fields = result->Fetch();
+
+                std::string pname = fields[1].GetCppString();
+                std::string gname;
+                uint8 lvl = fields[4].GetUInt8();
+                uint32 class_ = fields[3].GetUInt32();
+                uint32 race = fields[2].GetUInt32();
+                uint32 pzoneid = fields[5].GetUInt32();
+                uint8 gender = fields[6].GetUInt8();
+
+                data << pname;                              // player name
+                data << gname;                              // guild name
+                data << uint32(lvl);                        // player level
+                data << uint32(class_);                     // player class
+                data << uint32(race);                       // player race
+                data << uint8(gender);                      // player gender
+                data << uint32(pzoneid);                    // player zone id
+
+                if ((++clientcount) == 49)
+                    break;
+            } while (result->NextRow());
+        }
+        delete result;
+    }

    uint32 count = m.size();
    data.put( 0, clientcount );                             // insert right count, listed count

add

Compiled without errors, but not show fake player in who list. May be classic has another pocket structure.

Link to comment
Share on other sites

@salja & fedr

i cannot use mangoszero but as I can see there is no gender field in classic, you should drop

data << uint8(gender);

and test...so fedr patch should work if you drop gender field ...anyway this is not a place to discuss mangoszero

Link to comment
Share on other sites

  • 4 weeks later...

same as i thought of, don't know if online=2 players are custom players or random players

if they are custom players, wich never realy be played, than it wouldn't be necessary, but if they are reeal player wich are just "online" than it could be dificult ( e.G. online in who list but not in guild list / friendlist etc) i think player could find out ( or think it is a bug )

Link to comment
Share on other sites

I had time to think about this mode.

Some idea:

1) Why only 49 players?

2) What about online in site?

3) Player can find his second char from his account, so fake char must be in own tables

4) Fake player always stay at one level + at one location (may be need to update it's?)

5) Many fake online player just startup server - is strange... Need some uptime itneruption/

6) Add 3 param to config: max fake player, diff for max online player (always fixed online player is strange too) (+/- 50 players), time for update count of fake-player online (for 5 point)

I understund that it is fantastic for this mod, but it's just my ideas =)

Link to comment
Share on other sites

Perhaps someone can explain what this fake player business is all about?

Same question, even if I have my own reason.

Low populated public server, new players see the 3 players connected and think "this is shit, nobody's there, I'm not playing on this server."

Fake players : "Oh ! 50 connected! That's a good start. Let's have a look at this server"

Does anyone have a better reason than that?...

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. Privacy Policy Terms of Use