 +      printf_stderr("%s",ss.str().c_str());
 +    }
 +  }
-+#if defined(MOZ_WIDGET_ANDROID) || defined(MOZ_WIDGET_GONK)
++
 +  template<class Key, class Value>
 +  void printInternal(const std::unordered_map<Key, Value> aMap, const char* const aObjName)
 +  {

From c7d5e035e7f76edd082fe56718706570058b4325 Mon Sep 17 00:00:00 2001
From: James Cheng <jacheng@mozilla.com>
Date: Thu, 4 Aug 2016 14:50:57 +0800
Subject: [PATCH] installer

MozReview-Commit-ID: DNvAvWuXaoQ
---
 xpcom/glue/ezlogger.h | 516 ++++++++++++++++++++++++++++++++++++++++++++++++++
 xpcom/glue/moz.build  |   1 +
 2 files changed, 517 insertions(+)
 create mode 100644 xpcom/glue/ezlogger.h

diff --git a/xpcom/glue/ezlogger.h b/xpcom/glue/ezlogger.h
new file mode 100644
index 0000000..a6b9e8f
--- /dev/null
+++ b/xpcom/glue/ezlogger.h
@@ -0,0 +1,516 @@
+#ifndef __EZLOGGER_H__
+#define __EZLOGGER_H__
+#if defined(__GNUC__)
+#pragma GCC diagnostic ignored "-Wunused-function"
+#endif
+#include <stdio.h>
+#include <utility>
+#include <string>

+  void printInternal(const std::vector<uint8_t>& aVec, const char* const aObjName)
+  {
+    auto hexString = bin2hex(aVec);
+    printf_stderr("%s = %s, unsgined vector length = %" PRIuSIZE, aObjName, hexString.c_str(), aVec.size());
+  }
+
+  template<>
+  void printInternal(const std::vector<char>& aVec, const char* const aObjName)
+  {
+    auto hexString = bin2hex(aVec);
+    printf_stderr("%s = %s, signed vector length = %" PRIuSIZE, aObjName, hexString.c_str(), aVec.size());
+  }
+
+  template<class Key, class Value>
