private void processUpdate(long authId, byte[] content) {
    if (authId != currentAuthId) {
      return;
    }

    ProtoStruct protoStruct;
    try {
      protoStruct = ProtoSerializer.readUpdate(content);
    } catch (IOException e) {
      e.printStackTrace();
      Log.w(TAG, "Broken mt update");
      return;
    }

    int type = ((Push) protoStruct).updateType;
    byte[] body = ((Push) protoStruct).body;

    RpcScope updateBox;
    try {
      updateBox = new RpcParser().read(type, body);
    } catch (IOException e) {
      e.printStackTrace();
      Log.w(TAG, "Broken update box");
      return;
    }

    // Log.w(TAG, "Box: " + updateBox + "");

    callback.onUpdateReceived(updateBox);
  }
  private void processResponse(long authId, long mid, byte[] content) {
    if (authId != currentAuthId) {
      return;
    }

    ProtoStruct protoStruct;
    try {
      protoStruct = ProtoSerializer.readRpcResponsePayload(content);
    } catch (IOException e) {
      e.printStackTrace();
      Log.w(TAG, "Broken response mid#" + mid);
      return;
    }

    // Log.w(TAG, protoStruct + " mid#" + mid);

    long rid;
    if (idMap.containsKey(mid)) {
      rid = idMap.get(mid);
    } else {
      return;
    }

    RequestHolder holder;
    if (requests.containsKey(rid)) {
      holder = requests.get(rid);
    } else {
      return;
    }

    if (protoStruct instanceof RpcOk) {
      RpcOk ok = (RpcOk) protoStruct;
      requests.remove(rid);
      if (holder.protoId != 0) {
        idMap.remove(holder.protoId);
      }

      Response response;
      try {
        response = (Response) new RpcParser().read(ok.responseType, ok.payload);
      } catch (IOException e) {
        e.printStackTrace();
        return;
      }

      Log.d(
          TAG,
          "<- response#"
              + holder.publicId
              + ": "
              + response
              + " in "
              + (Environment.getCurrentTime() - holder.requestTime)
              + " ms");

      holder.callback.onResult(response);
    } else if (protoStruct instanceof RpcError) {
      RpcError e = (RpcError) protoStruct;
      requests.remove(rid);
      if (holder.protoId != 0) {
        idMap.remove(holder.protoId);
      }

      Log.w(
          TAG,
          "<- error#"
              + holder.publicId
              + ": "
              + e.errorTag
              + " "
              + e.errorCode
              + " "
              + e.userMessage
              + " in "
              + (Environment.getCurrentTime() - holder.requestTime)
              + " ms");

      holder.callback.onError(
          new RpcException(e.errorTag, e.errorCode, e.userMessage, e.canTryAgain, e.relatedData));
    } else if (protoStruct instanceof RpcInternalError) {
      RpcInternalError e = ((RpcInternalError) protoStruct);
      Log.d(
          TAG,
          "<- internal_error#"
              + holder.publicId
              + " "
              + e.getTryAgainDelay()
              + " sec"
              + " in "
              + (Environment.getCurrentTime() - holder.requestTime)
              + " ms");
      if (e.isCanTryAgain()) {
        self().send(new ForceResend(rid), e.getTryAgainDelay() * 1000L);
      } else {
        requests.remove(rid);
        if (holder.protoId != 0) {
          idMap.remove(holder.protoId);
        }
        holder.callback.onError(new RpcInternalException());
      }
    } else if (protoStruct instanceof RpcFloodWait) {
      RpcFloodWait f = (RpcFloodWait) protoStruct;
      Log.d(
          TAG,
          "<- flood_wait#"
              + holder.publicId
              + " "
              + f.getDelay()
              + " sec"
              + " in "
              + (Environment.getCurrentTime() - holder.requestTime)
              + " ms");
      self().send(new ForceResend(rid), f.getDelay() * 1000L);
    } else {
      Log.d(
          TAG,
          "<- unknown_package#"
              + holder.publicId
              + " in "
              + (Environment.getCurrentTime() - holder.requestTime)
              + " ms");
    }
  }