boolean ParseNextKey() {
			// 1. set current_
			current_ = NextEntryOffset();
			int p = current_;
			int limit = restarts_; // Restarts come right after data
			if (p >= limit) {
				// No more entries to return. Mark as invalid.
				current_ = restarts_;
				restart_index_ = num_restarts_;
				return false;
			}

			// 2. Decode next entry
			int shared, non_shared, value_length;
			threeInt l3ints = new threeInt();
			ByteCollection lbcol = new ByteCollection(data_, 0);
			// p.curr_pos is updated to nonshared data
			boolean OK = DecodeEntry(lbcol, p, limit, l3ints);
			shared = l3ints.shared;
			non_shared = l3ints.non_shared;
			value_length = l3ints.value_length;

			if (!OK || key_.size() < shared) {
				CorruptionError();
				return false;
			} else {
				// need to truncate to get shared part
				byte[] key_data = key_.data();
				// key_data = util.head(key_data, shared);
				//
				// byte[] key_add = new byte[non_shared];// I am not sure
				// whether
				// // byte concat is right
				// System.arraycopy(lbcol.bytes, lbcol.curr_pos, key_add, 0,
				// non_shared);
				//
				// key_data = util.add(key_data, key_add); // concat key_ with
				// // non-shared data
				byte[] key_data_ = new byte[shared + non_shared];
				// truncate the first #shared# bytes
				System.arraycopy(key_data, 0, key_data_, 0, shared);
				// get the #non_shared# from back end
				System.arraycopy(lbcol.bytes, lbcol.curr_pos, key_data_,
						shared, non_shared);
				key_ = new Slice(key_data_);
				// skip #non_shared# bytes and get value data
				value_ = new Slice(lbcol.bytes, lbcol.curr_pos + non_shared,
						value_length);
				// always not into the loop
				while (restart_index_ + 1 < num_restarts_
						&& GetRestartPoint(restart_index_ + 1) < current_) {
					++restart_index_;
				}
				return true;
			}
		}