cloneCache(options) {
            const theTile = options.tile;
            const cacheKey = options.copyTargetKey;
            const cacheRecord = this._cachesLoaded[cacheKey] || this._zombiesLoaded[cacheKey];
            $.console.assert(cacheRecord, "[TileCache.cloneCache] attempt to clone non-existent cache %s!", cacheKey);
            $.console.assert(!this._cachesLoaded[options.newCacheKey],
                "[TileCache.cloneCache] attempt to copy clone to existing cache %s!", options.newCacheKey);

            const desiredType = options.desiredType || undefined;
            return cacheRecord.getDataAs(desiredType, true).then(data => {
                let newRecord = this._cachesLoaded[options.newCacheKey] = new $.CacheRecord();
                newRecord.addTile(theTile, data, cacheRecord.type);
                this._cachesLoadedCount++;
                this._freeOldRecordRoutine(theTile, options.cutoff || 0);
                return newRecord;
            });
        }
Reads a cache if it exists and creates a new copy of a target, different cache if it does not
@param {Object} options
@param {OpenSeadragon.Tile} options.tile - The tile to own ot add record for the cache.
@param {String} options.copyTargetKey - The unique key used to identify this tile in the cache.
@param {String} options.newCacheKey - The unique key the copy will be created for.
@param {String} [options.desiredType=undefined] - For optimization purposes, the desired type. Can
  be ignored.
@param {Number} [options.cutoff=0] - If adding this tile goes over the cache max count, this
  function will release an old tile. The cutoff option specifies a tile level at or below which
  tiles will not be released.
@returns {OpenSeadragon.Promise<OpenSeadragon.CacheRecord>} - New record.
@private