public IndexResolution resolveIndex(final int index, final boolean fallLeftOnBoundaries) {
        checkIndex(index, "Index");
        if (fallLeftOnBoundaries && index==0) {
            /* If falling to left at index 0, then we miss the first component completely. This is
             * not useful in practice!
             */
            return null;
        }
        
        /* Search for the slice containing this index. We'll search from the index of the last
         * successful call to here (0 on first call) since most calls to this method are made on
         * indices quite close together.
         */
        IndexResolution result = null;
        Slice mapping;
        int sliceIndex = lastResolvedSliceIndex;
        int numSlices = scoreBoard.size();
        while (sliceIndex>=0 && sliceIndex<numSlices) {
            mapping = scoreBoard.get(sliceIndex);
            if (mapping.startIndex>index) {
                /* We're too far to the right, so let's go back one place. */
                sliceIndex--;
            }
            else if (index<mapping.endIndex || (fallLeftOnBoundaries && index==mapping.endIndex)) {
                /* Success! */
                result = new IndexResolution(sliceIndex, mapping, index + mapping.componentIndexOffset);
                break;
            }
            else {
                /* Move to the right */
                sliceIndex++;
            }
        }
        lastResolvedSliceIndex = result!=null ? sliceIndex : lastResolvedSliceIndex;
        return result;
    }