// Path: davinci/src/main/java/cn/hadcn/davinci/image/base/Util.java
// public final class Util {
//     public static final Charset US_ASCII = Charset.forName("US-ASCII");
//     public static final Charset UTF_8 = Charset.forName("UTF-8");
// 
//     private Util() {
//     }
// 
//     public static String readFully(Reader reader) throws IOException {
//         try {
//             StringWriter writer = new StringWriter();
//             char[] buffer = new char[1024];
//             int count;
//             while ((count = reader.read(buffer)) != -1) {
//                 writer.write(buffer, 0, count);
//             }
//             return writer.toString();
//         } finally {
//             reader.close();
//         }
//     }
// 
//     /**
//     * Deletes the contents of {@code dir}. Throws an IOException if any file
//     * could not be deleted, or if {@code dir} is not a readable directory.
//     */
//     public static void deleteContents(File dir) throws IOException {
//         File[] files = dir.listFiles();
//         if (files == null) {
//             throw new IOException("not a readable directory: " + dir);
//         }
//         for (File file : files) {
//             if (file.isDirectory()) {
//                 deleteContents(file);
//             }
//             if (!file.delete()) {
//                 throw new IOException("failed to delete file: " + file);
//             }
//         }
//     }
// 
//     public static void closeQuietly(/*Auto*/Closeable closeable) {
//         if (closeable != null) {
//             try {
//                 closeable.close();
//             } catch (RuntimeException rethrown) {
//                 throw rethrown;
//             } catch (Exception ignored) {
//             }
//         }
//     }
// 
//     /**
//     * Creates a unique cache key based on a url value
//     * because file name in linux is limited
//     * @param uri
//     * 		uri to be used in key creation
//     * @return
//     * 		cache key value
//     */
//     public static String generateKey(String uri) {
//         String regEx = "[^a-zA-Z0-9_-]";
//         Pattern p = Pattern.compile(regEx);
//         Matcher m = p.matcher(uri);
//         String key = m.replaceAll("").trim();
//         int length = key.length();
//         if ( length <= 120 ) {  //limited by DisLruCache
//             return key;
//         } else {
//             return key.substring(0, 120);
//         }
//     }
// 
//     public static boolean doGif(ImageView imageView, byte[] data) {
//         if ( isGif( data ) ) {
//             try {
//                 GifDrawable gifDrawable = new GifDrawable(data);
//                 imageView.setImageDrawable(gifDrawable);
//                 return true;
//             } catch (Throwable e) {
//                 VinciLog.w("pl.droidsonroids.gif.GifDrawable not found");
//             }
//         }
//         return false;
//     }
// 
//     public static boolean isGif(byte[] data) {
//         return data[0] == 'G' && data[1] == 'I' && data[2] == 'F';
//     }
// }


import java.io.BufferedWriter;
import java.io.Closeable;
import java.io.EOFException;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FilterOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.concurrent.Callable;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import cn.hadcn.davinci.image.base.Util;
        renameTo(backupFile, journalFile, false);
      }
    }

    // Prefer to pick up where we left off.
    DiskLruCache cache = new DiskLruCache(directory, appVersion, valueCount, maxSize);
    if (cache.journalFile.exists()) {
      try {
        cache.readJournal();
        cache.processJournal();
        return cache;
      } catch (IOException journalIsCorrupt) {
        System.out
            .println("DiskLruCache "
                + directory
                + " is corrupt: "
                + journalIsCorrupt.getMessage()
                + ", removing");
        cache.delete();
      }
    }

    // Create a new empty cache.
    directory.mkdirs();
    cache = new DiskLruCache(directory, appVersion, valueCount, maxSize);
    cache.rebuildJournal();
    return cache;
  }

  private void readJournal() throws IOException {
// Path: davinci/src/main/java/cn/hadcn/davinci/image/base/Util.java
// public final class Util {
//     public static final Charset US_ASCII = Charset.forName("US-ASCII");
//     public static final Charset UTF_8 = Charset.forName("UTF-8");
// 
//     private Util() {
//     }
// 
//     public static String readFully(Reader reader) throws IOException {
//         try {
//             StringWriter writer = new StringWriter();
//             char[] buffer = new char[1024];
//             int count;
//             while ((count = reader.read(buffer)) != -1) {
//                 writer.write(buffer, 0, count);
//             }
//             return writer.toString();
//         } finally {
//             reader.close();
//         }
//     }
// 
//     /**
//     * Deletes the contents of {@code dir}. Throws an IOException if any file
//     * could not be deleted, or if {@code dir} is not a readable directory.
//     */
//     public static void deleteContents(File dir) throws IOException {
//         File[] files = dir.listFiles();
//         if (files == null) {
//             throw new IOException("not a readable directory: " + dir);
//         }
//         for (File file : files) {
//             if (file.isDirectory()) {
//                 deleteContents(file);
//             }
//             if (!file.delete()) {
//                 throw new IOException("failed to delete file: " + file);
//             }
//         }
//     }
// 
//     public static void closeQuietly(/*Auto*/Closeable closeable) {
//         if (closeable != null) {
//             try {
//                 closeable.close();
//             } catch (RuntimeException rethrown) {
//                 throw rethrown;
//             } catch (Exception ignored) {
//             }
//         }
//     }
// 
//     /**
//     * Creates a unique cache key based on a url value
//     * because file name in linux is limited
//     * @param uri
//     * 		uri to be used in key creation
//     * @return
//     * 		cache key value
//     */
//     public static String generateKey(String uri) {
//         String regEx = "[^a-zA-Z0-9_-]";
//         Pattern p = Pattern.compile(regEx);
//         Matcher m = p.matcher(uri);
//         String key = m.replaceAll("").trim();
//         int length = key.length();
//         if ( length <= 120 ) {  //limited by DisLruCache
//             return key;
//         } else {
//             return key.substring(0, 120);
//         }
//     }
// 
//     public static boolean doGif(ImageView imageView, byte[] data) {
//         if ( isGif( data ) ) {
//             try {
//                 GifDrawable gifDrawable = new GifDrawable(data);
//                 imageView.setImageDrawable(gifDrawable);
//                 return true;
//             } catch (Throwable e) {
//                 VinciLog.w("pl.droidsonroids.gif.GifDrawable not found");
//             }
//         }
//         return false;
//     }
// 
//     public static boolean isGif(byte[] data) {
//         return data[0] == 'G' && data[1] == 'I' && data[2] == 'F';
//     }
// }


// Path: davinci/src/main/java/cn/hadcn/davinci/image/cache/DiskLruCache.java
import java.io.BufferedWriter;
import java.io.Closeable;
import java.io.EOFException;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FilterOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.concurrent.Callable;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import cn.hadcn.davinci.image.base.Util;

        renameTo(backupFile, journalFile, false);
      }
    }

    // Prefer to pick up where we left off.
    DiskLruCache cache = new DiskLruCache(directory, appVersion, valueCount, maxSize);
    if (cache.journalFile.exists()) {
      try {
        cache.readJournal();
        cache.processJournal();
        return cache;
      } catch (IOException journalIsCorrupt) {
        System.out
            .println("DiskLruCache "
                + directory
                + " is corrupt: "
                + journalIsCorrupt.getMessage()
                + ", removing");
        cache.delete();
      }
    }

    // Create a new empty cache.
    directory.mkdirs();
    cache = new DiskLruCache(directory, appVersion, valueCount, maxSize);
    cache.rebuildJournal();
    return cache;
  }

  private void readJournal() throws IOException {
    StrictLineReader reader = new StrictLineReader(new FileInputStream(journalFile), Util.US_ASCII);