@Nonnull
    public ImmutableUserAgent parse(MutableUserAgent inputUserAgent) {
        if (inputUserAgent == null) {
            return new ImmutableUserAgent(matchMaker.parse(new MutableUserAgent((String) null)));
        }

        // So we parse the User-Agent header normally
        MutableUserAgent userAgent = matchMaker.parse(inputUserAgent);

        Map<String, String> requestHeaders = inputUserAgent.getHeaders();
        if (requestHeaders.size() > 1) {
            // Then we check to see what ClientHints are available
            ClientHints clientHints = clientHintsAnalyzer.parse(requestHeaders);

            // Lastly we modify the parsed userAgent with the found clientHints
            userAgent = clientHintsAnalyzer.merge(this, userAgent, clientHints);
        }
        userAgent = matchMaker.hardCodedPostProcessing(userAgent);
        return new ImmutableUserAgent(userAgent);
    }
Parses and analyzes the useragent string provided in the MutableUserAgent instance.
NOTE: This method is internally synchronized because the way the analyzer works is not reentrant.
@param inputUserAgent The MutableUserAgent instance that is to be parsed and that gets all results
@return An ImmutableUserAgent copy of the results that is suitable for further usage and caching.
analyzer/src/main/java/nl/basjes/parse/useragent/AbstractUserAgentAnalyzerDirect.java