{\rtf1\ansi\ansicpg1252\cocoartf2761
\cocoatextscaling0\cocoaplatform0{\fonttbl\f0\fmodern\fcharset0 Courier-Oblique;\f1\fmodern\fcharset0 Courier;}
{\colortbl;\red255\green255\blue255;\red121\green121\blue121;\red0\green29\blue164;\red9\green9\blue9;
\red140\green119\blue13;\red10\green79\blue103;\red114\green0\blue130;\red18\green51\blue230;\red17\green109\blue18;
\red14\green108\blue119;}
{\*\expandedcolortbl;;\csgenericrgb\c47451\c47451\c47451;\csgenericrgb\c0\c11373\c64314;\csgenericrgb\c3529\c3529\c3529;
\csgenericrgb\c54902\c46667\c5098;\csgenericrgb\c3922\c30980\c40392;\csgenericrgb\c44706\c0\c50980;\csgenericrgb\c7059\c20000\c90196;\csgenericrgb\c6667\c42745\c7059;
\csgenericrgb\c5490\c42353\c46667;}
\paperw11900\paperh16840\margl1440\margr1440\vieww25920\viewh17380\viewkind0
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\partightenfactor0

\f0\i\fs26 \cf2 //\
// Source code recreated from a .class file by IntelliJ IDEA\
// (powered by FernFlower decompiler)\
//\
\

\f1\i0 \cf3 package \cf0 com.pax.log\cf4 ;\
\
\cf3 import \cf0 android.support.\cf4 annotation.Keep;\
\cf3 import \cf0 android.support.\cf4 annotation.NonNull;\
\cf3 import \cf0 java.io.PrintWriter\cf4 ;\
\cf3 import \cf0 java.io.StringWriter\cf4 ;\
\cf3 import \cf0 java.util.Iterator\cf4 ;\
\cf3 import \cf0 java.util.Locale\cf4 ;\
\
\cf5 @Keep\
\cf3 public class \cf0 LogUtils \cf4 \{\
    \cf3 public \cf6 LogUtils\cf4 () \{\
    \}\
\
    \cf3 static \cf0 StackTraceElement \cf6 getCallerStackTraceElement\cf4 (\cf3 int \cf0 hierarchyLevel\cf4 ) \{\
        \cf0 StackTraceElement\cf4 [] \cf0 callers\cf4 ;\
        \cf3 return \cf4 (\cf0 callers \cf4 = (\cf3 new \cf4 Throwable()).getStackTrace())[\cf0 hierarchyLevel \cf4 < \cf0 callers\cf4 .\cf7 length \cf4 ? \cf0 hierarchyLevel \cf4 : \cf0 callers\cf4 .\cf7 length \cf4 - \cf8 1\cf4 ];\
    \}\
\
    \cf3 static \cf0 StackTraceElement \cf6 getCallerStackTraceElement\cf4 (\cf3 int \cf0 hierarchyLevel\cf4 , \cf0 b pool\cf4 ) \{\
        \cf3 if \cf4 (\cf0 pool\cf4 .\cf7 A\cf4 .isEmpty()) \{\
            \cf3 return 
\f0\i \cf4 getCallerStackTraceElement
\f1\i0 (\cf0 hierarchyLevel \cf4 + \cf8 1\cf4 );\
        \} \cf3 else \cf4 \{\
            \cf0 StackTraceElement\cf4 [] \cf0 callers \cf4 = (\cf3 new \cf4 Throwable()).getStackTrace();\
            \cf3 int \cf0 start \cf4 = \cf0 hierarchyLevel \cf4 < \cf0 callers\cf4 .\cf7 length \cf4 ? \cf0 hierarchyLevel \cf4 : \cf0 callers\cf4 .\cf7 length \cf4 - \cf8 1\cf4 ;\
            \cf3 return 
\f0\i \cf4 getCaller
\f1\i0 (\cf0 pool\cf4 , \cf0 callers\cf4 , \cf0 start\cf4 );\
        \}\
    \}\
\
    \cf3 static \cf0 StackTraceElement \cf6 getCaller\cf4 (\cf0 b pool\cf4 , \cf0 StackTraceElement\cf4 [] \cf0 callers\cf4 , \cf3 int \cf0 start\cf4 ) \{\
        \cf0 StackTraceElement targetStackTrace \cf4 = \cf3 null\cf4 ;\
        \cf3 boolean \cf0 shouldTrace \cf4 = \cf3 false\cf4 ;\
\
        \cf3 for\cf4 (\cf3 int \cf0 i \cf4 = \cf0 start\cf4 ; \cf0 i \cf4 < \cf0 callers\cf4 .\cf7 length\cf4 ; ++\cf0 i\cf4 ) \{\
            \cf0 StackTraceElement caller \cf4 = \cf0 callers\cf4 [\cf0 i\cf4 ];\
            \cf3 boolean \cf0 isLogMethod \cf4 = \cf3 false\cf4 ;\
            \cf0 Iterator var8 \cf4 = \cf0 pool\cf4 .\cf7 A\cf4 .iterator();\
\
            \cf3 while\cf4 (\cf0 var8\cf4 .hasNext()) \{\
                \cf0 String className \cf4 = (\cf0 String\cf4 )\cf0 var8\cf4 .next();\
                \cf3 if \cf4 (\cf0 caller\cf4 .getClassName().equals(\cf0 className\cf4 )) \{\
                    \cf0 isLogMethod \cf4 = \cf3 true\cf4 ;\
                    \cf3 break\cf4 ;\
                \}\
            \}\
\
            \cf3 if \cf4 (\cf0 shouldTrace \cf4 && !\cf0 isLogMethod\cf4 ) \{\
                \cf0 targetStackTrace \cf4 = \cf0 caller\cf4 ;\
                \cf3 break\cf4 ;\
            \}\
\
            \cf0 shouldTrace \cf4 = \cf0 isLogMethod\cf4 ;\
        \}\
\
        \cf3 return \cf0 targetStackTrace\cf4 ;\
    \}\
\
    \cf3 static \cf0 String \cf6 formatCallerStackTrace\cf4 (\cf0 StackTraceElement caller\cf4 ) \{\
        \cf0 String tag \cf4 = \cf9 "%s.%s(L:%d)"\cf4 ;\
        \cf0 String var10000 \cf4 = \cf0 caller\cf4 .getClassName();\
        \cf0 String callerClazzName \cf4 = \cf0 var10000\cf4 .substring(\cf0 var10000\cf4 .lastIndexOf(\cf9 "."\cf4 ) + \cf8 1\cf4 );\
        \cf3 return \cf0 String\cf4 .
\f0\i format
\f1\i0 (\cf0 Locale\cf4 .
\f0\i \cf7 ENGLISH
\f1\i0 \cf4 , \cf0 tag\cf4 , \cf0 callerClazzName\cf4 , \cf0 caller\cf4 .getMethodName(), \cf0 caller\cf4 .getLineNumber());\
    \}\
\
    \cf3 static \cf0 String \cf6 generateTag\cf4 (\cf0 String tagPrefix\cf4 , \cf0 String customTag\cf4 , \cf0 StackTraceElement caller\cf4 ) \{\
        \cf0 String tag \cf4 = 
\f0\i formatCallerStackTrace
\f1\i0 (\cf0 caller\cf4 );\
        \cf0 tag \cf4 = 
\f0\i isEmpty
\f1\i0 (\cf0 customTag\cf4 ) ? \cf0 tag \cf4 : \cf0 customTag \cf4 + \cf9 " " \cf4 + \cf0 tag\cf4 ;\
        \cf3 return 
\f0\i \cf4 isEmpty
\f1\i0 (\cf0 tagPrefix\cf4 ) ? \cf0 tag \cf4 : \cf0 tagPrefix \cf4 + \cf9 " " \cf4 + \cf0 tag\cf4 ;\
    \}\
\
    \cf3 static \cf0 String \cf6 getStackTraceString\cf4 (\cf0 Throwable tr\cf4 ) \{\
        \cf3 if \cf4 (\cf0 tr \cf4 == \cf3 null\cf4 ) \{\
            \cf3 return \cf9 ""\cf4 ;\
        \} \cf3 else \cf4 \{\
            \cf0 StringWriter sw \cf4 = \cf3 new \cf4 StringWriter();\
            \cf0 PrintWriter pw \cf4 = \cf3 new \cf4 PrintWriter(\cf0 sw\cf4 );\
            \cf0 tr\cf4 .printStackTrace(\cf0 pw\cf4 );\
            \cf0 pw\cf4 .close();\
            \cf3 return \cf0 sw\cf4 .toString();\
        \}\
    \}\
\
    \cf3 private static \cf4 <\cf10 T\cf4 > \cf0 Class\cf4 <\cf10 T\cf4 > \cf6 getClass\cf4 (\cf0 String className\cf4 ) \{\
        \cf0 Class\cf4 <\cf10 T\cf4 > \cf0 clazz \cf4 = \cf3 null\cf4 ;\
\
        \cf3 try \cf4 \{\
            \cf0 clazz \cf4 = \cf0 Class\cf4 .
\f0\i forName
\f1\i0 (\cf0 className\cf4 );\
        \} \cf3 catch \cf4 (\cf0 Exception var2\cf4 ) \{\
        \}\
\
        \cf3 return \cf0 clazz\cf4 ;\
    \}\
\
    \cf3 public static boolean \cf6 isEmpty\cf4 (\cf0 CharSequence str\cf4 ) \{\
        \cf3 return \cf0 str \cf4 == \cf3 null \cf4 || \cf0 str\cf4 .length() == \cf8 0\cf4 ;\
    \}\
\
    \cf5 @NonNull\
    \cf3 public static \cf0 String \cf6 getNonNullString\cf4 (\cf0 Object value\cf4 ) \{\
        \cf3 if \cf4 (\cf0 value \cf3 instanceof \cf0 CharSequence\cf4 ) \{\
            \cf0 CharSequence str\cf4 ;\
            \cf3 return 
\f0\i \cf4 isEmpty
\f1\i0 (\cf0 str \cf4 = (\cf0 CharSequence\cf4 )\cf0 value\cf4 ) ? \cf9 "" \cf4 : \cf0 str\cf4 .toString();\
        \} \cf3 else \cf4 \{\
            \cf3 return \cf0 value \cf4 == \cf3 null \cf4 ? \cf9 "" \cf4 : \cf0 String\cf4 .
\f0\i valueOf
\f1\i0 (\cf0 value\cf4 );\
        \}\
    \}\
\
    \cf3 public static boolean \cf6 isAndroid\cf4 () \{\
        \cf0 Class clazz \cf4 = 
\f0\i getClass
\f1\i0 (\cf9 "android.os.Build$VERSION"\cf4 );\
        \cf3 boolean \cf0 isAndroid \cf4 = \cf3 false\cf4 ;\
        \cf3 if \cf4 (\cf0 clazz \cf4 != \cf3 null\cf4 ) \{\
            \cf3 try \cf4 \{\
                \cf0 isAndroid \cf4 = \cf0 clazz\cf4 .getDeclaredField(\cf9 "SDK_INT"\cf4 ).getInt((\cf0 Object\cf4 )\cf3 null\cf4 ) != \cf8 0\cf4 ;\
            \} \cf3 catch \cf4 (\cf0 NoSuchFieldException \cf4 | \cf0 IllegalAccessException var2\cf4 ) \{\
                \cf0 var2\cf4 .printStackTrace();\
            \}\
        \}\
\
        \cf3 return \cf0 isAndroid\cf4 ;\
    \}\
\}\
\
}