// Path: src/main/java/org/embulk/parser/poi_excel/visitor/util/MergedRegionFinder.java
// public interface MergedRegionFinder {
// 
// 	public CellRangeAddress get(Sheet sheet, int rowIndex, int columnIndex);
// }
// 
// Path: src/main/java/org/embulk/parser/poi_excel/visitor/util/MergedRegionList.java
// public class MergedRegionList implements MergedRegionFinder {
// 
// 	@Override
// 	public CellRangeAddress get(Sheet sheet, int rowIndex, int columnIndex) {
// 		int size = sheet.getNumMergedRegions();
// 		for (int i = 0; i < size; i++) {
// 			CellRangeAddress region = sheet.getMergedRegion(i);
// 			if (region.isInRange(rowIndex, columnIndex)) {
// 				return region;
// 			}
// 		}
// 
// 		return null;
// 	}
// }
// 
// Path: src/main/java/org/embulk/parser/poi_excel/visitor/util/MergedRegionMap.java
// public abstract class MergedRegionMap implements MergedRegionFinder {
// 
// 	private final Map<Sheet, Map<Integer, Map<Integer, CellRangeAddress>>> sheetMap = new ConcurrentHashMap<>();
// 
// 	@Override
// 	public CellRangeAddress get(Sheet sheet, int rowIndex, int columnIndex) {
// 		Map<Integer, Map<Integer, CellRangeAddress>> rowMap = sheetMap.get(sheet);
// 		if (rowMap == null) {
// 			synchronized (sheet) {
// 				rowMap = createRowMap(sheet);
// 				sheetMap.put(sheet, rowMap);
// 			}
// 		}
// 
// 		Map<Integer, CellRangeAddress> columnMap = rowMap.get(rowIndex);
// 		if (columnMap == null) {
// 			return null;
// 		}
// 		return columnMap.get(columnIndex);
// 	}
// 
// 	protected Map<Integer, Map<Integer, CellRangeAddress>> createRowMap(Sheet sheet) {
// 		Map<Integer, Map<Integer, CellRangeAddress>> rowMap = newRowMap();
// 
// 		for (int i = sheet.getNumMergedRegions() - 1; i >= 0; i--) {
// 			CellRangeAddress region = sheet.getMergedRegion(i);
// 
// 			for (int r = region.getFirstRow(); r <= region.getLastRow(); r++) {
// 				Map<Integer, CellRangeAddress> columnMap = rowMap.get(r);
// 				if (columnMap == null) {
// 					columnMap = newColumnMap();
// 					rowMap.put(r, columnMap);
// 				}
// 
// 				for (int c = region.getFirstColumn(); c <= region.getLastColumn(); c++) {
// 					columnMap.put(c, region);
// 				}
// 			}
// 		}
// 
// 		return rowMap;
// 	}
// 
// 	protected abstract Map<Integer, Map<Integer, CellRangeAddress>> newRowMap();
// 
// 	protected abstract Map<Integer, CellRangeAddress> newColumnMap();
// }
// 
// Path: src/main/java/org/embulk/parser/poi_excel/visitor/util/MergedRegionNothing.java
// public class MergedRegionNothing implements MergedRegionFinder {
// 
// 	@Override
// 	public CellRangeAddress get(Sheet sheet, int rowIndex, int columnIndex) {
// 		return null;
// 	}
// }


import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
import org.apache.poi.ss.util.CellRangeAddress;
import org.embulk.parser.poi_excel.visitor.util.MergedRegionFinder;
import org.embulk.parser.poi_excel.visitor.util.MergedRegionList;
import org.embulk.parser.poi_excel.visitor.util.MergedRegionMap;
import org.embulk.parser.poi_excel.visitor.util.MergedRegionNothing;

package org.embulk.parser.poi_excel.bean.util;



public enum SearchMergedCell {
	NONE {
		@Override
		public MergedRegionFinder createMergedRegionFinder() {
			return new MergedRegionNothing();
		}
	},
	LINEAR_SEARCH {
		@Override
		public MergedRegionFinder createMergedRegionFinder() {

// Path: src/main/java/org/embulk/parser/poi_excel/visitor/util/MergedRegionFinder.java
// public interface MergedRegionFinder {
// 
// 	public CellRangeAddress get(Sheet sheet, int rowIndex, int columnIndex);
// }
// 
// Path: src/main/java/org/embulk/parser/poi_excel/visitor/util/MergedRegionList.java
// public class MergedRegionList implements MergedRegionFinder {
// 
// 	@Override
// 	public CellRangeAddress get(Sheet sheet, int rowIndex, int columnIndex) {
// 		int size = sheet.getNumMergedRegions();
// 		for (int i = 0; i < size; i++) {
// 			CellRangeAddress region = sheet.getMergedRegion(i);
// 			if (region.isInRange(rowIndex, columnIndex)) {
// 				return region;
// 			}
// 		}
// 
// 		return null;
// 	}
// }
// 
// Path: src/main/java/org/embulk/parser/poi_excel/visitor/util/MergedRegionMap.java
// public abstract class MergedRegionMap implements MergedRegionFinder {
// 
// 	private final Map<Sheet, Map<Integer, Map<Integer, CellRangeAddress>>> sheetMap = new ConcurrentHashMap<>();
// 
// 	@Override
// 	public CellRangeAddress get(Sheet sheet, int rowIndex, int columnIndex) {
// 		Map<Integer, Map<Integer, CellRangeAddress>> rowMap = sheetMap.get(sheet);
// 		if (rowMap == null) {
// 			synchronized (sheet) {
// 				rowMap = createRowMap(sheet);
// 				sheetMap.put(sheet, rowMap);
// 			}
// 		}
// 
// 		Map<Integer, CellRangeAddress> columnMap = rowMap.get(rowIndex);
// 		if (columnMap == null) {
// 			return null;
// 		}
// 		return columnMap.get(columnIndex);
// 	}
// 
// 	protected Map<Integer, Map<Integer, CellRangeAddress>> createRowMap(Sheet sheet) {
// 		Map<Integer, Map<Integer, CellRangeAddress>> rowMap = newRowMap();
// 
// 		for (int i = sheet.getNumMergedRegions() - 1; i >= 0; i--) {
// 			CellRangeAddress region = sheet.getMergedRegion(i);
// 
// 			for (int r = region.getFirstRow(); r <= region.getLastRow(); r++) {
// 				Map<Integer, CellRangeAddress> columnMap = rowMap.get(r);
// 				if (columnMap == null) {
// 					columnMap = newColumnMap();
// 					rowMap.put(r, columnMap);
// 				}
// 
// 				for (int c = region.getFirstColumn(); c <= region.getLastColumn(); c++) {
// 					columnMap.put(c, region);
// 				}
// 			}
// 		}
// 
// 		return rowMap;
// 	}
// 
// 	protected abstract Map<Integer, Map<Integer, CellRangeAddress>> newRowMap();
// 
// 	protected abstract Map<Integer, CellRangeAddress> newColumnMap();
// }
// 
// Path: src/main/java/org/embulk/parser/poi_excel/visitor/util/MergedRegionNothing.java
// public class MergedRegionNothing implements MergedRegionFinder {
// 
// 	@Override
// 	public CellRangeAddress get(Sheet sheet, int rowIndex, int columnIndex) {
// 		return null;
// 	}
// }


// Path: src/main/java/org/embulk/parser/poi_excel/bean/util/SearchMergedCell.java
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
import org.apache.poi.ss.util.CellRangeAddress;
import org.embulk.parser.poi_excel.visitor.util.MergedRegionFinder;
import org.embulk.parser.poi_excel.visitor.util.MergedRegionList;
import org.embulk.parser.poi_excel.visitor.util.MergedRegionMap;
import org.embulk.parser.poi_excel.visitor.util.MergedRegionNothing;

package org.embulk.parser.poi_excel.bean.util;



public enum SearchMergedCell {
	NONE {
		@Override
		public MergedRegionFinder createMergedRegionFinder() {
			return new MergedRegionNothing();
		}
	},
	LINEAR_SEARCH {
		@Override
		public MergedRegionFinder createMergedRegionFinder() {

			return new MergedRegionList();
