class CMapManager
{
    private static final Map<String, CMap> CMAP_CACHE = new ConcurrentHashMap<>();

    private CMapManager()
    {
    }

    /**
     * Fetches the predefined CMap from disk (or cache).
     *
     * @param cMapName CMap name
     * @return The predefined CMap, never null.
     * @throws IOException 
     */
    public static CMap getPredefinedCMap(String cMapName) throws IOException
    {
        CMap cmap = CMAP_CACHE.get(cMapName);
        if (cmap != null)
        {
            return cmap;
        }

        CMap targetCmap = new CMapParser().parsePredefined(cMapName);

        // limit the cache to predefined CMaps
        CMAP_CACHE.put(targetCmap.getName(), targetCmap);
        return targetCmap;
    }

    /**
     * Parse the given CMap.
     *
     * @param randomAccessRead the source of the CMap to be read
     * @return the parsed CMap
     */
    public static CMap parseCMap(RandomAccessRead randomAccessRead) throws IOException
    {<FILL_FUNCTION_BODY>}
}

        CMap targetCmap = null;
        if (randomAccessRead != null)
        {
            targetCmap = new CMapParser().parse(randomAccessRead);
        }
        return targetCmap;
    
<no_super_class>