diff --git a/ipmisnoop/ipmisnoop.hpp b/ipmisnoop/ipmisnoop.hpp
index b8f737a..d8319ac 100644
--- a/ipmisnoop/ipmisnoop.hpp
+++ b/ipmisnoop/ipmisnoop.hpp
@@ -54,74 +54,74 @@
             sdbusplus::bus::match::rules::propertiesChanged(objPath, rawIface),
 
             [this, &bus](sdbusplus::message_t& msg) {
-        using primarycode_t = uint64_t;
-        using secondarycode_t = std::vector<uint8_t>;
-        using postcode_t = std::tuple<primarycode_t, secondarycode_t>;
+                using primarycode_t = uint64_t;
+                using secondarycode_t = std::vector<uint8_t>;
+                using postcode_t = std::tuple<primarycode_t, secondarycode_t>;
 
-        /* sevenSegmentLedEnabled flag is set when GPIO pins are not
-        there 7 seg display for fewer platforms. So, the code for
-        postcode display and Get Selector position can be skipped in
-        those platforms.
-        */
-        if (!sevenSegmentLedEnabled)
-        {
-            return;
-        }
-
-        std::string objectName;
-        std::string InterfaceName;
-        std::map<std::string, std::variant<postcode_t>> msgData;
-        msg.read(InterfaceName, msgData);
-
-        std::filesystem::path name(msg.get_path());
-        objectName = name.filename();
-
-        std::string hostNumStr = objectName.substr(hostParseIdx);
-        size_t hostNum = std::stoi(hostNumStr);
-
-        size_t position = getSelectorPosition(bus);
-
-        if (position > maxPosition)
-        {
-            std::cerr << "Invalid position. Position should be 1 to 4 "
-                         "for all hosts "
-                      << std::endl;
-        }
-
-        // Check if it was the Value property that changed.
-        auto valPropMap = msgData.find("Value");
-        if (valPropMap == msgData.end())
-        {
-            std::cerr << "Value property is not found " << std::endl;
-            return;
-        }
-        uint64_t postcode =
-            std::get<0>(std::get<postcode_t>(valPropMap->second));
-
-        if (postcode <= maxPostcode)
-        {
-            if (position == hostNum)
-            {
-                uint8_t postcode_8bit =
-                    static_cast<uint8_t>(postcode & 0x0000FF);
-
-                // write postcode into seven segment display
-                if (postCodeDisplay(postcode_8bit) < 0)
+                /* sevenSegmentLedEnabled flag is set when GPIO pins are not
+                there 7 seg display for fewer platforms. So, the code for
+                postcode display and Get Selector position can be skipped in
+                those platforms.
+                */
+                if (!sevenSegmentLedEnabled)
                 {
-                    fprintf(stderr, "Error in display the postcode\n");
+                    return;
                 }
-            }
-            else
-            {
-                fprintf(stderr, "Host Selector Position and host "
-                                "number is not matched..\n");
-            }
-        }
-        else
-        {
-            fprintf(stderr, "invalid postcode value \n");
-        }
-    })
+
+                std::string objectName;
+                std::string InterfaceName;
+                std::map<std::string, std::variant<postcode_t>> msgData;
+                msg.read(InterfaceName, msgData);
+
+                std::filesystem::path name(msg.get_path());
+                objectName = name.filename();
+
+                std::string hostNumStr = objectName.substr(hostParseIdx);
+                size_t hostNum = std::stoi(hostNumStr);
+
+                size_t position = getSelectorPosition(bus);
+
+                if (position > maxPosition)
+                {
+                    std::cerr << "Invalid position. Position should be 1 to 4 "
+                                 "for all hosts "
+                              << std::endl;
+                }
+
+                // Check if it was the Value property that changed.
+                auto valPropMap = msgData.find("Value");
+                if (valPropMap == msgData.end())
+                {
+                    std::cerr << "Value property is not found " << std::endl;
+                    return;
+                }
+                uint64_t postcode =
+                    std::get<0>(std::get<postcode_t>(valPropMap->second));
+
+                if (postcode <= maxPostcode)
+                {
+                    if (position == hostNum)
+                    {
+                        uint8_t postcode_8bit =
+                            static_cast<uint8_t>(postcode & 0x0000FF);
+
+                        // write postcode into seven segment display
+                        if (postCodeDisplay(postcode_8bit) < 0)
+                        {
+                            fprintf(stderr, "Error in display the postcode\n");
+                        }
+                    }
+                    else
+                    {
+                        fprintf(stderr, "Host Selector Position and host "
+                                        "number is not matched..\n");
+                    }
+                }
+                else
+                {
+                    fprintf(stderr, "invalid postcode value \n");
+                }
+            })
     {}
 
     sdbusplus::bus_t& bus;
