From f71f61e51bc98f4e28200d5d9462788652bfeec8 Mon Sep 17 00:00:00 2001
From: alterdekim <alterwain@protonmail.com>
Date: Sun, 2 Jun 2024 04:41:50 +0300
Subject: [PATCH] refactoring. Decrypting new packet.

---
 .../hearthhack/component/TcpConnection.java   |   2 +
 .../processor/GameUtilitiesProcessor.java     | 791 +++++++++++-------
 .../hearthhack/util/PegasusPacket.java        |  99 +++
 src/main/proto/bnet/protocol/protocol.proto   | 425 ++++++++++
 4 files changed, 1032 insertions(+), 285 deletions(-)
 create mode 100644 src/main/java/com/alterdekim/hearthhack/util/PegasusPacket.java

diff --git a/src/main/java/com/alterdekim/hearthhack/component/TcpConnection.java b/src/main/java/com/alterdekim/hearthhack/component/TcpConnection.java
index d8dbca0..9adffde 100644
--- a/src/main/java/com/alterdekim/hearthhack/component/TcpConnection.java
+++ b/src/main/java/com/alterdekim/hearthhack/component/TcpConnection.java
@@ -2,6 +2,7 @@ package com.alterdekim.hearthhack.component;
 
 import com.alterdekim.hearthhack.component.processor.*;
 import com.alterdekim.hearthhack.util.BattleNetPacket;
+import com.alterdekim.hearthhack.util.Util;
 import lombok.Getter;
 import lombok.extern.slf4j.Slf4j;
 
@@ -36,6 +37,7 @@ public class TcpConnection extends Thread {
     }
 
     public void send(BattleNetPacket bp) throws Exception {
+        log.info("TcpConnection.send: service={}, method={}, body={}", bp.getHeader().getServiceId(), bp.getHeader().getMethodId(), Util.bytesToHex(bp.getBody()));
         this.outToClient.write(bp.Encode());
         this.outToClient.flush();
     }
diff --git a/src/main/java/com/alterdekim/hearthhack/component/processor/GameUtilitiesProcessor.java b/src/main/java/com/alterdekim/hearthhack/component/processor/GameUtilitiesProcessor.java
index 9acf9b4..6d26805 100644
--- a/src/main/java/com/alterdekim/hearthhack/component/processor/GameUtilitiesProcessor.java
+++ b/src/main/java/com/alterdekim/hearthhack/component/processor/GameUtilitiesProcessor.java
@@ -316,7 +316,7 @@ public class GameUtilitiesProcessor extends Processor {
 
         //Protocol.BoosterList boosterList = Protocol.BoosterList.newBuilder().build();
 
-        n = generateNotification(224, ByteString.EMPTY, 0);
+        n = generateEmptyNotification(224);
 
         header = Protocol.Header.newBuilder()
                 .setServiceId(4)
@@ -333,7 +333,7 @@ public class GameUtilitiesProcessor extends Processor {
     private void processCollection(int token, TcpConnection conn) throws Exception {
        // Protocol.Collection collection = Protocol.Collection.newBuilder().build();
 
-        Protocol.Notification n = generateNotification(207, ByteString.EMPTY, 0);
+        Protocol.Notification n = generateEmptyNotification(207);
 
         Protocol.Header header = Protocol.Header.newBuilder()
                 .setServiceId(4)
@@ -535,9 +535,394 @@ public class GameUtilitiesProcessor extends Processor {
         conn.send(new BattleNetPacket(header, b));
     }
 
-    private void processRewardProgress(TcpConnection conn) {
-        // Protocol.RewardProgress
-        // Notification 271
+    private void processRewardProgress(TcpConnection conn) throws Exception {
+        Protocol.RewardProgress rewardProgress = Protocol.RewardProgress.newBuilder()
+                .setSeasonEnd(Protocol.Date.newBuilder()
+                        .setYear(2016)
+                        .setMonth(5)
+                        .setDay(31)
+                        .setHours(22)
+                        .setMin(6)
+                        .setSec(18))
+                .setWinsPerGold(3)
+                .setGoldPerReward(10)
+                .setMaxGoldPerDay(100)
+                .setSeasonNumber(31)
+                .setXpSoloLimit(60)
+                .setMaxHeroLevel(60)
+                .setEventTimingMod(-0.08333333f)
+                .setNextQuestCancel(Protocol.Date.newBuilder()
+                        .setYear(2016)
+                        .setMonth(5)
+                        .setDay(3)
+                        .setHours(0)
+                        .setMin(0)
+                        .setSec(0))
+                .build();
+
+        Protocol.Notification n = generateNotification(271, rewardProgress.toByteString(), rewardProgress.getSerializedSize());
+
+        Protocol.Header header = Protocol.Header.newBuilder()
+                .setServiceId(4)
+                .setMethodId(1)
+                .setToken(conn.nextToken())
+                .setObjectId(0)
+                .setSize(n.getSerializedSize())
+                .setStatus(0)
+                .build();
+
+        conn.send(new BattleNetPacket(header, n.toByteArray()));
+    }
+
+    private void processPlayerRecords(TcpConnection conn) throws Exception {
+        Protocol.PlayerRecords playerRecords = Protocol.PlayerRecords.newBuilder()
+                .addRecords(Protocol.PlayerRecord.newBuilder()
+                        .setType(Protocol.GameType.GT_VS_AI)
+                        .setWins(1)
+                        .setLosses(0))
+                .addRecords(Protocol.PlayerRecord.newBuilder()
+                        .setType(Protocol.GameType.GT_VS_AI)
+                        .setData(637)
+                        .setWins(1)
+                        .setLosses(0))
+                .addRecords(Protocol.PlayerRecord.newBuilder()
+                        .setType(Protocol.GameType.GT_TUTORIAL)
+                        .setWins(6)
+                        .setLosses(1))
+                .addRecords(Protocol.PlayerRecord.newBuilder()
+                        .setType(Protocol.GameType.GT_TUTORIAL)
+                        .setData(637)
+                        .setWins(1)
+                        .setLosses(0))
+                .addRecords(Protocol.PlayerRecord.newBuilder()
+                        .setType(Protocol.GameType.GT_TUTORIAL)
+                        .setData(1325)
+                        .setWins(5)
+                        .setLosses(1))
+                .build();
+
+
+        Protocol.Notification n = generateNotification(270, playerRecords.toByteString(), playerRecords.getSerializedSize());
+
+        Protocol.Header header = Protocol.Header.newBuilder()
+                .setServiceId(4)
+                .setMethodId(1)
+                .setToken(conn.nextToken())
+                .setObjectId(0)
+                .setSize(n.getSerializedSize())
+                .setStatus(0)
+                .build();
+
+        conn.send(new BattleNetPacket(header, n.toByteArray()));
+    }
+
+    private void processDustBalance(TcpConnection conn) throws Exception {
+        Protocol.ArcaneDustBalance dustBalance = Protocol.ArcaneDustBalance.newBuilder()
+                .setBalance(665)
+                .build();
+
+        Protocol.Notification n = generateNotification(262, dustBalance.toByteString(), dustBalance.getSerializedSize());
+
+        Protocol.Header header = Protocol.Header.newBuilder()
+                .setServiceId(4)
+                .setMethodId(1)
+                .setToken(conn.nextToken())
+                .setObjectId(0)
+                .setSize(n.getSerializedSize())
+                .setStatus(0)
+                .build();
+
+        conn.send(new BattleNetPacket(header, n.toByteArray()));
+    }
+
+    private void processClientOptions(TcpConnection conn) throws Exception {
+        Protocol.ClientOptions clientOptions = Protocol.ClientOptions.newBuilder()
+                .addOptions(Protocol.ClientOption.newBuilder()
+                        .setIndex(24)
+                        .setAsInt32(3))
+                .addOptions(Protocol.ClientOption.newBuilder()
+                        .setIndex(1)
+                        .setAsUint64(13514148956663808L))
+                .addOptions(Protocol.ClientOption.newBuilder()
+                        .setIndex(2)
+                        .setAsUint64(549755813888L))
+                .addOptions(Protocol.ClientOption.newBuilder()
+                        .setIndex(20)
+                        .setAsInt32(2))
+                .addOptions(Protocol.ClientOption.newBuilder()
+                        .setIndex(21)
+                        .setAsInt32(1))
+                .addOptions(Protocol.ClientOption.newBuilder()
+                        .setIndex(8)
+                        .setAsInt32(4))
+                .addOptions(Protocol.ClientOption.newBuilder()
+                        .setIndex(10)
+                        .setAsInt32(1))
+                .build();
+
+        Protocol.Notification n = generateNotification(241, clientOptions.toByteString(), clientOptions.getSerializedSize());
+
+        Protocol.Header header = Protocol.Header.newBuilder()
+                .setServiceId(4)
+                .setMethodId(1)
+                .setToken(conn.nextToken())
+                .setObjectId(0)
+                .setSize(n.getSerializedSize())
+                .setStatus(0)
+                .build();
+
+        conn.send(new BattleNetPacket(header, n.toByteArray()));
+    }
+
+    private void processHeroXP(TcpConnection conn) throws Exception {
+
+        Protocol.HeroXP xp = Protocol.HeroXP.newBuilder()
+                .addXpInfos(Protocol.HeroXPInfo.newBuilder()
+                        .setClassId(2)
+                        .setLevel(1)
+                        .setCurrXp(0)
+                        .setMaxXp(70)
+                        .setNextReward(Protocol.NextHeroLevelReward.newBuilder()
+                                .setLevel(2)
+                                .setRewardCard(Protocol.ProfileNoticeRewardCard.newBuilder()
+                                        .setCard(Protocol.CardDef.newBuilder()
+                                                .setAsset(823)
+                                                .setPremium(0))
+                                        .setQuantity(2))
+                        ))
+                .addXpInfos(Protocol.HeroXPInfo.newBuilder()
+                        .setClassId(3)
+                        .setLevel(1)
+                        .setCurrXp(0)
+                        .setMaxXp(70)
+                        .setNextReward(Protocol.NextHeroLevelReward.newBuilder()
+                                .setLevel(2)
+                                .setRewardCard(Protocol.ProfileNoticeRewardCard.newBuilder()
+                                        .setCard(Protocol.CardDef.newBuilder()
+                                                .setAsset(437)
+                                                .setPremium(0))
+                                        .setQuantity(2))
+                        ))
+                .addXpInfos(Protocol.HeroXPInfo.newBuilder()
+                        .setClassId(4)
+                        .setLevel(2)
+                        .setCurrXp(12)
+                        .setMaxXp(80)
+                        .setNextReward(Protocol.NextHeroLevelReward.newBuilder()
+                                .setLevel(4)
+                                .setRewardCard(Protocol.ProfileNoticeRewardCard.newBuilder()
+                                        .setCard(Protocol.CardDef.newBuilder()
+                                                .setAsset(1084)
+                                                .setPremium(0))
+                                        .setQuantity(2))
+                        ))
+                .addXpInfos(Protocol.HeroXPInfo.newBuilder()
+                        .setClassId(5)
+                        .setLevel(1)
+                        .setCurrXp(0)
+                        .setMaxXp(70)
+                        .setNextReward(Protocol.NextHeroLevelReward.newBuilder()
+                                .setLevel(2)
+                                .setRewardCard(Protocol.ProfileNoticeRewardCard.newBuilder()
+                                        .setCard(Protocol.CardDef.newBuilder()
+                                                .setAsset(847)
+                                                .setPremium(0))
+                                        .setQuantity(2))
+                        ))
+                .addXpInfos(Protocol.HeroXPInfo.newBuilder()
+                        .setClassId(6)
+                        .setLevel(1)
+                        .setCurrXp(0)
+                        .setMaxXp(70)
+                        .setNextReward(Protocol.NextHeroLevelReward.newBuilder()
+                                .setLevel(2)
+                                .setRewardCard(Protocol.ProfileNoticeRewardCard.newBuilder()
+                                        .setCard(Protocol.CardDef.newBuilder()
+                                                .setAsset(1361)
+                                                .setPremium(0))
+                                        .setQuantity(2))
+                        ))
+                .addXpInfos(Protocol.HeroXPInfo.newBuilder()
+                        .setClassId(7)
+                        .setLevel(1)
+                        .setCurrXp(0)
+                        .setMaxXp(70)
+                        .setNextReward(Protocol.NextHeroLevelReward.newBuilder()
+                                .setLevel(2)
+                                .setRewardCard(Protocol.ProfileNoticeRewardCard.newBuilder()
+                                        .setCard(Protocol.CardDef.newBuilder()
+                                                .setAsset(421)
+                                                .setPremium(0))
+                                        .setQuantity(2))
+                        ))
+                .addXpInfos(Protocol.HeroXPInfo.newBuilder()
+                        .setClassId(8)
+                        .setLevel(1)
+                        .setCurrXp(0)
+                        .setMaxXp(70)
+                        .setNextReward(Protocol.NextHeroLevelReward.newBuilder()
+                                .setLevel(2)
+                                .setRewardCard(Protocol.ProfileNoticeRewardCard.newBuilder()
+                                        .setCard(Protocol.CardDef.newBuilder()
+                                                .setAsset(1171)
+                                                .setPremium(0))
+                                        .setQuantity(2))
+                        ))
+                .addXpInfos(Protocol.HeroXPInfo.newBuilder()
+                        .setClassId(9)
+                        .setLevel(1)
+                        .setCurrXp(0)
+                        .setMaxXp(70)
+                        .setNextReward(Protocol.NextHeroLevelReward.newBuilder()
+                                .setLevel(2)
+                                .setRewardCard(Protocol.ProfileNoticeRewardCard.newBuilder()
+                                        .setCard(Protocol.CardDef.newBuilder()
+                                                .setAsset(982)
+                                                .setPremium(0))
+                                        .setQuantity(2))
+                        ))
+                .addXpInfos(Protocol.HeroXPInfo.newBuilder()
+                        .setClassId(10)
+                        .setLevel(1)
+                        .setCurrXp(0)
+                        .setMaxXp(70)
+                        .setNextReward(Protocol.NextHeroLevelReward.newBuilder()
+                                .setLevel(2)
+                                .setRewardCard(Protocol.ProfileNoticeRewardCard.newBuilder()
+                                        .setCard(Protocol.CardDef.newBuilder()
+                                                .setAsset(940)
+                                                .setPremium(0))
+                                        .setQuantity(2))
+                        ))
+                .build();
+
+        Protocol.Notification n = generateNotification(283, xp.toByteString(), xp.getSerializedSize());
+
+        Protocol.Header header = Protocol.Header.newBuilder()
+                .setServiceId(4)
+                .setMethodId(1)
+                .setToken(conn.nextToken())
+                .setObjectId(0)
+                .setSize(n.getSerializedSize())
+                .setStatus(0)
+                .build();
+
+        conn.send(new BattleNetPacket(header, n.toByteArray()));
+    }
+
+    private void processFavoriteHeroes(TcpConnection conn) throws Exception {
+        Protocol.FavoriteHeroesResponse favoriteHeroesResponse = Protocol.FavoriteHeroesResponse.newBuilder()
+                .addFavoriteHeroes(Protocol.FavoriteHero.newBuilder()
+                        .setClassId(2)
+                        .setHero(Protocol.CardDef.newBuilder()
+                                .setAsset(274)
+                                .setPremium(0)))
+                .addFavoriteHeroes(Protocol.FavoriteHero.newBuilder()
+                        .setClassId(3)
+                        .setHero(Protocol.CardDef.newBuilder()
+                                .setAsset(31)
+                                .setPremium(0)))
+                .addFavoriteHeroes(Protocol.FavoriteHero.newBuilder()
+                        .setClassId(4)
+                        .setHero(Protocol.CardDef.newBuilder()
+                                .setAsset(637)
+                                .setPremium(0)))
+                .addFavoriteHeroes(Protocol.FavoriteHero.newBuilder()
+                        .setClassId(5)
+                        .setHero(Protocol.CardDef.newBuilder()
+                                .setAsset(671)
+                                .setPremium(0)))
+                .addFavoriteHeroes(Protocol.FavoriteHero.newBuilder()
+                        .setClassId(6)
+                        .setHero(Protocol.CardDef.newBuilder()
+                                .setAsset(813)
+                                .setPremium(0)))
+                .addFavoriteHeroes(Protocol.FavoriteHero.newBuilder()
+                        .setClassId(7)
+                        .setHero(Protocol.CardDef.newBuilder()
+                                .setAsset(930)
+                                .setPremium(0)))
+                .addFavoriteHeroes(Protocol.FavoriteHero.newBuilder()
+                        .setClassId(8)
+                        .setHero(Protocol.CardDef.newBuilder()
+                                .setAsset(1066)
+                                .setPremium(0)))
+                .addFavoriteHeroes(Protocol.FavoriteHero.newBuilder()
+                        .setClassId(9)
+                        .setHero(Protocol.CardDef.newBuilder()
+                                .setAsset(893)
+                                .setPremium(0)))
+                .addFavoriteHeroes(Protocol.FavoriteHero.newBuilder()
+                        .setClassId(10)
+                        .setHero(Protocol.CardDef.newBuilder()
+                                .setAsset(7)
+                                .setPremium(0)))
+                .build();
+
+        Protocol.Notification n = generateNotification(318, favoriteHeroesResponse.toByteString(), favoriteHeroesResponse.getSerializedSize());
+
+        Protocol.Header header = Protocol.Header.newBuilder()
+                .setServiceId(4)
+                .setMethodId(1)
+                .setToken(conn.nextToken())
+                .setObjectId(0)
+                .setSize(n.getSerializedSize())
+                .setStatus(0)
+                .build();
+
+        conn.send(new BattleNetPacket(header, n.toByteArray()));
+    }
+
+    private void processCardBacks(TcpConnection conn) throws Exception {
+        Protocol.CardBacks cardBacks = Protocol.CardBacks.newBuilder()
+                .setDefaultCardBack(0)
+                .build();
+
+        Protocol.Notification n = generateNotification(236, cardBacks.toByteString(), cardBacks.getSerializedSize());
+
+        Protocol.Header header = Protocol.Header.newBuilder()
+                .setServiceId(4)
+                .setMethodId(1)
+                .setToken(conn.nextToken())
+                .setObjectId(0)
+                .setSize(n.getSerializedSize())
+                .setStatus(0)
+                .build();
+
+        conn.send(new BattleNetPacket(header, n.toByteArray()));
+    }
+
+    private void processAccountLicensesInfo(TcpConnection conn) throws Exception {
+        // Protocol.AccountLicensesInfoResponse
+
+        Protocol.Notification n = generateEmptyNotification(325);
+
+        Protocol.Header header = Protocol.Header.newBuilder()
+                .setServiceId(4)
+                .setMethodId(1)
+                .setToken(conn.nextToken())
+                .setObjectId(0)
+                .setSize(n.getSerializedSize())
+                .setStatus(0)
+                .build();
+
+        conn.send(new BattleNetPacket(header, n.toByteArray()));
+    }
+
+    private void processProfileNotices(TcpConnection conn) throws Exception {
+        // Protocol.ProfileNotices
+        Protocol.Notification n = generateEmptyNotification(212);
+
+        Protocol.Header header = Protocol.Header.newBuilder()
+                .setServiceId(4)
+                .setMethodId(1)
+                .setToken(conn.nextToken())
+                .setObjectId(0)
+                .setSize(n.getSerializedSize())
+                .setStatus(0)
+                .build();
+
+        conn.send(new BattleNetPacket(header, n.toByteArray()));
     }
 
     private void parseGenericRequest(int token, Protocol.UtilGenericRequest genericRequest, TcpConnection conn) {
@@ -548,13 +933,20 @@ public class GameUtilitiesProcessor extends Processor {
                 case GOLD_BALANCE -> processGoldBalance(conn);
                 case CAMPAIGN_INFO -> processProfileProgress(token, conn);
                 case DECK_LIST -> processDeckList(token, conn);
-                // case ARCANE_DUST_BALANCE; case CLIENT_OPTIONS;
+                case CLIENT_OPTIONS -> processClientOptions(conn);
+                case ARCANE_DUST_BALANCE -> processDustBalance(conn);
                 case CARD_VALUES -> processCardValues(conn);
                 case COLLECTION -> processCollection(token, conn);
                 case BOOSTERS -> processBoosters(token, conn);
                 case MEDAL_INFO -> processMedalInfo(conn);
                 case NOT_SO_MASSIVE_LOGIN -> processNotSoMassiveLoginReply(conn);
                 case REWARD_PROGRESS -> processRewardProgress(conn);
+                case PLAYER_RECORD -> processPlayerRecords(conn);
+                case HERO_XP -> processHeroXP(conn);
+                case FAVORITE_HEROES -> processFavoriteHeroes(conn);
+                case CARD_BACKS -> processCardBacks(conn);
+                case ACCOUNT_LICENSES -> processAccountLicensesInfo(conn);
+                case NOTICES -> processProfileNotices(conn);
                 default -> log.warn("Unknown generic request: {}", req);
             }
         } catch (Exception e) {
@@ -563,43 +955,28 @@ public class GameUtilitiesProcessor extends Processor {
     }
 
     private void parseRequestNetCacheObjectList(int token, ClientRequestBody body, TcpConnection conn) throws InvalidProtocolBufferException {
+        log.info("parseRequestNetCacheObjectList");
         Protocol.GenericRequestList genericRequestList = Protocol.GenericRequestList.parseFrom(body.getBody());
         genericRequestList.getRequestsList().forEach(gr -> this.parseGenericRequest(token, gr, conn));
     }
 
     private void parseSubscriptionRequest(BattleNetPacket packet, TcpConnection conn) throws Exception {
+        log.info("parseSubscriptionRequest: got");
         Protocol.Header header = Processor.generateResponse(37, packet.getHeader().getToken(), 0, 0);
         conn.send(new BattleNetPacket(header, Util.hexStringToByteArray("0A090A026964120318BB020A180A0570726F746F120F320D084918AC0220002800300F4078")));
     }
 
     private void parseGetAssetsVersion(BattleNetPacket packet, TcpConnection conn) throws Exception {
+        log.info("parseGetAssetsVersion: got");
         Protocol.Header header = Processor.generateResponse(29, packet.getHeader().getToken(), 0, 0);
 
         conn.send(new BattleNetPacket(header, Util.hexStringToByteArray("0A090A026964120318C6020A100A0570726F746F12073205080110AF02")));
 
-        Protocol.GuardianVars guardianVars = Protocol.GuardianVars.newBuilder()
-                .setShowUserUi(1)
-                .setClientOptionsUpdateIntervalSeconds(300)
-                .build();
-
-        Protocol.Notification n = generateNotification(264, guardianVars.toByteString(), guardianVars.getSerializedSize());
-
-        header = Protocol.Header.newBuilder()
-                .setServiceId(4)
-                .setMethodId(1)
-                .setToken(conn.nextToken())
-                .setStatus(0)
-                .setObjectId(0)
-                .setSize(n.getSerializedSize())
-                .build();
-
-        conn.send(new BattleNetPacket(header, n.toByteArray()));
-
         Protocol.AssetsVersionResponse assetsVersionResponse = Protocol.AssetsVersionResponse.newBuilder()
                 .setVersion(11046)
                 .build();
 
-        n = generateNotification(304, assetsVersionResponse.toByteString(), assetsVersionResponse.getSerializedSize());
+        Protocol.Notification n = generateNotification(304, assetsVersionResponse.toByteString(), assetsVersionResponse.getSerializedSize());
 
         header = Protocol.Header.newBuilder()
                 .setServiceId(4)
@@ -614,6 +991,7 @@ public class GameUtilitiesProcessor extends Processor {
     }
 
     private void parseCheckAccountLicenses(BattleNetPacket packet, TcpConnection conn) throws Exception {
+        log.info("parseCheckAccountLicenses: got");
         // CheckAccountLicensesResponse
         Protocol.Header header = Processor.generateResponse(29, packet.getHeader().getToken(), 0, 0);
         conn.send(new BattleNetPacket(header, Util.hexStringToByteArray("0A090A026964120318C6020A100A0570726F746F120732050801108B02")));
@@ -638,14 +1016,30 @@ public class GameUtilitiesProcessor extends Processor {
     }
 
     private void parseUpdateLogin(BattleNetPacket packet, TcpConnection conn) throws Exception {
+        log.info("parseUpdateLogin: got");
         //Protocol.UpdateLogin updateLogin = Protocol.UpdateLogin.parseFrom(body.getBody());
         Protocol.Header header = Processor.generateResponse(29, packet.getHeader().getToken(), 0, 0);
         conn.send(new BattleNetPacket(header, Util.hexStringToByteArray("0A090A026964120318C6020A100A0570726F746F12073205080110CD01")));
+
+        Protocol.UpdateLoginComplete updateLoginComplete = Protocol.UpdateLoginComplete.newBuilder().build();
+
+        Protocol.Notification n = generateNotification(307, updateLoginComplete.toByteString(), updateLoginComplete.getSerializedSize());
+
+        header = Protocol.Header.newBuilder()
+                .setServiceId(4)
+                .setMethodId(1)
+                .setToken(conn.nextToken())
+                .setObjectId(0)
+                .setSize(n.getSerializedSize())
+                .setStatus(0)
+                .build();
+
+        conn.send(new BattleNetPacket(header, n.toByteArray()));
     }
 
     private void parseCheckGameLicenses(BattleNetPacket packet, TcpConnection conn) throws Exception {
         // CheckGameLicensesResponse
-
+        log.info("parseCheckGameLicenses: got");
         Protocol.Header header = Processor.generateResponse(29, packet.getHeader().getToken(), 0, 0);
         conn.send(new BattleNetPacket(header, Util.hexStringToByteArray("0A090A026964120318C6020A100A0570726F746F120732050801109402")));
 
@@ -685,22 +1079,6 @@ public class GameUtilitiesProcessor extends Processor {
 
         conn.send(new BattleNetPacket(header, n.toByteArray()));
 
-
-        Protocol.UpdateLoginComplete updateLoginComplete = Protocol.UpdateLoginComplete.newBuilder().build();
-
-        n = generateNotification(307, updateLoginComplete.toByteString(), updateLoginComplete.getSerializedSize());
-
-        header = Protocol.Header.newBuilder()
-                .setServiceId(4)
-                .setMethodId(1)
-                .setToken(conn.nextToken())
-                .setObjectId(0)
-                .setSize(n.getSerializedSize())
-                .setStatus(0)
-                .build();
-
-        conn.send(new BattleNetPacket(header, n.toByteArray()));
-
         Protocol.CheckGameLicensesResponse checkGameLicensesResponse = Protocol.CheckGameLicensesResponse.newBuilder()
                 .setSuccess(true)
                 .build();
@@ -721,18 +1099,55 @@ public class GameUtilitiesProcessor extends Processor {
     }
 
     private void parseGetAdventureProgress(BattleNetPacket packet, TcpConnection conn) throws Exception {
+        log.info("parseGetAdventureProgress: got");
         byte[] b = Util.hexStringToByteArray("0A090A026964120318C6020A100A0570726F746F12073205080110B102");
         Protocol.Header header = Processor.generateResponse(b.length, packet.getHeader().getToken(), 0, 0);
         conn.send(new BattleNetPacket(header, b));
+
+       /* Protocol.AdventureProgressResponse progressResponse = Protocol.AdventureProgressResponse.newBuilder()
+                .build();*/
+
+       // Protocol.Notification n = generateNotification(306, progressResponse.toByteString(), progressResponse.getSerializedSize());
+        Protocol.Notification n = generateEmptyNotification(306);
+
+        header = Protocol.Header.newBuilder()
+                .setServiceId(4)
+                .setMethodId(1)
+                .setToken(conn.nextToken())
+                .setObjectId(0)
+                .setSize(n.getSerializedSize())
+                .setStatus(0)
+                .build();
+
+        conn.send(new BattleNetPacket(header, n.toByteArray()));
     }
 
     private void parseGetBattlePayConfig(ClientRequestBody body) {
         log.info("parseGetBattlePayConfig: got");
     }
 
-    private void parseGetAchieves(ClientRequestBody body) throws InvalidProtocolBufferException {
+    private void parseGetAchieves(int token, ClientRequestBody body, TcpConnection conn) throws Exception {
         Protocol.GetAchieves getAchieves = Protocol.GetAchieves.parseFrom(body.getBody());
         log.info("parseGetAchieves: {}", getAchieves);
+
+        byte[] b = Util.hexStringToByteArray("0A090A026964120318C6020A100A0570726F746F12073205080110FD01");
+
+        Protocol.Header header = Processor.generateResponse(b.length, token, 0, 0);
+
+        conn.send(new BattleNetPacket(header, b));
+        // Achieves
+        b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318FC0122A82F0A0C667261676D656E745F30303012972F32942F0A28080210011801200130013A0D08E00F10041818200928243015420D08E00F100418182009282430150A28080310011801200130013A0D08E00F100418182009281E300A420D08E00F100418182009281E300A0A31080F100118FFFFFFFFFFFFFFFFFF01280130013A0D08E00F10041818200928243015420D08E00F100418182009282430150A310818100118FFFFFFFFFFFFFFFFFF01280130013A0D08E00F10041818200928243015420D08E00F100418182009282430150A31083E100118FFFFFFFFFFFFFFFFFF01280130013A0D08E00F10041818200928243015420D08E00F100418182009282430150A31083F100118FFFFFFFFFFFFFFFFFF01280130013A0D08E00F10041818200928243015420D08E00F100418182009282430150A28084110011801200130013A0D08E00F100418182009281E300A420D08E00F100418182009281E300A0A31084F100218FFFFFFFFFFFFFFFFFF01280130013A0D08E00F100418182009281E300A420D08E00F100418182009281E300A0A28086110011801200130013A0D08E00F100418182009281E300A420D08E00F100418182009281E300A0A2908D80110011801200130013A0D08E00F100418182009281E300A420D08E00F100418182009281E300A0A2908D90110011801280130013A0D08E00F100418182009281E300A420D08E00F100418182009281E300A0A130801100018FFFFFFFFFFFFFFFFFF01280148010A130804100018FFFFFFFFFFFFFFFFFF01280148010A130805100018FFFFFFFFFFFFFFFFFF01280148010A130806100018FFFFFFFFFFFFFFFFFF01280148010A130807100018FFFFFFFFFFFFFFFFFF01280148010A130808100018FFFFFFFFFFFFFFFFFF01280148010A130809100018FFFFFFFFFFFFFFFFFF01280148010A13080A100018FFFFFFFFFFFFFFFFFF01280148010A13080D100018FFFFFFFFFFFFFFFFFF01280148010A13080E100018FFFFFFFFFFFFFFFFFF01280148010A130810100018FFFFFFFFFFFFFFFFFF01280148010A130811100018FFFFFFFFFFFFFFFFFF01280148010A130812100018FFFFFFFFFFFFFFFFFF01280148010A130813100018FFFFFFFFFFFFFFFFFF01280148010A130814100018FFFFFFFFFFFFFFFFFF01280148010A130815100018FFFFFFFFFFFFFFFFFF01280148010A130816100018FFFFFFFFFFFFFFFFFF01280148010A130817100018FFFFFFFFFFFFFFFFFF01280148010A130819100018FFFFFFFFFFFFFFFFFF01280148010A13081A100018FFFFFFFFFFFFFFFFFF01280148010A13081B100018FFFFFFFFFFFFFFFFFF01280148010A13081C100018FFFFFFFFFFFFFFFFFF01280148010A13081D100018FFFFFFFFFFFFFFFFFF01280148010A13081E100018FFFFFFFFFFFFFFFFFF01280148010A130837100018FFFFFFFFFFFFFFFFFF01280148010A130839100018FFFFFFFFFFFFFFFFFF01280148010A13083A100018FFFFFFFFFFFFFFFFFF01280148010A13083B100018FFFFFFFFFFFFFFFFFF01280148010A13083C100018FFFFFFFFFFFFFFFFFF01280148010A13083D100018FFFFFFFFFFFFFFFFFF01280148010A130842100018FFFFFFFFFFFFFFFFFF01280148010A130843100018FFFFFFFFFFFFFFFFFF01280148010A130844100018FFFFFFFFFFFFFFFFFF01280148010A130846100018FFFFFFFFFFFFFFFFFF01280148010A130847100018FFFFFFFFFFFFFFFFFF01280148010A130848100018FFFFFFFFFFFFFFFFFF01280148010A130849100018FFFFFFFFFFFFFFFFFF01280148010A13084A100018FFFFFFFFFFFFFFFFFF01280148010A13084B100018FFFFFFFFFFFFFFFFFF01280148010A13084C100018FFFFFFFFFFFFFFFFFF01280148010A13084D100018FFFFFFFFFFFFFFFFFF01280148010A13084E100018FFFFFFFFFFFFFFFFFF01280148010A130850100018FFFFFFFFFFFFFFFFFF01280148010A130851100018FFFFFFFFFFFFFFFFFF01280148010A130852100018FFFFFFFFFFFFFFFFFF01280148010A130853100018FFFFFFFFFFFFFFFFFF01280148010A130854100018FFFFFFFFFFFFFFFFFF01280148010A130855100018FFFFFFFFFFFFFFFFFF01280148010A130856100018FFFFFFFFFFFFFFFFFF01280148010A130857100018FFFFFFFFFFFFFFFFFF01280148010A130858100018FFFFFFFFFFFFFFFFFF01280148010A130859100018FFFFFFFFFFFFFFFFFF01280148010A13085A100018FFFFFFFFFFFFFFFFFF01280148010A13085B100018FFFFFFFFFFFFFFFFFF01280148010A13085C100018FFFFFFFFFFFFFFFFFF01280148010A13085D100018FFFFFFFFFFFFFFFFFF01280148010A13085E100018FFFFFFFFFFFFFFFFFF01280148010A13085F100018FFFFFFFFFFFFFFFFFF01280148010A130860100018FFFFFFFFFFFFFFFFFF01280148010A130862100018FFFFFFFFFFFFFFFFFF01280148010A130863100018FFFFFFFFFFFFFFFFFF01280148010A130864100018FFFFFFFFFFFFFFFFFF01280148010A130865100018FFFFFFFFFFFFFFFFFF01280148010A130866100018FFFFFFFFFFFFFFFFFF01280148010A130867100018FFFFFFFFFFFFFFFFFF01280148010A130868100018FFFFFFFFFFFFFFFFFF01280148010A130869100018FFFFFFFFFFFFFFFFFF01280148010A13086A100018FFFFFFFFFFFFFFFFFF01280148010A13086B100018FFFFFFFFFFFFFFFFFF01280148010A13086C100018FFFFFFFFFFFFFFFFFF01280148010A13086D100018FFFFFFFFFFFFFFFFFF01280148010A13086E100018FFFFFFFFFFFFFFFFFF01280148010A130870100018FFFFFFFFFFFFFFFFFF01280148010A130871100018FFFFFFFFFFFFFFFFFF01280148010A130872100018FFFFFFFFFFFFFFFFFF01280148010A130873100018FFFFFFFFFFFFFFFFFF01280148010A130874100018FFFFFFFFFFFFFFFFFF01280148010A130875100018FFFFFFFFFFFFFFFFFF01280148010A130876100018FFFFFFFFFFFFFFFFFF01280148010A130877100018FFFFFFFFFFFFFFFFFF01280148010A130878100018FFFFFFFFFFFFFFFFFF01280148010A130879100018FFFFFFFFFFFFFFFFFF01280148010A13087F100018FFFFFFFFFFFFFFFFFF01280148010A14088001100018FFFFFFFFFFFFFFFFFF01280148010A14088101100018FFFFFFFFFFFFFFFFFF01280148010A14088201100018FFFFFFFFFFFFFFFFFF01280148010A14088301100018FFFFFFFFFFFFFFFFFF01280148010A14088401100018FFFFFFFFFFFFFFFFFF01280148010A14088501100018FFFFFFFFFFFFFFFFFF01280148010A14088601100018FFFFFFFFFFFFFFFFFF01280148010A14088701100018FFFFFFFFFFFFFFFFFF01280148010A14088801100018FFFFFFFFFFFFFFFFFF01280148010A14088901100018FFFFFFFFFFFFFFFFFF01280148010A14088A01100018FFFFFFFFFFFFFFFFFF01280148010A14088B01100018FFFFFFFFFFFFFFFFFF01280148010A14088C01100018FFFFFFFFFFFFFFFFFF01280148010A14088D01100018FFFFFFFFFFFFFFFFFF01280148010A14088E01100018FFFFFFFFFFFFFFFFFF01280148010A14088F01100018FFFFFFFFFFFFFFFFFF01280148010A14089001100018FFFFFFFFFFFFFFFFFF01280148010A14089101100018FFFFFFFFFFFFFFFFFF01280148010A14089201100018FFFFFFFFFFFFFFFFFF01280148010A14089301100018FFFFFFFFFFFFFFFFFF01280148010A14089401100018FFFFFFFFFFFFFFFFFF01280148010A14089501100018FFFFFFFFFFFFFFFFFF01280148010A14089601100018FFFFFFFFFFFFFFFFFF01280148010A14089701100018FFFFFFFFFFFFFFFFFF01280148010A14089801100018FFFFFFFFFFFFFFFFFF01280148010A14089901100018FFFFFFFFFFFFFFFFFF01280148010A14089A01100018FFFFFFFFFFFFFFFFFF01280148010A14089B01100018FFFFFFFFFFFFFFFFFF01280148010A14089C01100018FFFFFFFFFFFFFFFFFF01280148010A14089D01100018FFFFFFFFFFFFFFFFFF01280148010A14089E01100018FFFFFFFFFFFFFFFFFF01280148010A14089F01100018FFFFFFFFFFFFFFFFFF01280148010A1408A001100018FFFFFFFFFFFFFFFFFF01280148010A1408A101100018FFFFFFFFFFFFFFFFFF01280148010A1408A201100018FFFFFFFFFFFFFFFFFF01280148010A1408A301100018FFFFFFFFFFFFFFFFFF01280148010A1408A401100018FFFFFFFFFFFFFFFFFF01280148010A1408A501100018FFFFFFFFFFFFFFFFFF01280148010A1408A601100018FFFFFFFFFFFFFFFFFF01280148010A1408A701100018FFFFFFFFFFFFFFFFFF01280148010A1408A801100018FFFFFFFFFFFFFFFFFF01280148010A1408A901100018FFFFFFFFFFFFFFFFFF01280148010A1408AA01100018FFFFFFFFFFFFFFFFFF01280148010A1408AB01100018FFFFFFFFFFFFFFFFFF01280148010A1408AC01100018FFFFFFFFFFFFFFFFFF01280148010A1408AD01100018FFFFFFFFFFFFFFFFFF01280148010A1408AE01100018FFFFFFFFFFFFFFFFFF01280148010A1408AF01100018FFFFFFFFFFFFFFFFFF01280148010A1408B001100018FFFFFFFFFFFFFFFFFF01280148010A1408B101100018FFFFFFFFFFFFFFFFFF01280148010A1408B201100018FFFFFFFFFFFFFFFFFF01280148010A1408B301100018FFFFFFFFFFFFFFFFFF01280148010A1408B401100018FFFFFFFFFFFFFFFFFF01280148010A1408B501100018FFFFFFFFFFFFFFFFFF01280148010A1408B601100018FFFFFFFFFFFFFFFFFF01280148010A1408B701100018FFFFFFFFFFFFFFFFFF01280148010A1408B801100018FFFFFFFFFFFFFFFFFF01280148010A1408B901100018FFFFFFFFFFFFFFFFFF01280148010A1408BA01100018FFFFFFFFFFFFFFFFFF01280148010A1408BB01100018FFFFFFFFFFFFFFFFFF01280148010A1408BC01100018FFFFFFFFFFFFFFFFFF01280148010A1408BD01100018FFFFFFFFFFFFFFFFFF01280148010A1408BE01100018FFFFFFFFFFFFFFFFFF01280148010A1408BF01100018FFFFFFFFFFFFFFFFFF01280148010A1408C001100018FFFFFFFFFFFFFFFFFF01280148010A1408C101100018FFFFFFFFFFFFFFFFFF01280148010A1408C201100018FFFFFFFFFFFFFFFFFF01280148010A1408C301100018FFFFFFFFFFFFFFFFFF01280148010A1408C401100018FFFFFFFFFFFFFFFFFF01280148010A1408C501100018FFFFFFFFFFFFFFFFFF01280148010A1408C601100018FFFFFFFFFFFFFFFFFF01280148010A1408C701100018FFFFFFFFFFFFFFFFFF01280148010A1408C801100018FFFFFFFFFFFFFFFFFF01280148010A1408C901100018FFFFFFFFFFFFFFFFFF01280148010A1408CA01100018FFFFFFFFFFFFFFFFFF01280148010A1408CB01100018FFFFFFFFFFFFFFFFFF01280148010A1408CD01100018FFFFFFFFFFFFFFFFFF01280148010A1408CE01100018FFFFFFFFFFFFFFFFFF01280148010A1408CF01100018FFFFFFFFFFFFFFFFFF01280148010A1408D001100018FFFFFFFFFFFFFFFFFF01280148010A1408D101100018FFFFFFFFFFFFFFFFFF01280148010A1408D201100018FFFFFFFFFFFFFFFFFF01280148010A1408D301100018FFFFFFFFFFFFFFFFFF01280148010A1408D401100018FFFFFFFFFFFFFFFFFF01280148010A1408D501100018FFFFFFFFFFFFFFFFFF01280148010A1408D701100018FFFFFFFFFFFFFFFFFF01280148010A1408DA01100018FFFFFFFFFFFFFFFFFF01280148010A1408DC01100018FFFFFFFFFFFFFFFFFF01280148010A1408DD01100018FFFFFFFFFFFFFFFFFF01280148010A1408E801100018FFFFFFFFFFFFFFFFFF01280148010A1408E901100018FFFFFFFFFFFFFFFFFF01280148010A1408EA01100018FFFFFFFFFFFFFFFFFF01280148010A1408EB01100018FFFFFFFFFFFFFFFFFF01280148010A1408EC01100018FFFFFFFFFFFFFFFFFF01280148010A1408ED01100018FFFFFFFFFFFFFFFFFF01280148010A1408EE01100018FFFFFFFFFFFFFFFFFF01280148010A1408EF01100018FFFFFFFFFFFFFFFFFF01280148010A14088402100018FFFFFFFFFFFFFFFFFF01280148010A14088502100018FFFFFFFFFFFFFFFFFF01280148010A14088602100018FFFFFFFFFFFFFFFFFF01280148010A14088702100018FFFFFFFFFFFFFFFFFF01280148010A14088802100018FFFFFFFFFFFFFFFFFF01280148010A14088902100018FFFFFFFFFFFFFFFFFF01280148010A14088A02100018FFFFFFFFFFFFFFFFFF01280148010A14088B02100018FFFFFFFFFFFFFFFFFF01280148010A14088C02100018FFFFFFFFFFFFFFFFFF01280148010A14088D02100018FFFFFFFFFFFFFFFFFF01280148010A14088E02100018FFFFFFFFFFFFFFFFFF01280148010A14088F02100018FFFFFFFFFFFFFFFFFF01280148010A14089002100018FFFFFFFFFFFFFFFFFF01280148010A14089102100018FFFFFFFFFFFFFFFFFF01280148010A14089202100018FFFFFFFFFFFFFFFFFF01280148010A14089302100018FFFFFFFFFFFFFFFFFF01280148010A14089402100018FFFFFFFFFFFFFFFFFF01280148010A14089502100018FFFFFFFFFFFFFFFFFF01280148010A14089602100018FFFFFFFFFFFFFFFFFF01280148010A14089702100018FFFFFFFFFFFFFFFFFF01280148010A14089802100018FFFFFFFFFFFFFFFFFF01280148010A14089902100018FFFFFFFFFFFFFFFFFF01280148010A14089A02100018FFFFFFFFFFFFFFFFFF01280148010A14089B02100018FFFFFFFFFFFFFFFFFF01280148010A14089C02100018FFFFFFFFFFFFFFFFFF01280148010A1408A102100018FFFFFFFFFFFFFFFFFF01280148010A1408A202100018FFFFFFFFFFFFFFFFFF01280148010A1408A302100018FFFFFFFFFFFFFFFFFF01280148010A1408A402100018FFFFFFFFFFFFFFFFFF01280148010A1408A502100018FFFFFFFFFFFFFFFFFF01280148010A1408A602100018FFFFFFFFFFFFFFFFFF01280148010A1408A702100018FFFFFFFFFFFFFFFFFF01280148010A1408A802100018FFFFFFFFFFFFFFFFFF01280148010A1408A902100018FFFFFFFFFFFFFFFFFF01280148010A1408AA02100018FFFFFFFFFFFFFFFFFF01280148010A1408AB02100018FFFFFFFFFFFFFFFFFF01280148010A1408AC02100018FFFFFFFFFFFFFFFFFF01280148010A1408AD02100018FFFFFFFFFFFFFFFFFF01280148010A1408AE02100018FFFFFFFFFFFFFFFFFF01280148010A1408AF02100018FFFFFFFFFFFFFFFFFF01280148010A1408B002100018FFFFFFFFFFFFFFFFFF01280148010A1408B102100018FFFFFFFFFFFFFFFFFF01280148010A1408B202100018FFFFFFFFFFFFFFFFFF01280148010A1408B302100018FFFFFFFFFFFFFFFFFF01280148010A1408B402100018FFFFFFFFFFFFFFFFFF01280148010A1408B502100018FFFFFFFFFFFFFFFFFF01280148010A1408B602100018FFFFFFFFFFFFFFFFFF01280148010A1408B702100018FFFFFFFFFFFFFFFFFF01280148010A1408B802100018FFFFFFFFFFFFFFFFFF01280148010A1408B902100018FFFFFFFFFFFFFFFFFF01280148010A1408BA02100018FFFFFFFFFFFFFFFFFF01280148010A1408BB02100018FFFFFFFFFFFFFFFFFF01280148010A1408BC02100018FFFFFFFFFFFFFFFFFF01280148010A1408BD02100018FFFFFFFFFFFFFFFFFF01280148010A1408BE02100018FFFFFFFFFFFFFFFFFF01280148010A1408BF02100018FFFFFFFFFFFFFFFFFF01280148010A1408C002100018FFFFFFFFFFFFFFFFFF01280148010A1408C102100018FFFFFFFFFFFFFFFFFF01280148010A1408C202100018FFFFFFFFFFFFFFFFFF01280148010A1408C302100018FFFFFFFFFFFFFFFFFF01280148010A1408C402100018FFFFFFFFFFFFFFFFFF01280148010A1408C502100018FFFFFFFFFFFFFFFFFF01280148010A1408C602100018FFFFFFFFFFFFFFFFFF01280148010A1408C702100018FFFFFFFFFFFFFFFFFF01280148010A1408C802100018FFFFFFFFFFFFFFFFFF01280148010A1408C902100018FFFFFFFFFFFFFFFFFF01280148010A1408CA02100018FFFFFFFFFFFFFFFFFF01280148010A1408CB02100018FFFFFFFFFFFFFFFFFF01280148010A1408CC02100018FFFFFFFFFFFFFFFFFF01280148010A1408CD02100018FFFFFFFFFFFFFFFFFF01280148010A1408CE02100018FFFFFFFFFFFFFFFFFF01280148010A1408CF02100018FFFFFFFFFFFFFFFFFF01280148010A1408D002100018FFFFFFFFFFFFFFFFFF01280148010A1408D102100018FFFFFFFFFFFFFFFFFF01280148010A1408D202100018FFFFFFFFFFFFFFFFFF012801480122130A0C6D6573736167655F73697A65120318942F2A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802");
+
+        header = Protocol.Header.newBuilder()
+                .setServiceId(4)
+                .setMethodId(1)
+                .setToken(conn.nextToken())
+                .setObjectId(0)
+                .setSize(b.length)
+                .setStatus(0)
+                .build();
+
+        conn.send(new BattleNetPacket(header, b));
     }
 
     private void parseGetBattlePayStatus(ClientRequestBody body) {
@@ -779,12 +1194,39 @@ public class GameUtilitiesProcessor extends Processor {
                 .build();
     }
 
+    private Protocol.Notification generateEmptyNotification(int message_type) {
+        return Protocol.Notification.newBuilder()
+                .setSenderId(Protocol.EntityId.newBuilder()
+                        .setHigh(144115188075855872L)
+                        .setLow(0))
+                .setTargetId(Protocol.EntityId.newBuilder()
+                        .setHigh(144115198130930503L)
+                        .setLow(78330215))
+                .setType("WTCG.UtilNotificationMessage")
+                .setSenderBattleTag("")
+                .setSenderAccountId(Protocol.EntityId.newBuilder()
+                        .setHigh(72057594037927936L)
+                        .setLow(0))
+                .setTargetAccountId(Protocol.EntityId.newBuilder()
+                        .setHigh(72057594037927936L)
+                        .setLow(437154195))
+                .addAttribute(Protocol.Attribute.newBuilder()
+                        .setName("message_type")
+                        .setValue(Protocol.Variant.newBuilder()
+                                .setIntValue(message_type)))
+                .addAttribute(Protocol.Attribute.newBuilder()
+                        .setName("message_size")
+                        .setValue(Protocol.Variant.newBuilder()
+                                .setIntValue(0)))
+                .build();
+    }
+
     private void processClientRequest(BattleNetPacket packet, TcpConnection conn) throws Exception {
         Protocol.ClientRequest cr = Protocol.ClientRequest.parseFrom(packet.getBody());
 
         var p = parseClientRequest(cr);
 
-        //log.info("processClientRequest: {}, token={}, body={}", p, packet.getHeader().getToken(), Protocol.Subscribe.parseFrom(p.getBody()));
+        //log.info("processClientRequest: {}, token={}", p, packet.getHeader().getToken());
         log.info("processClientRequest: token={}", packet.getHeader().getToken());
         int type = p != null ? p.getType() : 0;
         switch(type) {
@@ -797,7 +1239,7 @@ public class GameUtilitiesProcessor extends Processor {
             case 276 -> parseCheckGameLicenses(packet, conn);
             case 305 -> parseGetAdventureProgress(packet, conn);
             case 237 -> parseGetBattlePayConfig(p);
-            case 253 -> parseGetAchieves(p);
+            case 253 -> parseGetAchieves(packet.getHeader().getToken(), p, conn);
             case 255 -> parseGetBattlePayStatus(p);
             case 239 -> parseSetOptions(p);
             case 329 -> parseSendUnsubcribeRequest(p);
@@ -920,164 +1362,6 @@ public class GameUtilitiesProcessor extends Processor {
 
             conn.send(new BattleNetPacket(header, b));
 
-
-
-            b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F747970651203188F0222410A0C667261676D656E745F3030301231322F0A0D08E00F1005181F2016280630121003180A2064281F483C503C5A0D08E00F1005180320002800300065AAAAAABD22120A0C6D6573736167655F73697A651202182F2A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802");
-
-            header = Protocol.Header.newBuilder()
-                    .setServiceId(4)
-                    .setMethodId(1)
-                    .setToken(conn.nextToken())
-                    .setObjectId(0)
-                    .setSize(b.length)
-                    .setStatus(0)
-                    .build();
-
-            conn.send(new BattleNetPacket(header, b));
-
-            b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F747970651203188E0222430A0C667261676D656E745F303030123332310A060801180120000A09080110FD04180120000A060804180620010A09080410FD04180120000A09080410AD0A1805200122120A0C6D6573736167655F73697A65120218312A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802");
-
-            header = Protocol.Header.newBuilder()
-                    .setServiceId(4)
-                    .setMethodId(1)
-                    .setToken(conn.nextToken())
-                    .setObjectId(0)
-                    .setSize(b.length)
-                    .setStatus(0)
-                    .build();
-
-            conn.send(new BattleNetPacket(header, b));
-
-            b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318860222140A0C667261676D656E745F30303012043202080022120A0C6D6573736167655F73697A65120218022A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802");
-
-            header = Protocol.Header.newBuilder()
-                    .setServiceId(4)
-                    .setMethodId(1)
-                    .setToken(conn.nextToken())
-                    .setObjectId(0)
-                    .setSize(b.length)
-                    .setStatus(0)
-                    .build();
-
-            conn.send(new BattleNetPacket(header, b));
-
-            // GoldBalance
-            b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F747970651203189602221D0A0C667261676D656E745F303030120D320B0800100018BF843D20D00F22120A0C6D6573736167655F73697A651202180B2A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802");
-
-            // log.warn("ProtoNotify" + Protocol.Notification.parseFrom(b));
-
-            /*Protocol.GoldBalance gb = Protocol.GoldBalance.newBuilder()
-                    .setCap(999999)
-                    .setBonusBalance(165)
-                    .setCappedBalance(160)
-                    .setCapWarning(2000)
-                    .build();*/
-
-           /* Protocol.Notification notification = Protocol.Notification.newBuilder()
-                    .setSenderId(Protocol.EntityId.newBuilder()
-                            .setHigh(144115188075855872L)
-                            .setLow(0))
-                    .setTargetId(Protocol.EntityId.newBuilder()
-                            .setHigh(144115198130930503L)
-                            .setLow(78330215))
-                    .setType("WTCG.UtilNotificationMessage")
-                    .setSenderBattleTag("")
-                    .setSenderAccountId(Protocol.EntityId.newBuilder()
-                            .setHigh(72057594037927936L)
-                            .setLow(0))
-                    .setTargetAccountId(Protocol.EntityId.newBuilder()
-                            .setHigh(72057594037927936L)
-                            .setLow(437154195))
-                    .addAttribute(Protocol.Attribute.newBuilder()
-                            .setName("message_type")
-                            .setValue(Protocol.Variant.newBuilder()
-                                    .setIntValue(278L)))
-                    .addAttribute(Protocol.Attribute.newBuilder()
-                            .setName("fragment_000")
-                            .setValue(Protocol.Variant.newBuilder()
-                                    .setBlobValue(gb.toByteString())))
-                    .addAttribute(Protocol.Attribute.newBuilder()
-                            .setName("message_size")
-                            .setValue(Protocol.Variant.newBuilder()
-                                    .setIntValue(gb.getSerializedSize())))
-                    .build();*/
-           /* b = notification.toByteArray();
-            header = Protocol.Header.newBuilder()
-                    .setServiceId(4)
-                    .setMethodId(1)
-                    .setToken(conn.nextToken())
-                    .setObjectId(0)
-                    .setSize(b.length)
-                    .setStatus(0)
-                    .build();
-
-            conn.send(new BattleNetPacket(header, b));*/
-
-            b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318F10122480A0C667261676D656E745F303030123832360A04081818030A0B08013080E08380C0E180180A090802308080808080100A04081418020A04081518010A04080818040A04080A180122120A0C6D6573736167655F73697A65120218362A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802");
-
-            header = Protocol.Header.newBuilder()
-                    .setServiceId(4)
-                    .setMethodId(1)
-                    .setToken(conn.nextToken())
-                    .setObjectId(0)
-                    .setSize(b.length)
-                    .setStatus(0)
-                    .build();
-
-            conn.send(new BattleNetPacket(header, b));
-
-            b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318B20222120A0C6D6573736167655F73697A65120218002A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802");
-
-            header = Protocol.Header.newBuilder()
-                    .setServiceId(4)
-                    .setMethodId(1)
-                    .setToken(conn.nextToken())
-                    .setObjectId(0)
-                    .setSize(b.length)
-                    .setStatus(0)
-                    .build();
-
-            conn.send(new BattleNetPacket(header, b));
-
-            b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F747970651203189B0222F5010A0C667261676D656E745F30303012E40132E1010A1708021001180020462A0D08021A090A0508B706100010020A1708031001180020462A0D08021A090A0508B503100010020A1708041002180C20502A0D08041A090A0508BC08100010020A1708051001180020462A0D08021A090A0508CF06100010020A1708061001180020462A0D08021A090A0508D10A100010020A1708071001180020462A0D08021A090A0508A503100010020A1708081001180020462A0D08021A090A05089309100010020A1708091001180020462A0D08021A090A0508D607100010020A17080A1001180020462A0D08021A090A0508AC071000100222130A0C6D6573736167655F73697A65120318E1012A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802");
-
-            header = Protocol.Header.newBuilder()
-                    .setServiceId(4)
-                    .setMethodId(1)
-                    .setToken(conn.nextToken())
-                    .setObjectId(0)
-                    .setSize(b.length)
-                    .setStatus(0)
-                    .build();
-
-            conn.send(new BattleNetPacket(header, b));
-
-            b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318EE0122E34F0A0C667261676D656E745F30303012D24F32CF4F0AB4010A14393931303030313530323130303030373233383211A4703D0AD7A3FC3F1A2D636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E6172656E6170617373222D636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E6172656E61706173732A060802100018013A2D636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E6172656E61706173730AB1010A1439393130303031353033313030303037323338331185EB51B81E8505401A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E626F6F7374657232222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E626F6F73746572322A060801100118023A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E626F6F73746572320AB1010A143939313030303135303431303030303732333834117B14AE47E1FA21401A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E626F6F7374657237222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E626F6F73746572372A060801100118073A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E626F6F73746572370AB4010A143939313030303135303531303030303732333835113D0AD7A370FD31401A2D636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E626F6F737465723135222D636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E626F6F7374657231352A0608011001180F3A2D636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E626F6F7374657231350AB4010A143939313030303135303631303030303732333836111F85EB51B87E46401A2D636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E626F6F737465723430222D636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E626F6F7374657234302A060801100118283A2D636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E626F6F7374657234300AC5010A1439393130303031383038303030303030303030311A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303157303031222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303031573030312A0608031001180130BC053A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303031573030315A186E6178785F6776675F7265616C5F6D6F6E65795F73616C650AC5010A1439393130303031383039303030303030303030311A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303157303032222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303031573030322A0608031002180130BC053A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303031573030325A186E6178785F6776675F7265616C5F6D6F6E65795F73616C650AC5010A1439393130303031383130303030303030303030311A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303157303033222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303031573030332A0608031003180130BC053A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303031573030335A186E6178785F6776675F7265616C5F6D6F6E65795F73616C650AC5010A1439393130303031383131303030303030303030311A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303157303034222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303031573030342A0608031004180130BC053A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303031573030345A186E6178785F6776675F7265616C5F6D6F6E65795F73616C650AE2010A1439393130303031383132303030303030303030311A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303142303031222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303031423030312A060803100118012A060803100318012A060803100218012A060803100418012A060803100518013A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303031423030315A186E6178785F6776675F7265616C5F6D6F6E65795F73616C650ADA010A1439393130303031383133303030303030303030311A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303142303032222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303031423030322A060803100318012A060803100218012A060803100418012A060803100518013A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303031423030325A186E6178785F6776675F7265616C5F6D6F6E65795F73616C650AD2010A1439393130303031383134303030303030303030311A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303142303033222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303031423030332A060803100318012A060803100418012A060803100518013A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303031423030335A186E6178785F6776675F7265616C5F6D6F6E65795F73616C650AC5010A1439393130303031393232303030303030303030311A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303157303035222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303031573030352A0608031005180130BC053A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303031573030355A186E6178785F6776675F7265616C5F6D6F6E65795F73616C650ACA010A1439393130303031393233303030303030303030311A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303142303034222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303031423030342A060803100418012A060803100518013A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303031423030345A186E6178785F6776675F7265616C5F6D6F6E65795F73616C650AB6010A143939323030303139323332303030303032313633117B14AE47E1FA21401A28636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E483030312228636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E483030312A070806108C1618012A060805101A18013A28636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E483030314A066C61756E63680AB6010A143939323030303139323632303030303032313636117B14AE47E1FA21401A28636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E483030332228636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E483030332A070806108D1618012A060805101B18013A28636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E483030334A066C61756E63680AB6010A143939323030303139333232303030303032313732117B14AE47E1FA21401A28636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E483030322228636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E483030322A070806108A1618012A060805101918013A28636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E483030324A066C61756E63680A270A143939323030303334353632303030303033373536111F85EB51B87E4F402A0608011001183C0ACB010A1439393230303033343539323030303030333735391A2F636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78312E626F6F7374657232222F636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78312E626F6F73746572322A060801100918023A2F636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78312E626F6F73746572325A186E6178785F6776675F7265616C5F6D6F6E65795F73616C650ACB010A1439393230303033343632323030303030333736321A2F636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78312E626F6F7374657237222F636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78312E626F6F73746572372A060801100918073A2F636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78312E626F6F73746572375A186E6178785F6776675F7265616C5F6D6F6E65795F73616C650ACE010A1439393230303033343635323030303030333736351A30636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78312E626F6F7374657231352230636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78312E626F6F7374657231352A0608011009180F3A30636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78312E626F6F7374657231355A186E6178785F6776675F7265616C5F6D6F6E65795F73616C650ACE010A1439393230303033343638323030303030333736381A30636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78312E626F6F7374657234302230636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78312E626F6F7374657234302A060801100918283A30636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78312E626F6F7374657234305A186E6178785F6776675F7265616C5F6D6F6E65795F73616C650A380A1439393230303033343731323030303030333737312A0608011009183C5A186E6178785F6776675F7265616C5F6D6F6E65795F73616C650AC5010A14393932303031313935323230303030313330343411F6285C8FC2F517401A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303257303031222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303032573030312A0608041006180130BC053A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303032573030314A0F62726D5F6E6F726D616C5F73616C650AC5010A14393932303031313935353230303030313330343711F6285C8FC2F517401A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303257303032222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303032573030322A0608041007180130BC053A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303032573030324A0F62726D5F6E6F726D616C5F73616C650AC5010A14393932303031313935383230303030313330353011F6285C8FC2F517401A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303257303033222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303032573030332A0608041008180130BC053A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303032573030334A0F62726D5F6E6F726D616C5F73616C650AC5010A14393932303031313936313230303030313330353311F6285C8FC2F517401A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303257303034222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303032573030342A0608041009180130BC053A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303032573030344A0F62726D5F6E6F726D616C5F73616C650AC5010A14393932303031313936343230303030313330353611F6285C8FC2F517401A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303257303035222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303032573030352A060804100A180130BC053A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303032573030354A0F62726D5F6E6F726D616C5F73616C650AE2010A143939323030313139363732303030303133303539113D0AD7A370FD35401A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303242303031222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303032423030312A060804100618012A060804100718012A060804100818012A060804100918012A060804100A18013A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303032423030314A0F62726D5F6E6F726D616C5F73616C650ADA010A143939323030313139373032303030303133303632113D0AD7A370FD31401A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303242303032222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303032423030322A060804100718012A060804100818012A060804100918012A060804100A18013A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303032423030324A0F62726D5F6E6F726D616C5F73616C650AD2010A143939323030313139373332303030303133303635117B14AE47E1FA2B401A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303242303033222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303032423030332A060804100818012A060804100918012A060804100A18013A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303032423030334A0F62726D5F6E6F726D616C5F73616C650ACA010A143939323030313139373632303030303133303638117B14AE47E1FA21401A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303242303034222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303032423030342A060804100918012A060804100A18013A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303032423030344A0F62726D5F6E6F726D616C5F73616C650AEA010A143939323030313139373932303030303133303731113D0AD7A370FD35401A2D636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E413030324230303170222D636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303242303031702A060804100618012A060804100718012A060804100818012A060804100918012A060804100A18012A060805101218013A2D636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303242303031704A0C62726D5F7072655F73616C650AD6010A143939323030313539383732303030303137343537111F85EB51B87E46401A31636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78322E626F6F737465723530702231636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78322E626F6F737465723530702A060805101F18012A060801100A18323A31636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78322E626F6F737465723530704A0C7467745F7072655F73616C650ACB010A1439393330303030313836333030303030303138361185EB51B81E8505401A2F636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78322E626F6F7374657232222F636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78322E626F6F73746572322A060801100A18023A2F636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78322E626F6F73746572324A0F7467745F6E6F726D616C5F73616C650ACB010A143939333030303031383733303030303030313837117B14AE47E1FA21401A2F636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78322E626F6F7374657237222F636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78322E626F6F73746572372A060801100A18073A2F636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78322E626F6F73746572374A0F7467745F6E6F726D616C5F73616C650ACE010A143939333030303031383833303030303030313838113D0AD7A370FD31401A30636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78322E626F6F7374657231352230636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78322E626F6F7374657231352A060801100A180F3A30636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78322E626F6F7374657231354A0F7467745F6E6F726D616C5F73616C650ACE010A143939333030303031393033303030303030313930111F85EB51B87E46401A30636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78322E626F6F7374657234302230636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78322E626F6F7374657234302A060801100A18283A30636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78322E626F6F7374657234304A0F7467745F6E6F726D616C5F73616C650A380A143939333030303031393133303030303030313931111F85EB51B87E4F402A060801100A183C4A0F7467745F6E6F726D616C5F73616C650AC0010A143939333030303333303233303030303032353736117B14AE47E1FA21401A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303342303033222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303033423030332A060807100D18012A060807100E18013A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303033423030334A056C6F655F310ABB010A14393933303030333330373330303030303235353911F6285C8FC2F517401A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303357303031222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303033573030312A060807100B180130BC053A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303033573030314A056C6F655F310ABB010A14393933303030333330383330303030303235363311F6285C8FC2F517401A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303357303032222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303033573030322A060807100C180130BC053A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303033573030324A056C6F655F310ABB010A14393933303030333330393330303030303235383411F6285C8FC2F517401A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303357303033222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303033573030332A060807100D180130BC053A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303033573030334A056C6F655F310ABB010A14393933303030333331303330303030303235383511F6285C8FC2F517401A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303357303034222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303033573030342A060807100E180130BC053A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303033573030344A056C6F655F310AD0010A143939333030303333313133303030303032353836113D0AD7A370FD31401A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303342303031222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303033423030312A060807100B18012A060807100C18012A060807100D18012A060807100E18013A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303033423030314A056C6F655F310AC8010A143939333030303333313233303030303032353837117B14AE47E1FA2B401A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E4130303342303032222C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303033423030322A060807100C18012A060807100D18012A060807100E18013A2C636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E41303033423030324A056C6F655F310ACD010A143939333030303434313633303030303034303032113D0AD7A370FD31401A30636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78332E626F6F7374657231352230636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78332E626F6F7374657231352A060801100B180F3A30636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78332E626F6F7374657231354A0E6F675F6E6F726D616C5F73616C650ACD010A143939333030303434313733303030303034303033111F85EB51B87E46401A30636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78332E626F6F7374657234302230636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78332E626F6F7374657234302A060801100B18283A30636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78332E626F6F7374657234304A0E6F675F6E6F726D616C5F73616C650A370A143939333030303434313833303030303034313034111F85EB51B87E4F402A060801100B183C4A0E6F675F6E6F726D616C5F73616C650AD9010A143939333030303434373033303030303034303838111F85EB51B87E46401A31636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78332E626F6F737465723530702231636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78332E626F6F737465723530702A060801100B18322A060805102D18013A31636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78332E626F6F737465723530704A0F6F675F7072655F70757263686173650ACA010A1439393330303034343737333030303030343039351185EB51B81E8505401A2F636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78332E626F6F7374657232222F636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78332E626F6F73746572322A060801100B18023A2F636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78332E626F6F73746572324A0E6F675F6E6F726D616C5F73616C650ACA010A143939333030303434373833303030303034303936117B14AE47E1FA21401A2F636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78332E626F6F7374657237222F636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78332E626F6F73746572372A060801100B18073A2F636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E78332E626F6F73746572374A0E6F675F6E6F726D616C5F73616C650ABA010A1439393330303035303434333030303030343636351A28636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E483030342228636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E483030342A08080610CDB10218013A28636F6D2E626C697A7A6172642E777463672E68656172746873746F6E652E69617045552E483030344A186170706C655F636861726974795F70726F6D6F5F323031365002100428D80432040864100132150864100A1A0F7467745F6E6F726D616C5F73616C6532140864100B1A0E6F675F6E6F726D616C5F73616C6538960122130A0C6D6573736167655F73697A65120318CF4F2A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802");
-
-            header = Protocol.Header.newBuilder()
-                    .setServiceId(4)
-                    .setMethodId(1)
-                    .setToken(conn.nextToken())
-                    .setObjectId(0)
-                    .setSize(b.length)
-                    .setStatus(0)
-                    .build();
-
-            conn.send(new BattleNetPacket(header, b));
-
-            b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318BE0222730A0C667261676D656E745F303030126332610A090802120508920210000A0808031204081F10000A090804120508FD0410000A0908051205089F0510000A090806120508AD0610000A090807120508A20710000A090808120508AA0810000A090809120508FD0610000A08080A12040807100022120A0C6D6573736167655F73697A65120218612A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802");
-
-            header = Protocol.Header.newBuilder()
-                    .setServiceId(4)
-                    .setMethodId(1)
-                    .setToken(conn.nextToken())
-                    .setObjectId(0)
-                    .setSize(b.length)
-                    .setStatus(0)
-                    .build();
-
-            conn.send(new BattleNetPacket(header, b));
-
             b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318C60222190A0C667261676D656E745F30303012093207080110C901181522120A0C6D6573736167655F73697A65120218072A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802");
 
             header = Protocol.Header.newBuilder()
@@ -1091,31 +1375,6 @@ public class GameUtilitiesProcessor extends Processor {
 
             conn.send(new BattleNetPacket(header, b));
 
-            b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318EC0122140A0C667261676D656E745F30303012043202080022120A0C6D6573736167655F73697A65120218022A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802");
-
-            header = Protocol.Header.newBuilder()
-                    .setServiceId(4)
-                    .setMethodId(1)
-                    .setToken(conn.nextToken())
-                    .setObjectId(0)
-                    .setSize(b.length)
-                    .setStatus(0)
-                    .build();
-
-            conn.send(new BattleNetPacket(header, b));
-
-            b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318C50222120A0C6D6573736167655F73697A65120218002A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802");
-
-            header = Protocol.Header.newBuilder()
-                    .setServiceId(4)
-                    .setMethodId(1)
-                    .setToken(conn.nextToken())
-                    .setObjectId(0)
-                    .setSize(b.length)
-                    .setStatus(0)
-                    .build();
-
-            conn.send(new BattleNetPacket(header, b));
         } else if( packet.getHeader().getToken() == 25 ) {
             byte[] b = Util.hexStringToByteArray("0A090A026964120318C6020A100A0570726F746F12073205080110ED01");
 
@@ -1123,30 +1382,31 @@ public class GameUtilitiesProcessor extends Processor {
 
             conn.send(new BattleNetPacket(header, b));
         } else if( packet.getHeader().getToken() == 27 ) {
-            byte[] b = Util.hexStringToByteArray("0A090A026964120318C6020A100A0570726F746F12073205080110FD01");
-
-            Protocol.Header header = Processor.generateResponse(b.length, packet.getHeader().getToken(), 0, 0);
-
-            conn.send(new BattleNetPacket(header, b));
-
-            b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318FC0122A82F0A0C667261676D656E745F30303012972F32942F0A28080210011801200130013A0D08E00F10041818200928243015420D08E00F100418182009282430150A28080310011801200130013A0D08E00F100418182009281E300A420D08E00F100418182009281E300A0A31080F100118FFFFFFFFFFFFFFFFFF01280130013A0D08E00F10041818200928243015420D08E00F100418182009282430150A310818100118FFFFFFFFFFFFFFFFFF01280130013A0D08E00F10041818200928243015420D08E00F100418182009282430150A31083E100118FFFFFFFFFFFFFFFFFF01280130013A0D08E00F10041818200928243015420D08E00F100418182009282430150A31083F100118FFFFFFFFFFFFFFFFFF01280130013A0D08E00F10041818200928243015420D08E00F100418182009282430150A28084110011801200130013A0D08E00F100418182009281E300A420D08E00F100418182009281E300A0A31084F100218FFFFFFFFFFFFFFFFFF01280130013A0D08E00F100418182009281E300A420D08E00F100418182009281E300A0A28086110011801200130013A0D08E00F100418182009281E300A420D08E00F100418182009281E300A0A2908D80110011801200130013A0D08E00F100418182009281E300A420D08E00F100418182009281E300A0A2908D90110011801280130013A0D08E00F100418182009281E300A420D08E00F100418182009281E300A0A130801100018FFFFFFFFFFFFFFFFFF01280148010A130804100018FFFFFFFFFFFFFFFFFF01280148010A130805100018FFFFFFFFFFFFFFFFFF01280148010A130806100018FFFFFFFFFFFFFFFFFF01280148010A130807100018FFFFFFFFFFFFFFFFFF01280148010A130808100018FFFFFFFFFFFFFFFFFF01280148010A130809100018FFFFFFFFFFFFFFFFFF01280148010A13080A100018FFFFFFFFFFFFFFFFFF01280148010A13080D100018FFFFFFFFFFFFFFFFFF01280148010A13080E100018FFFFFFFFFFFFFFFFFF01280148010A130810100018FFFFFFFFFFFFFFFFFF01280148010A130811100018FFFFFFFFFFFFFFFFFF01280148010A130812100018FFFFFFFFFFFFFFFFFF01280148010A130813100018FFFFFFFFFFFFFFFFFF01280148010A130814100018FFFFFFFFFFFFFFFFFF01280148010A130815100018FFFFFFFFFFFFFFFFFF01280148010A130816100018FFFFFFFFFFFFFFFFFF01280148010A130817100018FFFFFFFFFFFFFFFFFF01280148010A130819100018FFFFFFFFFFFFFFFFFF01280148010A13081A100018FFFFFFFFFFFFFFFFFF01280148010A13081B100018FFFFFFFFFFFFFFFFFF01280148010A13081C100018FFFFFFFFFFFFFFFFFF01280148010A13081D100018FFFFFFFFFFFFFFFFFF01280148010A13081E100018FFFFFFFFFFFFFFFFFF01280148010A130837100018FFFFFFFFFFFFFFFFFF01280148010A130839100018FFFFFFFFFFFFFFFFFF01280148010A13083A100018FFFFFFFFFFFFFFFFFF01280148010A13083B100018FFFFFFFFFFFFFFFFFF01280148010A13083C100018FFFFFFFFFFFFFFFFFF01280148010A13083D100018FFFFFFFFFFFFFFFFFF01280148010A130842100018FFFFFFFFFFFFFFFFFF01280148010A130843100018FFFFFFFFFFFFFFFFFF01280148010A130844100018FFFFFFFFFFFFFFFFFF01280148010A130846100018FFFFFFFFFFFFFFFFFF01280148010A130847100018FFFFFFFFFFFFFFFFFF01280148010A130848100018FFFFFFFFFFFFFFFFFF01280148010A130849100018FFFFFFFFFFFFFFFFFF01280148010A13084A100018FFFFFFFFFFFFFFFFFF01280148010A13084B100018FFFFFFFFFFFFFFFFFF01280148010A13084C100018FFFFFFFFFFFFFFFFFF01280148010A13084D100018FFFFFFFFFFFFFFFFFF01280148010A13084E100018FFFFFFFFFFFFFFFFFF01280148010A130850100018FFFFFFFFFFFFFFFFFF01280148010A130851100018FFFFFFFFFFFFFFFFFF01280148010A130852100018FFFFFFFFFFFFFFFFFF01280148010A130853100018FFFFFFFFFFFFFFFFFF01280148010A130854100018FFFFFFFFFFFFFFFFFF01280148010A130855100018FFFFFFFFFFFFFFFFFF01280148010A130856100018FFFFFFFFFFFFFFFFFF01280148010A130857100018FFFFFFFFFFFFFFFFFF01280148010A130858100018FFFFFFFFFFFFFFFFFF01280148010A130859100018FFFFFFFFFFFFFFFFFF01280148010A13085A100018FFFFFFFFFFFFFFFFFF01280148010A13085B100018FFFFFFFFFFFFFFFFFF01280148010A13085C100018FFFFFFFFFFFFFFFFFF01280148010A13085D100018FFFFFFFFFFFFFFFFFF01280148010A13085E100018FFFFFFFFFFFFFFFFFF01280148010A13085F100018FFFFFFFFFFFFFFFFFF01280148010A130860100018FFFFFFFFFFFFFFFFFF01280148010A130862100018FFFFFFFFFFFFFFFFFF01280148010A130863100018FFFFFFFFFFFFFFFFFF01280148010A130864100018FFFFFFFFFFFFFFFFFF01280148010A130865100018FFFFFFFFFFFFFFFFFF01280148010A130866100018FFFFFFFFFFFFFFFFFF01280148010A130867100018FFFFFFFFFFFFFFFFFF01280148010A130868100018FFFFFFFFFFFFFFFFFF01280148010A130869100018FFFFFFFFFFFFFFFFFF01280148010A13086A100018FFFFFFFFFFFFFFFFFF01280148010A13086B100018FFFFFFFFFFFFFFFFFF01280148010A13086C100018FFFFFFFFFFFFFFFFFF01280148010A13086D100018FFFFFFFFFFFFFFFFFF01280148010A13086E100018FFFFFFFFFFFFFFFFFF01280148010A130870100018FFFFFFFFFFFFFFFFFF01280148010A130871100018FFFFFFFFFFFFFFFFFF01280148010A130872100018FFFFFFFFFFFFFFFFFF01280148010A130873100018FFFFFFFFFFFFFFFFFF01280148010A130874100018FFFFFFFFFFFFFFFFFF01280148010A130875100018FFFFFFFFFFFFFFFFFF01280148010A130876100018FFFFFFFFFFFFFFFFFF01280148010A130877100018FFFFFFFFFFFFFFFFFF01280148010A130878100018FFFFFFFFFFFFFFFFFF01280148010A130879100018FFFFFFFFFFFFFFFFFF01280148010A13087F100018FFFFFFFFFFFFFFFFFF01280148010A14088001100018FFFFFFFFFFFFFFFFFF01280148010A14088101100018FFFFFFFFFFFFFFFFFF01280148010A14088201100018FFFFFFFFFFFFFFFFFF01280148010A14088301100018FFFFFFFFFFFFFFFFFF01280148010A14088401100018FFFFFFFFFFFFFFFFFF01280148010A14088501100018FFFFFFFFFFFFFFFFFF01280148010A14088601100018FFFFFFFFFFFFFFFFFF01280148010A14088701100018FFFFFFFFFFFFFFFFFF01280148010A14088801100018FFFFFFFFFFFFFFFFFF01280148010A14088901100018FFFFFFFFFFFFFFFFFF01280148010A14088A01100018FFFFFFFFFFFFFFFFFF01280148010A14088B01100018FFFFFFFFFFFFFFFFFF01280148010A14088C01100018FFFFFFFFFFFFFFFFFF01280148010A14088D01100018FFFFFFFFFFFFFFFFFF01280148010A14088E01100018FFFFFFFFFFFFFFFFFF01280148010A14088F01100018FFFFFFFFFFFFFFFFFF01280148010A14089001100018FFFFFFFFFFFFFFFFFF01280148010A14089101100018FFFFFFFFFFFFFFFFFF01280148010A14089201100018FFFFFFFFFFFFFFFFFF01280148010A14089301100018FFFFFFFFFFFFFFFFFF01280148010A14089401100018FFFFFFFFFFFFFFFFFF01280148010A14089501100018FFFFFFFFFFFFFFFFFF01280148010A14089601100018FFFFFFFFFFFFFFFFFF01280148010A14089701100018FFFFFFFFFFFFFFFFFF01280148010A14089801100018FFFFFFFFFFFFFFFFFF01280148010A14089901100018FFFFFFFFFFFFFFFFFF01280148010A14089A01100018FFFFFFFFFFFFFFFFFF01280148010A14089B01100018FFFFFFFFFFFFFFFFFF01280148010A14089C01100018FFFFFFFFFFFFFFFFFF01280148010A14089D01100018FFFFFFFFFFFFFFFFFF01280148010A14089E01100018FFFFFFFFFFFFFFFFFF01280148010A14089F01100018FFFFFFFFFFFFFFFFFF01280148010A1408A001100018FFFFFFFFFFFFFFFFFF01280148010A1408A101100018FFFFFFFFFFFFFFFFFF01280148010A1408A201100018FFFFFFFFFFFFFFFFFF01280148010A1408A301100018FFFFFFFFFFFFFFFFFF01280148010A1408A401100018FFFFFFFFFFFFFFFFFF01280148010A1408A501100018FFFFFFFFFFFFFFFFFF01280148010A1408A601100018FFFFFFFFFFFFFFFFFF01280148010A1408A701100018FFFFFFFFFFFFFFFFFF01280148010A1408A801100018FFFFFFFFFFFFFFFFFF01280148010A1408A901100018FFFFFFFFFFFFFFFFFF01280148010A1408AA01100018FFFFFFFFFFFFFFFFFF01280148010A1408AB01100018FFFFFFFFFFFFFFFFFF01280148010A1408AC01100018FFFFFFFFFFFFFFFFFF01280148010A1408AD01100018FFFFFFFFFFFFFFFFFF01280148010A1408AE01100018FFFFFFFFFFFFFFFFFF01280148010A1408AF01100018FFFFFFFFFFFFFFFFFF01280148010A1408B001100018FFFFFFFFFFFFFFFFFF01280148010A1408B101100018FFFFFFFFFFFFFFFFFF01280148010A1408B201100018FFFFFFFFFFFFFFFFFF01280148010A1408B301100018FFFFFFFFFFFFFFFFFF01280148010A1408B401100018FFFFFFFFFFFFFFFFFF01280148010A1408B501100018FFFFFFFFFFFFFFFFFF01280148010A1408B601100018FFFFFFFFFFFFFFFFFF01280148010A1408B701100018FFFFFFFFFFFFFFFFFF01280148010A1408B801100018FFFFFFFFFFFFFFFFFF01280148010A1408B901100018FFFFFFFFFFFFFFFFFF01280148010A1408BA01100018FFFFFFFFFFFFFFFFFF01280148010A1408BB01100018FFFFFFFFFFFFFFFFFF01280148010A1408BC01100018FFFFFFFFFFFFFFFFFF01280148010A1408BD01100018FFFFFFFFFFFFFFFFFF01280148010A1408BE01100018FFFFFFFFFFFFFFFFFF01280148010A1408BF01100018FFFFFFFFFFFFFFFFFF01280148010A1408C001100018FFFFFFFFFFFFFFFFFF01280148010A1408C101100018FFFFFFFFFFFFFFFFFF01280148010A1408C201100018FFFFFFFFFFFFFFFFFF01280148010A1408C301100018FFFFFFFFFFFFFFFFFF01280148010A1408C401100018FFFFFFFFFFFFFFFFFF01280148010A1408C501100018FFFFFFFFFFFFFFFFFF01280148010A1408C601100018FFFFFFFFFFFFFFFFFF01280148010A1408C701100018FFFFFFFFFFFFFFFFFF01280148010A1408C801100018FFFFFFFFFFFFFFFFFF01280148010A1408C901100018FFFFFFFFFFFFFFFFFF01280148010A1408CA01100018FFFFFFFFFFFFFFFFFF01280148010A1408CB01100018FFFFFFFFFFFFFFFFFF01280148010A1408CD01100018FFFFFFFFFFFFFFFFFF01280148010A1408CE01100018FFFFFFFFFFFFFFFFFF01280148010A1408CF01100018FFFFFFFFFFFFFFFFFF01280148010A1408D001100018FFFFFFFFFFFFFFFFFF01280148010A1408D101100018FFFFFFFFFFFFFFFFFF01280148010A1408D201100018FFFFFFFFFFFFFFFFFF01280148010A1408D301100018FFFFFFFFFFFFFFFFFF01280148010A1408D401100018FFFFFFFFFFFFFFFFFF01280148010A1408D501100018FFFFFFFFFFFFFFFFFF01280148010A1408D701100018FFFFFFFFFFFFFFFFFF01280148010A1408DA01100018FFFFFFFFFFFFFFFFFF01280148010A1408DC01100018FFFFFFFFFFFFFFFFFF01280148010A1408DD01100018FFFFFFFFFFFFFFFFFF01280148010A1408E801100018FFFFFFFFFFFFFFFFFF01280148010A1408E901100018FFFFFFFFFFFFFFFFFF01280148010A1408EA01100018FFFFFFFFFFFFFFFFFF01280148010A1408EB01100018FFFFFFFFFFFFFFFFFF01280148010A1408EC01100018FFFFFFFFFFFFFFFFFF01280148010A1408ED01100018FFFFFFFFFFFFFFFFFF01280148010A1408EE01100018FFFFFFFFFFFFFFFFFF01280148010A1408EF01100018FFFFFFFFFFFFFFFFFF01280148010A14088402100018FFFFFFFFFFFFFFFFFF01280148010A14088502100018FFFFFFFFFFFFFFFFFF01280148010A14088602100018FFFFFFFFFFFFFFFFFF01280148010A14088702100018FFFFFFFFFFFFFFFFFF01280148010A14088802100018FFFFFFFFFFFFFFFFFF01280148010A14088902100018FFFFFFFFFFFFFFFFFF01280148010A14088A02100018FFFFFFFFFFFFFFFFFF01280148010A14088B02100018FFFFFFFFFFFFFFFFFF01280148010A14088C02100018FFFFFFFFFFFFFFFFFF01280148010A14088D02100018FFFFFFFFFFFFFFFFFF01280148010A14088E02100018FFFFFFFFFFFFFFFFFF01280148010A14088F02100018FFFFFFFFFFFFFFFFFF01280148010A14089002100018FFFFFFFFFFFFFFFFFF01280148010A14089102100018FFFFFFFFFFFFFFFFFF01280148010A14089202100018FFFFFFFFFFFFFFFFFF01280148010A14089302100018FFFFFFFFFFFFFFFFFF01280148010A14089402100018FFFFFFFFFFFFFFFFFF01280148010A14089502100018FFFFFFFFFFFFFFFFFF01280148010A14089602100018FFFFFFFFFFFFFFFFFF01280148010A14089702100018FFFFFFFFFFFFFFFFFF01280148010A14089802100018FFFFFFFFFFFFFFFFFF01280148010A14089902100018FFFFFFFFFFFFFFFFFF01280148010A14089A02100018FFFFFFFFFFFFFFFFFF01280148010A14089B02100018FFFFFFFFFFFFFFFFFF01280148010A14089C02100018FFFFFFFFFFFFFFFFFF01280148010A1408A102100018FFFFFFFFFFFFFFFFFF01280148010A1408A202100018FFFFFFFFFFFFFFFFFF01280148010A1408A302100018FFFFFFFFFFFFFFFFFF01280148010A1408A402100018FFFFFFFFFFFFFFFFFF01280148010A1408A502100018FFFFFFFFFFFFFFFFFF01280148010A1408A602100018FFFFFFFFFFFFFFFFFF01280148010A1408A702100018FFFFFFFFFFFFFFFFFF01280148010A1408A802100018FFFFFFFFFFFFFFFFFF01280148010A1408A902100018FFFFFFFFFFFFFFFFFF01280148010A1408AA02100018FFFFFFFFFFFFFFFFFF01280148010A1408AB02100018FFFFFFFFFFFFFFFFFF01280148010A1408AC02100018FFFFFFFFFFFFFFFFFF01280148010A1408AD02100018FFFFFFFFFFFFFFFFFF01280148010A1408AE02100018FFFFFFFFFFFFFFFFFF01280148010A1408AF02100018FFFFFFFFFFFFFFFFFF01280148010A1408B002100018FFFFFFFFFFFFFFFFFF01280148010A1408B102100018FFFFFFFFFFFFFFFFFF01280148010A1408B202100018FFFFFFFFFFFFFFFFFF01280148010A1408B302100018FFFFFFFFFFFFFFFFFF01280148010A1408B402100018FFFFFFFFFFFFFFFFFF01280148010A1408B502100018FFFFFFFFFFFFFFFFFF01280148010A1408B602100018FFFFFFFFFFFFFFFFFF01280148010A1408B702100018FFFFFFFFFFFFFFFFFF01280148010A1408B802100018FFFFFFFFFFFFFFFFFF01280148010A1408B902100018FFFFFFFFFFFFFFFFFF01280148010A1408BA02100018FFFFFFFFFFFFFFFFFF01280148010A1408BB02100018FFFFFFFFFFFFFFFFFF01280148010A1408BC02100018FFFFFFFFFFFFFFFFFF01280148010A1408BD02100018FFFFFFFFFFFFFFFFFF01280148010A1408BE02100018FFFFFFFFFFFFFFFFFF01280148010A1408BF02100018FFFFFFFFFFFFFFFFFF01280148010A1408C002100018FFFFFFFFFFFFFFFFFF01280148010A1408C102100018FFFFFFFFFFFFFFFFFF01280148010A1408C202100018FFFFFFFFFFFFFFFFFF01280148010A1408C302100018FFFFFFFFFFFFFFFFFF01280148010A1408C402100018FFFFFFFFFFFFFFFFFF01280148010A1408C502100018FFFFFFFFFFFFFFFFFF01280148010A1408C602100018FFFFFFFFFFFFFFFFFF01280148010A1408C702100018FFFFFFFFFFFFFFFFFF01280148010A1408C802100018FFFFFFFFFFFFFFFFFF01280148010A1408C902100018FFFFFFFFFFFFFFFFFF01280148010A1408CA02100018FFFFFFFFFFFFFFFFFF01280148010A1408CB02100018FFFFFFFFFFFFFFFFFF01280148010A1408CC02100018FFFFFFFFFFFFFFFFFF01280148010A1408CD02100018FFFFFFFFFFFFFFFFFF01280148010A1408CE02100018FFFFFFFFFFFFFFFFFF01280148010A1408CF02100018FFFFFFFFFFFFFFFFFF01280148010A1408D002100018FFFFFFFFFFFFFFFFFF01280148010A1408D102100018FFFFFFFFFFFFFFFFFF01280148010A1408D202100018FFFFFFFFFFFFFFFFFF012801480122130A0C6D6573736167655F73697A65120318942F2A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802");
-
-            header = Protocol.Header.newBuilder()
-                    .setServiceId(4)
-                    .setMethodId(1)
-                    .setToken(conn.nextToken())
-                    .setObjectId(0)
-                    .setSize(b.length)
-                    .setStatus(0)
-                    .build();
-
-            conn.send(new BattleNetPacket(header, b));
+           // Achieves
         } else if( packet.getHeader().getToken() == 28 ) {
             byte[] b = Util.hexStringToByteArray("0A090A02696412031889020A0F0A0570726F746F1206320408002001");
 
             Protocol.Header header = Processor.generateResponse(b.length, packet.getHeader().getToken(), 0, 0);
 
             conn.send(new BattleNetPacket(header, b));
+
+            Protocol.GuardianVars guardianVars = Protocol.GuardianVars.newBuilder()
+                    .setShowUserUi(1)
+                    .setClientOptionsUpdateIntervalSeconds(300)
+                    .build();
+
+            Protocol.Notification n = generateNotification(264, guardianVars.toByteString(), guardianVars.getSerializedSize());
+
+            header = Protocol.Header.newBuilder()
+                    .setServiceId(4)
+                    .setMethodId(1)
+                    .setToken(conn.nextToken())
+                    .setStatus(0)
+                    .setObjectId(0)
+                    .setSize(n.getSerializedSize())
+                    .build();
+
+            conn.send(new BattleNetPacket(header, n.toByteArray()));
         } else if( packet.getHeader().getToken() == 29 ) {
             byte[] b = Util.hexStringToByteArray("0A090A026964120318C6020A100A0570726F746F12073205080110C702");
 
@@ -1166,19 +1426,6 @@ public class GameUtilitiesProcessor extends Processor {
                     .build();
 
             conn.send(new BattleNetPacket(header, b));
-
-            b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318D40122120A0C6D6573736167655F73697A65120218002A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802");
-
-            header = Protocol.Header.newBuilder()
-                    .setServiceId(4)
-                    .setMethodId(1)
-                    .setToken(conn.nextToken())
-                    .setObjectId(0)
-                    .setSize(b.length)
-                    .setStatus(0)
-                    .build();
-
-            conn.send(new BattleNetPacket(header, b));
         } else if( packet.getHeader().getToken() == 30 ) {
             Protocol.Header header = Processor.generateResponse(0, packet.getHeader().getToken(), 0, 0);
 
@@ -1205,32 +1452,6 @@ public class GameUtilitiesProcessor extends Processor {
             header = Processor.generateResponse(0, packet.getHeader().getToken(), 0, 0);
 
             conn.send(new BattleNetPacket(header, new byte[0]));
-
-            byte[] b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318E00122120A0C6D6573736167655F73697A65120218002A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802");
-
-            header = Protocol.Header.newBuilder()
-                    .setServiceId(4)
-                    .setMethodId(1)
-                    .setToken(conn.nextToken())
-                    .setObjectId(0)
-                    .setSize(b.length)
-                    .setStatus(0)
-                    .build();
-
-            conn.send(new BattleNetPacket(header, b));
-
-            b = Util.hexStringToByteArray("0A120900000000000000021100000000000000001212094743545702000002116739AB04000000001A1C575443472E5574696C4E6F74696669636174696F6E4D65737361676522130A0C6D6573736167655F74797065120318880222190A0C667261676D656E745F30303012093207800101A801AC0222120A0C6D6573736167655F73697A65120218072A1209000000000000000111000000000000000032120900000000000000011193710E1A000000003A004A0A0889FF5C1092E5A1B90552150A050D93710E1A120C0D6739AB0415474354571802");
-
-            header = Protocol.Header.newBuilder()
-                    .setServiceId(4)
-                    .setMethodId(1)
-                    .setToken(conn.nextToken())
-                    .setObjectId(0)
-                    .setSize(b.length)
-                    .setStatus(0)
-                    .build();
-
-            conn.send(new BattleNetPacket(header, b));
         }
     }
 
diff --git a/src/main/java/com/alterdekim/hearthhack/util/PegasusPacket.java b/src/main/java/com/alterdekim/hearthhack/util/PegasusPacket.java
new file mode 100644
index 0000000..6772666
--- /dev/null
+++ b/src/main/java/com/alterdekim/hearthhack/util/PegasusPacket.java
@@ -0,0 +1,99 @@
+package com.alterdekim.hearthhack.util;
+
+import com.google.protobuf.GeneratedMessageV3;
+import lombok.NoArgsConstructor;
+
+@NoArgsConstructor
+public class PegasusPacket {
+
+    private final int TYPE_BYTES = 4;
+
+    private final int SIZE_BYTES = 4;
+
+    public int size;
+
+    public int type;
+
+    public int context;
+
+    public Object body;
+
+    private boolean sizeRead;
+
+    private boolean typeRead;
+
+    public PegasusPacket(int type, int context, Object body) {
+        this.type = type;
+        this.context = context;
+        this.size = -1;
+        this.body = body;
+    }
+
+    public PegasusPacket(int type, int context, int size, Object body) {
+        this.type = type;
+        this.context = context;
+        this.size = size;
+        this.body = body;
+    }
+
+
+    public Object GetBody() {
+        return this.body;
+    }
+
+    public boolean IsLoaded() {
+        return this.body != null;
+    }
+
+    public int Decode(byte[] bytes, int offset, int available) {
+        String arg = "";
+        int num = 0;
+        while (num < 8 && num < available) {
+            arg = arg + bytes[offset + num] + " ";
+            num++;
+        }
+        int num2 = 0;
+        if (!this.typeRead) {
+            if (available < 4) return num2;
+            this.type = toInt32_2(bytes, offset);
+            this.typeRead = true;
+            available -= 4;
+            num2 += 4;
+            offset += 4;
+        }
+        if (!this.sizeRead) {
+            if (available < 4) return num2;
+            this.size = toInt32_2(bytes, offset);
+            this.sizeRead = true;
+            available -= 4;
+            num2 += 4;
+            offset += 4;
+        }
+        if (this.body == null) {
+            if (available < this.size) return num2;
+            byte[] array = new byte[this.size];
+            System.arraycopy(bytes, offset, array, 0, this.size);
+            this.body = array;
+            num2 += this.size;
+        }
+        return num2;
+    }
+
+    /*public byte[] Encode() {
+        if (this.body instanceof GeneratedMessageV3) {
+            GeneratedMessageV3 protoBuf = (GeneratedMessageV3) this.body;
+            this.size = (int) protoBuf.GetSerializedSize();
+            byte[] array = new byte[this.size + 4 + 4];
+            Array.Copy(BitConverter.GetBytes(this.Type), 0, array, 0, 4);
+            Array.Copy(BitConverter.GetBytes(this.Size), 0, array, 4, 4);
+            protoBuf.Serialize(new MemoryStream(array, 8, this.Size));
+            return array;
+        }
+        return null;
+    }*/
+
+    private int toInt32_2(byte[] bytes, int index) {
+        int a = (int)((int)(0xff & bytes[index]) << 32 | (int)(0xff & bytes[index + 1]) << 40 | (int)(0xff & bytes[index + 2]) << 48 | (int)(0xff & bytes[index + 3]) << 56);
+        return a;
+    }
+}
diff --git a/src/main/proto/bnet/protocol/protocol.proto b/src/main/proto/bnet/protocol/protocol.proto
index 90bafe1..8fbd476 100644
--- a/src/main/proto/bnet/protocol/protocol.proto
+++ b/src/main/proto/bnet/protocol/protocol.proto
@@ -2613,4 +2613,429 @@ message CardValues {
 
 	repeated CardValue cards = 1;
 	required int32 card_nerf_index = 2;
+}
+
+// ref: PegasusUtil.RewardProgress
+message RewardProgress {
+	// ref: PegasusUtil.RewardProgress/PacketID
+	enum PacketID {
+		ID = 271;
+	}
+
+	required Date season_end = 1;
+	required int32 wins_per_gold = 2;
+	required int32 gold_per_reward = 3;
+	required int32 max_gold_per_day = 4;
+	required int32 season_number = 5;
+	optional int32 pack_id = 8;
+	required int32 xp_solo_limit = 9;
+	required int32 max_hero_level = 10;
+	required Date next_quest_cancel = 11;
+	required float event_timing_mod = 12;
+}
+
+// ref: PegasusUtil.PlayerRecord
+message PlayerRecord {
+	required GameType type = 1;
+	optional int32 data = 2;
+	required int32 wins = 3;
+	required int32 losses = 4;
+	optional int32 ties = 5;
+}
+
+// ref: PegasusShared.GameType
+enum GameType {
+	GT_UNKNOWN = 0;
+	GT_VS_AI = 1;
+	GT_VS_FRIEND = 2;
+	GT_TUTORIAL = 4;
+	GT_ARENA = 5;
+	GT_TEST = 6;
+	GT_RANKED = 7;
+	GT_CASUAL = 8;
+	GT_TAVERNBRAWL = 16;
+	GT_TB_1P_VS_AI = 17;
+	GT_TB_2P_COOP = 18;
+	GT_LAST = 19;
+}
+
+// ref: PegasusUtil.PlayerRecords
+message PlayerRecords {
+	// ref: PegasusUtil.PlayerRecords/PacketID
+	enum PacketID {
+		ID = 270;
+	}
+
+	repeated PlayerRecord records = 1;
+}
+
+// ref: PegasusUtil.ArcaneDustBalance
+message ArcaneDustBalance {
+	// ref: PegasusUtil.ArcaneDustBalance/PacketID
+	enum PacketID {
+		ID = 262;
+	}
+
+	required int64 balance = 1;
+}
+
+// ref: PegasusUtil.ClientOptions
+message ClientOptions {
+	// ref: PegasusUtil.ClientOptions/PacketID
+	enum PacketID {
+		ID = 241;
+	}
+
+	repeated ClientOption options = 1;
+	optional bool failed = 2;
+}
+
+// ref: PegasusUtil.AdventureProgressResponse
+message AdventureProgressResponse {
+	// ref: PegasusUtil.AdventureProgressResponse/PacketID
+	enum PacketID {
+		ID = 306;
+	}
+
+	repeated AdventureProgress list = 1;
+}
+
+// ref: PegasusShared.AdventureProgress
+message AdventureProgress {
+	// ref: PegasusShared.AdventureProgress/Flags
+	enum Flags {
+		OWNED = 1;
+		DEFEAT_HEROIC_MISSION_1 = 2;
+		DEFEAT_HEROIC_MISSION_2 = 4;
+		DEFEAT_HEROIC_MISSION_3 = 8;
+		DEFEAT_HEROIC_MISSION_4 = 16;
+		DEFEAT_CLASS_CHALLENGE_MISSION_1 = 256;
+		DEFEAT_CLASS_CHALLENGE_MISSION_2 = 512;
+	}
+
+	required int32 wing_id = 1;
+	required int32 progress = 2;
+	optional int32 ack = 3 [default = 0];
+	required uint64 flags = 4;
+}
+
+// ref: PegasusUtil.HeroXP
+message HeroXP {
+	// ref: PegasusUtil.HeroXP/PacketID
+	enum PacketID {
+		ID = 283;
+	}
+
+	repeated HeroXPInfo xp_infos = 1;
+}
+
+// ref: PegasusUtil.HeroXPInfo
+message HeroXPInfo {
+	required int32 class_id = 1;
+	required int32 level = 2;
+	required int64 curr_xp = 3;
+	required int64 max_xp = 4;
+	optional NextHeroLevelReward next_reward = 5;
+}
+
+// ref: PegasusUtil.NextHeroLevelReward
+message NextHeroLevelReward {
+	required int32 level = 1;
+	optional ProfileNoticeRewardBooster reward_booster = 2;
+	optional ProfileNoticeRewardCard reward_card = 3;
+	optional ProfileNoticeRewardDust reward_dust = 4;
+	optional ProfileNoticeRewardGold reward_gold = 5;
+	optional ProfileNoticeRewardMount reward_mount = 6;
+	optional ProfileNoticeRewardForge reward_forge = 7;
+}
+
+// ref: PegasusShared.ProfileNoticeRewardForge
+message ProfileNoticeRewardForge {
+	// ref: PegasusShared.ProfileNoticeRewardForge/NoticeID
+	enum NoticeID {
+		ID = 8;
+	}
+
+	required int32 quantity = 1;
+}
+
+// ref: PegasusShared.ProfileNoticeRewardMount
+message ProfileNoticeRewardMount {
+	// ref: PegasusShared.ProfileNoticeRewardMount/NoticeID
+	enum NoticeID {
+		ID = 7;
+	}
+
+	required int32 mount_id = 1;
+}
+
+// ref: PegasusShared.ProfileNoticeRewardGold
+message ProfileNoticeRewardGold {
+	// ref: PegasusShared.ProfileNoticeRewardGold/NoticeID
+	enum NoticeID {
+		ID = 9;
+	}
+
+	required int32 amount = 1;
+}
+
+// ref: PegasusShared.ProfileNoticeRewardDust
+message ProfileNoticeRewardDust {
+	// ref: PegasusShared.ProfileNoticeRewardDust/NoticeID
+	enum NoticeID {
+		ID = 6;
+	}
+
+	required int32 amount = 1;
+}
+
+// ref: PegasusShared.ProfileNoticeRewardCard
+message ProfileNoticeRewardCard {
+	// ref: PegasusShared.ProfileNoticeRewardCard/NoticeID
+	enum NoticeID {
+		ID = 3;
+	}
+
+	required CardDef card = 1;
+	optional int32 quantity = 2;
+}
+
+// ref: PegasusShared.ProfileNoticeRewardBooster
+message ProfileNoticeRewardBooster {
+	// ref: PegasusShared.ProfileNoticeRewardBooster/NoticeID
+	enum NoticeID {
+		ID = 2;
+	}
+
+	required int32 booster_type = 1;
+	required int32 booster_count = 2;
+}
+
+// ref: PegasusUtil.FavoriteHeroesResponse
+message FavoriteHeroesResponse {
+	// ref: PegasusUtil.FavoriteHeroesResponse/PacketID
+	enum PacketID {
+		ID = 318;
+	}
+
+	repeated FavoriteHero favorite_heroes = 1;
+}
+
+// ref: PegasusShared.FavoriteHero
+message FavoriteHero {
+	required int32 class_id = 1;
+	required CardDef hero = 2;
+}
+
+// ref: PegasusUtil.CardBacks
+message CardBacks {
+	// ref: PegasusUtil.CardBacks/PacketID
+	enum PacketID {
+		system = 0;
+		ID = 236;
+	}
+
+	required int32 default_card_back = 1;
+	repeated int32 card_backs = 2;
+}
+
+// ref: PegasusUtil.AccountLicensesInfoResponse
+message AccountLicensesInfoResponse {
+	// ref: PegasusUtil.AccountLicensesInfoResponse/PacketID
+	enum PacketID {
+		ID = 325;
+	}
+
+	repeated AccountLicenseInfo list = 1;
+}
+
+// ref: PegasusShared.AccountLicenseInfo
+message AccountLicenseInfo {
+	// ref: PegasusShared.AccountLicenseInfo/Flags
+	enum Flags {
+		OWNED = 1;
+	}
+
+	required int64 license = 1;
+	required uint64 flags = 2;
+	required int64 cas_id = 3;
+}
+
+// ref: PegasusUtil.ProfileNotice
+message ProfileNotice {
+	required int64 entry = 1;
+	optional ProfileNoticeMedal medal = 2;
+	optional ProfileNoticeRewardBooster reward_booster = 3;
+	optional ProfileNoticeRewardCard reward_card = 4;
+	optional ProfileNoticePreconDeck precon_deck = 6;
+	optional ProfileNoticeRewardDust reward_dust = 7;
+	optional ProfileNoticeRewardGold reward_gold = 8;
+	optional ProfileNoticeRewardMount reward_mount = 9;
+	optional ProfileNoticeRewardForge reward_forge = 10;
+	required int32 origin = 11;
+	optional int64 origin_data = 12;
+	required Date when = 13;
+	optional ProfileNoticePurchase purchase = 14;
+	optional ProfileNoticeCardBack reward_card_back = 15;
+	optional ProfileNoticeDisconnectedGameResult dc_game_result = 16;
+	optional ProfileNoticeBonusStars bonus_stars = 17;
+	optional ProfileNoticeAdventureProgress adventure_progress = 18;
+	optional ProfileNoticeLevelUp level_up = 19;
+	optional ProfileNoticeAccountLicense account_license = 20;
+}
+
+// ref: PegasusUtil.ProfileNotices
+message ProfileNotices {
+	// ref: PegasusUtil.ProfileNotices/PacketID
+	enum PacketID {
+		ID = 212;
+	}
+
+	repeated ProfileNotice list = 1;
+}
+
+// ref: PegasusShared.ProfileNoticeMedal
+message ProfileNoticeMedal {
+	// ref: PegasusShared.ProfileNoticeMedal/MedalType
+	enum MedalType {
+		UNKNOWN_MEDAL = 0;
+		STANDARD_MEDAL = 1;
+		WILD_MEDAL = 2;
+	}
+
+	// ref: PegasusShared.ProfileNoticeMedal/NoticeID
+	enum NoticeID {
+		ID = 1;
+	}
+
+	required int32 star_level = 1;
+	optional int32 legend_rank = 2;
+	optional int32 best_star_level = 3;
+	optional RewardChest chest = 4;
+	optional MedalType medal_type = 5 [default = UNKNOWN_MEDAL];
+}
+
+// ref: PegasusShared.ProfileNoticePreconDeck
+message ProfileNoticePreconDeck {
+	// ref: PegasusShared.ProfileNoticePreconDeck/NoticeID
+	enum NoticeID {
+		ID = 5;
+	}
+
+	required int64 deck = 1;
+	required int32 hero = 2;
+}
+
+// ref: PegasusShared.ProfileNoticePurchase
+message ProfileNoticePurchase {
+	// ref: PegasusShared.ProfileNoticePurchase/NoticeID
+	enum NoticeID {
+		ID = 10;
+	}
+
+	required string product_id = 1;
+	optional int64 data = 2;
+	optional int32 currency = 3;
+}
+
+// ref: PegasusShared.ProfileNoticeCardBack
+message ProfileNoticeCardBack {
+	// ref: PegasusShared.ProfileNoticeCardBack/NoticeID
+	enum NoticeID {
+		ID = 11;
+	}
+
+	required int32 card_back = 1;
+}
+
+// ref: PegasusShared.ProfileNoticeDisconnectedGameResult
+message ProfileNoticeDisconnectedGameResult {
+	// ref: PegasusShared.ProfileNoticeDisconnectedGameResult/GameResult
+	enum GameResult {
+		GR_UNKNOWN = 0;
+		GR_PLAYING = 1;
+		GR_WINNER = 2;
+		GR_TIE = 3;
+	}
+
+	// ref: PegasusShared.ProfileNoticeDisconnectedGameResult/NoticeID
+	enum NoticeID {
+		ID = 4;
+	}
+
+	// ref: PegasusShared.ProfileNoticeDisconnectedGameResult/PlayerResult
+	enum PlayerResult {
+		PR_UNKNOWN = 0;
+		PR_WON = 1;
+		PR_LOST = 2;
+		PR_DISCONNECTED = 3;
+		PR_QUIT = 4;
+	}
+
+	optional GameType game_type = 8 [default = GT_UNKNOWN];
+	optional int32 mission_id = 9;
+	optional GameResult game_result = 10 [default = GR_UNKNOWN];
+	optional PlayerResult your_result = 11 [default = PR_UNKNOWN];
+	optional PlayerResult opponent_result = 12 [default = PR_UNKNOWN];
+}
+
+// ref: PegasusShared.ProfileNoticeBonusStars
+message ProfileNoticeBonusStars {
+	// ref: PegasusShared.ProfileNoticeBonusStars/NoticeID
+	enum NoticeID {
+		ID = 12;
+	}
+
+	required int32 star_level = 1;
+	required int32 stars = 2;
+}
+
+// ref: PegasusShared.ProfileNoticeAdventureProgress
+message ProfileNoticeAdventureProgress {
+	// ref: PegasusShared.ProfileNoticeAdventureProgress/NoticeID
+	enum NoticeID {
+		ID = 14;
+	}
+
+	required int32 wing_id = 1;
+}
+
+// ref: PegasusShared.ProfileNoticeLevelUp
+message ProfileNoticeLevelUp {
+	// ref: PegasusShared.ProfileNoticeLevelUp/NoticeID
+	enum NoticeID {
+		ID = 15;
+	}
+
+	required int32 hero_class = 1;
+	required int32 new_level = 2;
+}
+
+// ref: PegasusShared.ProfileNoticeAccountLicense
+message ProfileNoticeAccountLicense {
+	// ref: PegasusShared.ProfileNoticeAccountLicense/NoticeID
+	enum NoticeID {
+		ID = 16;
+	}
+
+	required int64 license = 1;
+	required int64 cas_id = 2;
+}
+
+// ref: PegasusShared.RewardBag
+message RewardBag {
+	optional ProfileNoticeRewardBooster reward_booster = 1;
+	optional ProfileNoticeRewardCard reward_card = 2;
+	optional ProfileNoticeRewardDust reward_dust = 3;
+	optional ProfileNoticeRewardGold reward_gold = 4;
+	optional ProfileNoticeCardBack reward_card_back = 5;
+}
+
+// ref: PegasusShared.RewardChest
+message RewardChest {
+	optional RewardBag bag1 = 1;
+	optional RewardBag bag2 = 2;
+	optional RewardBag bag3 = 3;
+	optional RewardBag bag4 = 4;
+	optional RewardBag bag5 = 5;
 }
\ No newline at end of file