We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
The "show_stats" command got broken
The "show_stats server" and "show_stats client" command got the following error. This is caused by this PR change (https://github.com/NVIDIA/NVFlare/pull/162):

> show_stats server
Error: Failed to communicate with Admin Server localhost on 8003: '_DefaultReplyProcessor' object has no attribute 'process_dict'
Done [7269 usecs] 2022-02-08 17:26:12.865006
> 


--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `nvflare/fuel/hci/client/api_spec.py`
Content:
```
1 # Copyright (c) 2021-2022, NVIDIA CORPORATION.  All rights reserved.
2 #
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
6 #
7 #     http://www.apache.org/licenses/LICENSE-2.0
8 #
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
14 
15 from __future__ import annotations
16 
17 from abc import ABC, abstractmethod
18 from typing import Optional
19 
20 from nvflare.fuel.hci.table import Table
21 
22 
23 class ReplyProcessor:
24     """A base class for parsing server's response."""
25 
26     def reply_start(self, api: AdminAPISpec, reply_json):
27         pass
28 
29     def process_string(self, api: AdminAPISpec, item: str):
30         pass
31 
32     def process_success(self, api: AdminAPISpec, item: str):
33         pass
34 
35     def process_error(self, api: AdminAPISpec, err: str):
36         pass
37 
38     def process_table(self, api: AdminAPISpec, table: Table):
39         pass
40 
41     def process_shutdown(self, api: AdminAPISpec, msg: str):
42         pass
43 
44     def process_token(self, api: AdminAPISpec, token: str):
45         pass
46 
47     def protocol_error(self, api: AdminAPISpec, err: str):
48         pass
49 
50     def reply_done(self, api: AdminAPISpec):
51         pass
52 
53 
54 class AdminAPISpec(ABC):
55     def __init__(self):
56         self.reply_processor = None
57         self.command_result = None
58 
59     @abstractmethod
60     def server_execute(self, command: str, reply_processor: Optional[ReplyProcessor] = None):
61         """Executes a command on server side.
62 
63         Args:
64             command: The command to be executed.
65             reply_processor: Reply callback to use.
66         """
67         pass
68 
69     def set_command_result(self, result):
70         """Sets the result returning from executing the command."""
71         self.command_result = result
72 
73     def get_command_result(self):
74         """Gets the result returning from executing the command."""
75         return self.command_result
76
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/nvflare/fuel/hci/client/api_spec.py b/nvflare/fuel/hci/client/api_spec.py
--- a/nvflare/fuel/hci/client/api_spec.py
+++ b/nvflare/fuel/hci/client/api_spec.py
@@ -38,6 +38,9 @@
     def process_table(self, api: AdminAPISpec, table: Table):
         pass
 
+    def process_dict(self, api: AdminAPISpec, data: dict):
+        pass
+
     def process_shutdown(self, api: AdminAPISpec, msg: str):
         pass

{"golden_diff": "diff --git a/nvflare/fuel/hci/client/api_spec.py b/nvflare/fuel/hci/client/api_spec.py\n--- a/nvflare/fuel/hci/client/api_spec.py\n+++ b/nvflare/fuel/hci/client/api_spec.py\n@@ -38,6 +38,9 @@\n     def process_table(self, api: AdminAPISpec, table: Table):\n         pass\n \n+    def process_dict(self, api: AdminAPISpec, data: dict):\n+        pass\n+\n     def process_shutdown(self, api: AdminAPISpec, msg: str):\n         pass\n", "issue": "The \"show_stats\" command got broken\nThe \"show_stats server\" and \"show_stats client\" command got the following error. This is caused by this PR change (https://github.com/NVIDIA/NVFlare/pull/162):\r\n\r\n> show_stats server\r\nError: Failed to communicate with Admin Server localhost on 8003: '_DefaultReplyProcessor' object has no attribute 'process_dict'\r\nDone [7269 usecs] 2022-02-08 17:26:12.865006\r\n> \r\n\n", "before_files": [{"content": "# Copyright (c) 2021-2022, NVIDIA CORPORATION.  All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nfrom __future__ import annotations\n\nfrom abc import ABC, abstractmethod\nfrom typing import Optional\n\nfrom nvflare.fuel.hci.table import Table\n\n\nclass ReplyProcessor:\n    \"\"\"A base class for parsing server's response.\"\"\"\n\n    def reply_start(self, api: AdminAPISpec, reply_json):\n        pass\n\n    def process_string(self, api: AdminAPISpec, item: str):\n        pass\n\n    def process_success(self, api: AdminAPISpec, item: str):\n        pass\n\n    def process_error(self, api: AdminAPISpec, err: str):\n        pass\n\n    def process_table(self, api: AdminAPISpec, table: Table):\n        pass\n\n    def process_shutdown(self, api: AdminAPISpec, msg: str):\n        pass\n\n    def process_token(self, api: AdminAPISpec, token: str):\n        pass\n\n    def protocol_error(self, api: AdminAPISpec, err: str):\n        pass\n\n    def reply_done(self, api: AdminAPISpec):\n        pass\n\n\nclass AdminAPISpec(ABC):\n    def __init__(self):\n        self.reply_processor = None\n        self.command_result = None\n\n    @abstractmethod\n    def server_execute(self, command: str, reply_processor: Optional[ReplyProcessor] = None):\n        \"\"\"Executes a command on server side.\n\n        Args:\n            command: The command to be executed.\n            reply_processor: Reply callback to use.\n        \"\"\"\n        pass\n\n    def set_command_result(self, result):\n        \"\"\"Sets the result returning from executing the command.\"\"\"\n        self.command_result = result\n\n    def get_command_result(self):\n        \"\"\"Gets the result returning from executing the command.\"\"\"\n        return self.command_result\n", "path": "nvflare/fuel/hci/client/api_spec.py"}], "after_files": [{"content": "# Copyright (c) 2021-2022, NVIDIA CORPORATION.  All rights reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nfrom __future__ import annotations\n\nfrom abc import ABC, abstractmethod\nfrom typing import Optional\n\nfrom nvflare.fuel.hci.table import Table\n\n\nclass ReplyProcessor:\n    \"\"\"A base class for parsing server's response.\"\"\"\n\n    def reply_start(self, api: AdminAPISpec, reply_json):\n        pass\n\n    def process_string(self, api: AdminAPISpec, item: str):\n        pass\n\n    def process_success(self, api: AdminAPISpec, item: str):\n        pass\n\n    def process_error(self, api: AdminAPISpec, err: str):\n        pass\n\n    def process_table(self, api: AdminAPISpec, table: Table):\n        pass\n\n    def process_dict(self, api: AdminAPISpec, data: dict):\n        pass\n\n    def process_shutdown(self, api: AdminAPISpec, msg: str):\n        pass\n\n    def process_token(self, api: AdminAPISpec, token: str):\n        pass\n\n    def protocol_error(self, api: AdminAPISpec, err: str):\n        pass\n\n    def reply_done(self, api: AdminAPISpec):\n        pass\n\n\nclass AdminAPISpec(ABC):\n    def __init__(self):\n        self.reply_processor = None\n        self.command_result = None\n\n    @abstractmethod\n    def server_execute(self, command: str, reply_processor: Optional[ReplyProcessor] = None):\n        \"\"\"Executes a command on server side.\n\n        Args:\n            command: The command to be executed.\n            reply_processor: Reply callback to use.\n        \"\"\"\n        pass\n\n    def set_command_result(self, result):\n        \"\"\"Sets the result returning from executing the command.\"\"\"\n        self.command_result = result\n\n    def get_command_result(self):\n        \"\"\"Gets the result returning from executing the command.\"\"\"\n        return self.command_result\n", "path": "nvflare/fuel/hci/client/api_spec.py"}]}