static QueryParams fromQueryString(@Nullable String queryString, int maxParams,
                                       boolean semicolonAsSeparator) {
        if (Strings.isNullOrEmpty(queryString)) {
            return of();
        }

        try (TemporaryThreadLocals tempThreadLocals = TemporaryThreadLocals.acquire()) {
            return QueryStringDecoder.decodeParams(tempThreadLocals,
                                                   queryString, maxParams, semicolonAsSeparator);
        }
    }
Decodes the specified query string into a {@link QueryParams}, as defined in
<a href="https://www.w3.org/TR/2014/REC-html5-20141028/forms.html#url-encoded-form-data">4.10.22.6,
HTML5 W3C Recommendation</a>.

@param queryString the query string without leading question mark ({@code '?'}).
@param maxParams   the max number of parameters to decode. If the {@code queryString} contains
                   more parameters than this value, the extra parameters will not be decoded.
@param semicolonAsSeparator whether to treat a semicolon ({@code ';'}) as a separator as well as
                            an ampersand ({@code '&'}). Note that HTML5 expects you to use only
                            ampersand as a separator. Enable this flag only when you need to
                            interop with a legacy system.
@return the decoded {@link QueryParams}. An empty {@link QueryParams} is returned
        if {@code queryString} is {@code null}.
core/src/main/java/com/linecorp/armeria/common/QueryParams.java