@Override
	public Iterator<BxTreeEntry> find(final int key, final boolean includeKey) {
		int size = getSize();
		if(size == 0) {
			return Utils.emptyIterator();
		}
		return new Iterator<BxTreeEntry>() {
			private LeafNode nextNode = LeafNode.this;
			private Iterator<BxTreeEntry> currentBaseIter = null;
			private BxTreeEntry val = getNext();
			
			@Override
			public boolean hasNext() {
				
				return val != null;
			}

			private BxTreeEntry getNext() {
				while(currentBaseIter == null || !currentBaseIter.hasNext()) {
					if(nextNode == null) {
						return null;
					}
					currentBaseIter = nextNode.baseFind(key, includeKey);
					int nextNodePage = nextNode.getLink();
					nextNode = nextNodePage == 0 ? null : new LeafNode(nextNodePage, bm);
				}
				return currentBaseIter.next();
			}

			@Override
			public BxTreeEntry next() {
				if(!hasNext()) {
					throw new IllegalStateException();
				}
				BxTreeEntry old = val;
				val = getNext();
				return old;
			}

			@Override
			public void remove() {
				throw new RuntimeException();
			}
		};
	}