decode(image, hints) {
			try {
				return this.doDecode(image, hints);
			}
			catch (nfe) {
				const tryHarder = hints && (hints.get(DecodeHintType$1.TRY_HARDER) === true);
				if (tryHarder && image.isRotateSupported()) {
					const rotatedImage = image.rotateCounterClockwise();
					const result = this.doDecode(rotatedImage, hints);
					// Record that we found it rotated 90 degrees CCW / 270 degrees CW
					const metadata = result.getResultMetadata();
					let orientation = 270;
					if (metadata !== null && (metadata.get(ResultMetadataType$1.ORIENTATION) === true)) {
						// But if we found it reversed in doDecode(), add in that result here:
						orientation = (orientation + metadata.get(ResultMetadataType$1.ORIENTATION) % 360);
					}
					result.putMetadata(ResultMetadataType$1.ORIENTATION, orientation);
					// Update result points
					const points = result.getResultPoints();
					if (points !== null) {
						const height = rotatedImage.getHeight();
						for (let i = 0; i < points.length; i++) {
							points[i] = new ResultPoint(height - points[i].getY() - 1, points[i].getX());
						}
					}
					return result;
				}
				else {
					throw new NotFoundException();
				}
			}
		}
Encapsulates functionality and implementation that is common to all families
of one-dimensional barcodes.

@author dswitkin@google.com (Daniel Switkin)
@author Sean Owen