Many more changes from recent IJ inspections
diff --git a/.gitignore b/.gitignore
index 6ff8804..8f268bf 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,4 @@
 target
-private
 .idea
 *.iml
 .DS_Store
diff --git a/android/src/com/google/zxing/client/android/encode/QRCodeEncoder.java b/android/src/com/google/zxing/client/android/encode/QRCodeEncoder.java
index bd84b8f..6c0897f 100755
--- a/android/src/com/google/zxing/client/android/encode/QRCodeEncoder.java
+++ b/android/src/com/google/zxing/client/android/encode/QRCodeEncoder.java
@@ -40,6 +40,7 @@
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -195,7 +196,7 @@
         baos.write(buffer, 0, bytesRead);
       }
       vcard = baos.toByteArray();
-      vcardString = new String(vcard, 0, vcard.length, "UTF-8");
+      vcardString = new String(vcard, 0, vcard.length, StandardCharsets.UTF_8);
     } catch (IOException ioe) {
       throw new WriterException(ioe);
     }
diff --git a/android/src/com/google/zxing/client/android/result/supplement/BookResultInfoRetriever.java b/android/src/com/google/zxing/client/android/result/supplement/BookResultInfoRetriever.java
index 549c3f1..2d03f1f 100644
--- a/android/src/com/google/zxing/client/android/result/supplement/BookResultInfoRetriever.java
+++ b/android/src/com/google/zxing/client/android/result/supplement/BookResultInfoRetriever.java
@@ -99,7 +99,7 @@
     String baseBookUri = "http://www.google." + LocaleManager.getBookSearchCountryTLD(context)
         + "/search?tbm=bks&source=zxing&q=";
 
-    append(isbn, source, newTexts.toArray(new String[newTexts.size()]), baseBookUri + isbn);
+    append(isbn, source, newTexts.toArray(EMPTY_STR_ARRAY), baseBookUri + isbn);
   }
 
 }
diff --git a/android/src/com/google/zxing/client/android/result/supplement/SupplementalInfoRetriever.java b/android/src/com/google/zxing/client/android/result/supplement/SupplementalInfoRetriever.java
index 3b66f3e..24e1ba0 100644
--- a/android/src/com/google/zxing/client/android/result/supplement/SupplementalInfoRetriever.java
+++ b/android/src/com/google/zxing/client/android/result/supplement/SupplementalInfoRetriever.java
@@ -46,6 +46,8 @@
 
   private static final String TAG = "SupplementalInfo";
 
+  static final String[] EMPTY_STR_ARRAY = new String[0];
+
   private final WeakReference<TextView> textViewRef;
   private final WeakReference<HistoryManager> historyManagerRef;
   private final Collection<Spannable> newContents;
diff --git a/core/src/main/java/com/google/zxing/MultiFormatReader.java b/core/src/main/java/com/google/zxing/MultiFormatReader.java
index fe6f4ce..44cef6d 100644
--- a/core/src/main/java/com/google/zxing/MultiFormatReader.java
+++ b/core/src/main/java/com/google/zxing/MultiFormatReader.java
@@ -37,6 +37,8 @@
  */
 public final class MultiFormatReader implements Reader {
 
+  private static final Reader[] EMPTY_READER_ARRAY = new Reader[0];
+
   private Map<DecodeHintType,?> hints;
   private Reader[] readers;
 
@@ -152,7 +154,7 @@
         readers.add(new MultiFormatOneDReader(hints));
       }
     }
-    this.readers = readers.toArray(new Reader[readers.size()]);
+    this.readers = readers.toArray(EMPTY_READER_ARRAY);
   }
 
   @Override
diff --git a/core/src/main/java/com/google/zxing/aztec/encoder/HighLevelEncoder.java b/core/src/main/java/com/google/zxing/aztec/encoder/HighLevelEncoder.java
index 8cf514e..8a20fd5 100644
--- a/core/src/main/java/com/google/zxing/aztec/encoder/HighLevelEncoder.java
+++ b/core/src/main/java/com/google/zxing/aztec/encoder/HighLevelEncoder.java
@@ -24,7 +24,6 @@
 import java.util.Comparator;
 import java.util.Iterator;
 import java.util.LinkedList;
-import java.util.List;
 
 /**
  * This produces nearly optimal encodings of text into the first-level of
@@ -284,7 +283,7 @@
   }
 
   private static Collection<State> simplifyStates(Iterable<State> states) {
-    List<State> result = new LinkedList<>();
+    Collection<State> result = new LinkedList<>();
     for (State newState : states) {
       boolean add = true;
       for (Iterator<State> iterator = result.iterator(); iterator.hasNext();) {
diff --git a/core/src/main/java/com/google/zxing/client/result/AddressBookAUResultParser.java b/core/src/main/java/com/google/zxing/client/result/AddressBookAUResultParser.java
index cf7f96e..0418c6d 100644
--- a/core/src/main/java/com/google/zxing/client/result/AddressBookAUResultParser.java
+++ b/core/src/main/java/com/google/zxing/client/result/AddressBookAUResultParser.java
@@ -85,7 +85,7 @@
     if (values == null) {
       return null;
     }
-    return values.toArray(new String[values.size()]);
+    return values.toArray(EMPTY_STR_ARRAY);
   }
 
 }
diff --git a/core/src/main/java/com/google/zxing/client/result/ResultParser.java b/core/src/main/java/com/google/zxing/client/result/ResultParser.java
index c86f1f7..ecf3c20 100644
--- a/core/src/main/java/com/google/zxing/client/result/ResultParser.java
+++ b/core/src/main/java/com/google/zxing/client/result/ResultParser.java
@@ -67,6 +67,8 @@
   private static final Pattern EQUALS = Pattern.compile("=");
   private static final String BYTE_ORDER_MARK = "\ufeff";
 
+  static final String[] EMPTY_STR_ARRAY = new String[0];
+
   /**
    * Attempts to parse the raw {@link Result}'s contents as a particular type
    * of information (email, URL, etc.) and return a {@link ParsedResult} encapsulating
@@ -236,7 +238,7 @@
     if (matches == null || matches.isEmpty()) {
       return null;
     }
-    return matches.toArray(new String[matches.size()]);
+    return matches.toArray(EMPTY_STR_ARRAY);
   }
 
   private static int countPrecedingBackslashes(CharSequence s, int pos) {
diff --git a/core/src/main/java/com/google/zxing/client/result/SMSMMSResultParser.java b/core/src/main/java/com/google/zxing/client/result/SMSMMSResultParser.java
index a8d65d3..2d0840b 100644
--- a/core/src/main/java/com/google/zxing/client/result/SMSMMSResultParser.java
+++ b/core/src/main/java/com/google/zxing/client/result/SMSMMSResultParser.java
@@ -80,8 +80,8 @@
     }
     addNumberVia(numbers, vias, smsURIWithoutQuery.substring(lastComma + 1));    
 
-    return new SMSParsedResult(numbers.toArray(new String[numbers.size()]),
-                               vias.toArray(new String[vias.size()]),
+    return new SMSParsedResult(numbers.toArray(EMPTY_STR_ARRAY),
+                               vias.toArray(EMPTY_STR_ARRAY),
                                subject,
                                body);
   }
@@ -106,4 +106,4 @@
     }
   }
 
-}
\ No newline at end of file
+}
diff --git a/core/src/main/java/com/google/zxing/client/result/VCardResultParser.java b/core/src/main/java/com/google/zxing/client/result/VCardResultParser.java
index 3e9d682..5155c6f 100644
--- a/core/src/main/java/com/google/zxing/client/result/VCardResultParser.java
+++ b/core/src/main/java/com/google/zxing/client/result/VCardResultParser.java
@@ -296,7 +296,7 @@
         result.add(value);
       }
     }
-    return result.toArray(new String[result.size()]);
+    return result.toArray(EMPTY_STR_ARRAY);
   }
   
   private static String[] toTypes(Collection<List<String>> lists) {
@@ -324,7 +324,7 @@
         result.add(type);
       }
     }
-    return result.toArray(new String[result.size()]);
+    return result.toArray(EMPTY_STR_ARRAY);
   }
 
   private static boolean isLikeVCardDate(CharSequence value) {
diff --git a/core/src/main/java/com/google/zxing/common/BitArray.java b/core/src/main/java/com/google/zxing/common/BitArray.java
index 3216b3e..a6c1ec4 100644
--- a/core/src/main/java/com/google/zxing/common/BitArray.java
+++ b/core/src/main/java/com/google/zxing/common/BitArray.java
@@ -99,7 +99,7 @@
     int bitsOffset = from / 32;
     int currentBits = bits[bitsOffset];
     // mask off lesser bits first
-    currentBits &= ~((1 << (from & 0x1F)) - 1);
+    currentBits &= -(1 << (from & 0x1F));
     while (currentBits == 0) {
       if (++bitsOffset == bits.length) {
         return size;
@@ -122,7 +122,7 @@
     int bitsOffset = from / 32;
     int currentBits = ~bits[bitsOffset];
     // mask off lesser bits first
-    currentBits &= ~((1 << (from & 0x1F)) - 1);
+    currentBits &= -(1 << (from & 0x1F));
     while (currentBits == 0) {
       if (++bitsOffset == bits.length) {
         return size;
diff --git a/core/src/main/java/com/google/zxing/common/detector/WhiteRectangleDetector.java b/core/src/main/java/com/google/zxing/common/detector/WhiteRectangleDetector.java
index 0ac0267..8d77b0d 100644
--- a/core/src/main/java/com/google/zxing/common/detector/WhiteRectangleDetector.java
+++ b/core/src/main/java/com/google/zxing/common/detector/WhiteRectangleDetector.java
@@ -90,7 +90,6 @@
     int down = downInit;
     boolean sizeExceeded = false;
     boolean aBlackPointFoundOnBorder = true;
-    boolean atLeastOneBlackPointFoundOnBorder = false;
 
     boolean atLeastOneBlackPointFoundOnRight = false;
     boolean atLeastOneBlackPointFoundOnBottom = false;
@@ -181,13 +180,9 @@
         break;
       }
 
-      if (aBlackPointFoundOnBorder) {
-        atLeastOneBlackPointFoundOnBorder = true;
-      }
-
     }
 
-    if (!sizeExceeded && atLeastOneBlackPointFoundOnBorder) {
+    if (!sizeExceeded) {
 
       int maxSize = right - left;
 
diff --git a/core/src/main/java/com/google/zxing/datamatrix/encoder/C40Encoder.java b/core/src/main/java/com/google/zxing/datamatrix/encoder/C40Encoder.java
index d0e0c84..869e659 100644
--- a/core/src/main/java/com/google/zxing/datamatrix/encoder/C40Encoder.java
+++ b/core/src/main/java/com/google/zxing/datamatrix/encoder/C40Encoder.java
@@ -45,8 +45,7 @@
         if ((buffer.length() % 3) == 2 && (available < 2 || available > 2)) {
           lastCharSize = backtrackOneCharacter(context, buffer, removed, lastCharSize);
         }
-        while ((buffer.length() % 3) == 1
-            && ((lastCharSize <= 3 && available != 1) || lastCharSize > 3)) {
+        while ((buffer.length() % 3) == 1 && (lastCharSize > 3 || available != 1)) {
           lastCharSize = backtrackOneCharacter(context, buffer, removed, lastCharSize);
         }
         break;
diff --git a/core/src/main/java/com/google/zxing/maxicode/MaxiCodeReader.java b/core/src/main/java/com/google/zxing/maxicode/MaxiCodeReader.java
index 1d43033..cf51fa5 100644
--- a/core/src/main/java/com/google/zxing/maxicode/MaxiCodeReader.java
+++ b/core/src/main/java/com/google/zxing/maxicode/MaxiCodeReader.java
@@ -59,14 +59,10 @@
   @Override
   public Result decode(BinaryBitmap image, Map<DecodeHintType,?> hints)
       throws NotFoundException, ChecksumException, FormatException {
-    DecoderResult decoderResult;
-    if (hints != null && hints.containsKey(DecodeHintType.PURE_BARCODE)) {
-      BitMatrix bits = extractPureBits(image.getBlackMatrix());
-      decoderResult = decoder.decode(bits, hints);
-    } else {
-      throw NotFoundException.getNotFoundInstance();
-    }
-
+    // Note that MaxiCode reader effectively always assumes PURE_BARCODE mode
+    // and can't detect it in an image
+    BitMatrix bits = extractPureBits(image.getBlackMatrix());
+    DecoderResult decoderResult = decoder.decode(bits, hints);
     Result result = new Result(decoderResult.getText(), decoderResult.getRawBytes(), NO_POINTS, BarcodeFormat.MAXICODE);
 
     String ecLevel = decoderResult.getECLevel();
diff --git a/core/src/main/java/com/google/zxing/multi/GenericMultipleBarcodeReader.java b/core/src/main/java/com/google/zxing/multi/GenericMultipleBarcodeReader.java
index 101835d..5e53419 100644
--- a/core/src/main/java/com/google/zxing/multi/GenericMultipleBarcodeReader.java
+++ b/core/src/main/java/com/google/zxing/multi/GenericMultipleBarcodeReader.java
@@ -47,6 +47,8 @@
   private static final int MIN_DIMENSION_TO_RECUR = 100;
   private static final int MAX_DEPTH = 4;
 
+  static final Result[] EMPTY_RESULT_ARRAY = new Result[0];
+
   private final Reader delegate;
 
   public GenericMultipleBarcodeReader(Reader delegate) {
@@ -66,7 +68,7 @@
     if (results.isEmpty()) {
       throw NotFoundException.getNotFoundInstance();
     }
-    return results.toArray(new Result[results.size()]);
+    return results.toArray(EMPTY_RESULT_ARRAY);
   }
 
   private void doDecodeMultiple(BinaryBitmap image,
diff --git a/core/src/main/java/com/google/zxing/multi/qrcode/QRCodeMultiReader.java b/core/src/main/java/com/google/zxing/multi/qrcode/QRCodeMultiReader.java
index 49d3502..fb8f79d 100644
--- a/core/src/main/java/com/google/zxing/multi/qrcode/QRCodeMultiReader.java
+++ b/core/src/main/java/com/google/zxing/multi/qrcode/QRCodeMultiReader.java
@@ -92,7 +92,7 @@
       return EMPTY_RESULT_ARRAY;
     } else {
       results = processStructuredAppend(results);
-      return results.toArray(new Result[results.size()]);
+      return results.toArray(EMPTY_RESULT_ARRAY);
     }
   }
 
diff --git a/core/src/main/java/com/google/zxing/multi/qrcode/detector/MultiDetector.java b/core/src/main/java/com/google/zxing/multi/qrcode/detector/MultiDetector.java
index 9b24210..512b452 100644
--- a/core/src/main/java/com/google/zxing/multi/qrcode/detector/MultiDetector.java
+++ b/core/src/main/java/com/google/zxing/multi/qrcode/detector/MultiDetector.java
@@ -66,7 +66,7 @@
     if (result.isEmpty()) {
       return EMPTY_DETECTOR_RESULTS;
     } else {
-      return result.toArray(new DetectorResult[result.size()]);
+      return result.toArray(EMPTY_DETECTOR_RESULTS);
     }
   }
 
diff --git a/core/src/main/java/com/google/zxing/multi/qrcode/detector/MultiFinderPatternFinder.java b/core/src/main/java/com/google/zxing/multi/qrcode/detector/MultiFinderPatternFinder.java
index 0153f09..25f3626 100644
--- a/core/src/main/java/com/google/zxing/multi/qrcode/detector/MultiFinderPatternFinder.java
+++ b/core/src/main/java/com/google/zxing/multi/qrcode/detector/MultiFinderPatternFinder.java
@@ -49,6 +49,7 @@
 final class MultiFinderPatternFinder extends FinderPatternFinder {
 
   private static final FinderPatternInfo[] EMPTY_RESULT_ARRAY = new FinderPatternInfo[0];
+  private static final FinderPattern[][] EMPTY_FP_2D_ARRAY = new FinderPattern[0][];
 
   // TODO MIN_MODULE_COUNT and MAX_MODULE_COUNT would be great hints to ask the user for
   // since it limits the number of regions to decode
@@ -216,12 +217,12 @@
 
           // All tests passed!
           results.add(test);
-        } // end iterate p3
-      } // end iterate p2
-    } // end iterate p1
+        }
+      }
+    }
 
     if (!results.isEmpty()) {
-      return results.toArray(new FinderPattern[results.size()][]);
+      return results.toArray(EMPTY_FP_2D_ARRAY);
     }
 
     // Nothing found!
@@ -279,7 +280,7 @@
 
       if (foundPatternCross(stateCount)) {
         handlePossibleCenter(stateCount, i, maxJ);
-      } // end if foundPatternCross
+      }
     } // for i=iSkip-1 ...
     FinderPattern[][] patternInfo = selectMutipleBestPatterns();
     List<FinderPatternInfo> result = new ArrayList<>();
@@ -291,7 +292,7 @@
     if (result.isEmpty()) {
       return EMPTY_RESULT_ARRAY;
     } else {
-      return result.toArray(new FinderPatternInfo[result.size()]);
+      return result.toArray(EMPTY_RESULT_ARRAY);
     }
   }
 
diff --git a/core/src/main/java/com/google/zxing/oned/MultiFormatOneDReader.java b/core/src/main/java/com/google/zxing/oned/MultiFormatOneDReader.java
index b2fc6ae..fd25f63 100644
--- a/core/src/main/java/com/google/zxing/oned/MultiFormatOneDReader.java
+++ b/core/src/main/java/com/google/zxing/oned/MultiFormatOneDReader.java
@@ -36,6 +36,8 @@
  */
 public final class MultiFormatOneDReader extends OneDReader {
 
+  private static final OneDReader[] EMPTY_ONED_ARRAY = new OneDReader[0];
+
   private final OneDReader[] readers;
 
   public MultiFormatOneDReader(Map<DecodeHintType,?> hints) {
@@ -84,7 +86,7 @@
       readers.add(new RSS14Reader());
       readers.add(new RSSExpandedReader());
     }
-    this.readers = readers.toArray(new OneDReader[readers.size()]);
+    this.readers = readers.toArray(EMPTY_ONED_ARRAY);
   }
 
   @Override
diff --git a/core/src/main/java/com/google/zxing/oned/MultiFormatUPCEANReader.java b/core/src/main/java/com/google/zxing/oned/MultiFormatUPCEANReader.java
index 0d1c248..d676857 100644
--- a/core/src/main/java/com/google/zxing/oned/MultiFormatUPCEANReader.java
+++ b/core/src/main/java/com/google/zxing/oned/MultiFormatUPCEANReader.java
@@ -37,6 +37,8 @@
  */
 public final class MultiFormatUPCEANReader extends OneDReader {
 
+  private static final UPCEANReader[] EMPTY_READER_ARRAY = new UPCEANReader[0];
+
   private final UPCEANReader[] readers;
 
   public MultiFormatUPCEANReader(Map<DecodeHintType,?> hints) {
@@ -63,7 +65,7 @@
       readers.add(new EAN8Reader());
       readers.add(new UPCEReader());
     }
-    this.readers = readers.toArray(new UPCEANReader[readers.size()]);
+    this.readers = readers.toArray(EMPTY_READER_ARRAY);
   }
 
   @Override
diff --git a/core/src/main/java/com/google/zxing/pdf417/PDF417Reader.java b/core/src/main/java/com/google/zxing/pdf417/PDF417Reader.java
index c0eeb28..ab67ff6 100644
--- a/core/src/main/java/com/google/zxing/pdf417/PDF417Reader.java
+++ b/core/src/main/java/com/google/zxing/pdf417/PDF417Reader.java
@@ -43,6 +43,8 @@
  */
 public final class PDF417Reader implements Reader, MultipleBarcodeReader {
 
+  private static final Result[] EMPTY_RESULT_ARRAY = new Result[0];
+
   /**
    * Locates and decodes a PDF417 code in an image.
    *
@@ -94,7 +96,7 @@
       }
       results.add(result);
     }
-    return results.toArray(new Result[results.size()]);
+    return results.toArray(EMPTY_RESULT_ARRAY);
   }
 
   private static int getMaxWidth(ResultPoint p1, ResultPoint p2) {
diff --git a/core/src/main/java/com/google/zxing/pdf417/decoder/PDF417ScanningDecoder.java b/core/src/main/java/com/google/zxing/pdf417/decoder/PDF417ScanningDecoder.java
index 494a40b..aca24e7 100644
--- a/core/src/main/java/com/google/zxing/pdf417/decoder/PDF417ScanningDecoder.java
+++ b/core/src/main/java/com/google/zxing/pdf417/decoder/PDF417ScanningDecoder.java
@@ -256,7 +256,7 @@
     Collection<Integer> erasures = new ArrayList<>();
     int[] codewords = new int[detectionResult.getBarcodeRowCount() * detectionResult.getBarcodeColumnCount()];
     List<int[]> ambiguousIndexValuesList = new ArrayList<>();
-    List<Integer> ambiguousIndexesList = new ArrayList<>();
+    Collection<Integer> ambiguousIndexesList = new ArrayList<>();
     for (int row = 0; row < detectionResult.getBarcodeRowCount(); row++) {
       for (int column = 0; column < detectionResult.getBarcodeColumnCount(); column++) {
         int[] values = barcodeMatrix[row][column + 1].getValue();
diff --git a/core/src/test/java/com/google/zxing/multi/qrcode/MultiQRCodeTestCase.java b/core/src/test/java/com/google/zxing/multi/qrcode/MultiQRCodeTestCase.java
index 7ef2286..5cd14c7 100644
--- a/core/src/test/java/com/google/zxing/multi/qrcode/MultiQRCodeTestCase.java
+++ b/core/src/test/java/com/google/zxing/multi/qrcode/MultiQRCodeTestCase.java
@@ -19,9 +19,9 @@
 import javax.imageio.ImageIO;
 import java.awt.image.BufferedImage;
 import java.nio.file.Path;
+import java.util.Collection;
 import java.util.HashSet;
 import java.util.Map;
-import java.util.Set;
 
 import com.google.zxing.BarcodeFormat;
 import com.google.zxing.BinaryBitmap;
@@ -55,14 +55,14 @@
     assertNotNull(results);
     assertEquals(4, results.length);
 
-    Set<String> barcodeContents = new HashSet<>();
+    Collection<String> barcodeContents = new HashSet<>();
     for (Result result : results) {
       barcodeContents.add(result.getText());
       assertEquals(BarcodeFormat.QR_CODE, result.getBarcodeFormat());
       Map<ResultMetadataType,Object> metadata = result.getResultMetadata();
       assertNotNull(metadata);
     }
-    Set<String> expectedContents = new HashSet<>();
+    Collection<String> expectedContents = new HashSet<>();
     expectedContents.add("You earned the class a 5 MINUTE DANCE PARTY!!  Awesome!  Way to go!  Let's boogie!");
     expectedContents.add("You earned the class 5 EXTRA MINUTES OF RECESS!!  Fabulous!!  Way to go!!");
     expectedContents.add("You get to SIT AT MRS. SIGMON'S DESK FOR A DAY!!  Awesome!!  Way to go!! Guess I better clean up! :)");
diff --git a/javase/src/main/java/com/google/zxing/client/j2se/CommandLineRunner.java b/javase/src/main/java/com/google/zxing/client/j2se/CommandLineRunner.java
index c59916c..388747d 100644
--- a/javase/src/main/java/com/google/zxing/client/j2se/CommandLineRunner.java
+++ b/javase/src/main/java/com/google/zxing/client/j2se/CommandLineRunner.java
@@ -105,7 +105,7 @@
     }
   }
 
-  private static List<URI> expand(List<URI> inputs) throws IOException {
+  private static List<URI> expand(Iterable<URI> inputs) throws IOException {
     List<URI> expanded = new ArrayList<>();
     for (URI input : inputs) {
       if (isFileOrDir(input)) {
@@ -132,7 +132,7 @@
     return expanded;
   }
 
-  private static List<URI> retainValid(List<URI> inputs, boolean recursive) {
+  private static List<URI> retainValid(Iterable<URI> inputs, boolean recursive) {
     List<URI> retained = new ArrayList<>();
     for (URI input : inputs) {
       boolean retain;
@@ -151,7 +151,7 @@
     return retained;
   }
 
-  private static boolean isExpandable(List<URI> inputs) {
+  private static boolean isExpandable(Iterable<URI> inputs) {
     for (URI input : inputs) {
       if (isFileOrDir(input) && Files.isDirectory(Paths.get(input))) {
         return true;
diff --git a/zxing.appspot.com/src/main/java/com/google/zxing/web/generator/client/GeoLocationGenerator.java b/zxing.appspot.com/src/main/java/com/google/zxing/web/generator/client/GeoLocationGenerator.java
index fde3228..94d78c2 100644
--- a/zxing.appspot.com/src/main/java/com/google/zxing/web/generator/client/GeoLocationGenerator.java
+++ b/zxing.appspot.com/src/main/java/com/google/zxing/web/generator/client/GeoLocationGenerator.java
@@ -30,8 +30,8 @@
  */
 public final class GeoLocationGenerator implements GeneratorSource {
 
-  private static final String LON_REGEXP = "[+-]?[0-9]+(.[0-9]+)?";
-  private static final String LAT_REGEXP = "[+-]?[0-9]+(.[0-9]+)?";
+  private static final String LON_REGEXP = "[+-]?[0-9]+(?:.[0-9]+)?";
+  private static final String LAT_REGEXP = "[+-]?[0-9]+(?:.[0-9]+)?";
   
   private Grid table;
   private final TextBox latitude = new TextBox();
diff --git a/zxingorg/src/main/java/com/google/zxing/web/DecodeServlet.java b/zxingorg/src/main/java/com/google/zxing/web/DecodeServlet.java
index 07086f3..3926389 100644
--- a/zxingorg/src/main/java/com/google/zxing/web/DecodeServlet.java
+++ b/zxingorg/src/main/java/com/google/zxing/web/DecodeServlet.java
@@ -109,7 +109,7 @@
     HINTS_PURE.put(DecodeHintType.PURE_BARCODE, Boolean.TRUE);
   }
 
-  private Iterable<String> blockedURLSubstrings;
+  private Collection<String> blockedURLSubstrings;
   private Timer timer;
   private DoSTracker destHostTracker;
 
@@ -155,11 +155,14 @@
 
     // Remove any whitespace to sanitize; none is valid anyway
     imageURIString = WHITESPACE.matcher(imageURIString).replaceAll("");
-    for (CharSequence substring : blockedURLSubstrings) {
-      if (imageURIString.contains(substring)) {
-        log.info("Disallowed URI " + imageURIString);
-        errorResponse(request, response, "badurl");
-        return;
+
+    if (!blockedURLSubstrings.isEmpty()) {
+      for (CharSequence substring : blockedURLSubstrings) {
+        if (imageURIString.contains(substring)) {
+          log.info("Disallowed URI " + imageURIString);
+          errorResponse(request, response, "badurl");
+          return;
+        }
       }
     }
 
@@ -198,6 +201,11 @@
       }
       return;
     }
+
+    if (destHostTracker.isBanned(imageURI.getHost())) {
+      errorResponse(request, response, "badurl");
+      return;
+    }
     
     URL imageURL;    
     try {
@@ -215,12 +223,6 @@
       return;
     }
 
-    if (destHostTracker.isBanned(imageURL.getHost())) {
-      log.info("Temporarily not requesting from host: " + imageURIString);
-      errorResponse(request, response, "badurl");
-      return;
-    }
-
     HttpURLConnection connection;
     try {
       connection = (HttpURLConnection) imageURL.openConnection();
diff --git a/zxingorg/src/test/java/com/google/zxing/web/DoSFilterTestCase.java b/zxingorg/src/test/java/com/google/zxing/web/DoSFilterTestCase.java
index 3fb4b72..1e5f488 100644
--- a/zxingorg/src/test/java/com/google/zxing/web/DoSFilterTestCase.java
+++ b/zxingorg/src/test/java/com/google/zxing/web/DoSFilterTestCase.java
@@ -34,7 +34,7 @@
     MockHttpServletRequest request = new MockHttpServletRequest();
     request.setRequestURI("/");
     request.setRemoteAddr("1.2.3.4");
-    MockHttpServletResponse response = new MockHttpServletResponse();
+    HttpServletResponse response = new MockHttpServletResponse();
     DoSFilter filter = new DoSFilter();
     filter.init(null);
     for (int i = 0; i < DoSFilter.MAX_ACCESS_PER_TIME; i++) {
diff --git a/zxingorg/src/test/java/com/google/zxing/web/LRUMapTestCase.java b/zxingorg/src/test/java/com/google/zxing/web/LRUMapTestCase.java
index af4f02c..02edfb5 100644
--- a/zxingorg/src/test/java/com/google/zxing/web/LRUMapTestCase.java
+++ b/zxingorg/src/test/java/com/google/zxing/web/LRUMapTestCase.java
@@ -19,6 +19,8 @@
 import org.junit.Assert;
 import org.junit.Test;
 
+import java.util.Map;
+
 /**
  * Tests {@link LRUMap}.
  */
@@ -26,7 +28,7 @@
 
   @Test
   public void testLRU() {
-    LRUMap<String,String> map = new LRUMap<>(2);
+    Map<String,String> map = new LRUMap<>(2);
     map.put("foo", "bar");
     map.put("bar", "baz");
     assertEquals("bar", map.get("foo"));
diff --git a/zxingorg/src/test/java/com/google/zxing/web/WelcomeFilterTestCase.java b/zxingorg/src/test/java/com/google/zxing/web/WelcomeFilterTestCase.java
index 94b8d0e..0f62fce 100644
--- a/zxingorg/src/test/java/com/google/zxing/web/WelcomeFilterTestCase.java
+++ b/zxingorg/src/test/java/com/google/zxing/web/WelcomeFilterTestCase.java
@@ -23,6 +23,7 @@
 import org.springframework.mock.web.MockHttpServletRequest;
 import org.springframework.mock.web.MockHttpServletResponse;
 
+import javax.servlet.FilterChain;
 import javax.servlet.http.HttpServletResponse;
 
 /**
@@ -34,8 +35,8 @@
   public void testRedirect() {
     MockHttpServletRequest request = new MockHttpServletRequest();
     request.setRequestURI("/");
-    MockHttpServletResponse response = new MockHttpServletResponse();
-    MockFilterChain chain = new MockFilterChain();
+    HttpServletResponse response = new MockHttpServletResponse();
+    FilterChain chain = new MockFilterChain();
     new WelcomeFilter().doFilter(request, response, chain);
     assertEquals(HttpServletResponse.SC_MOVED_PERMANENTLY, response.getStatus());
     assertEquals("/w/decode.jspx", response.getHeader(HttpHeaders.LOCATION));