
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
<html xml:lang="en" lang="en">
    <!-- this is a JXR report set (jdk8) -->
    <head>
        <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
        <title>Apache NetBeans Maven Utilities - NBM Plugins Utilities 1.3-SNAPSHOT Reference</title>
        <script type="text/javascript">
            tmpTargetPage = "" + window.location.search;
            if (tmpTargetPage != "" && tmpTargetPage != "undefined")
                tmpTargetPage = tmpTargetPage.substring(1);
            if (tmpTargetPage.indexOf(":") != -1 || (tmpTargetPage != "" && !validURL(tmpTargetPage)))
                tmpTargetPage = "undefined";
            targetPage = tmpTargetPage;
            function validURL(url) {
                try {
                    url = decodeURIComponent(url);
                }
                catch (error) {
                    return false;
                }
                var pos = url.indexOf(".html");
                if (pos == -1 || pos != url.length - 5)
                    return false;
                var allowNumber = false;
                var allowSep = false;
                var seenDot = false;
                for (var i = 0; i < url.length - 5; i++) {
                    var ch = url.charAt(i);
                    if ('a' <= ch && ch <= 'z' ||
                            'A' <= ch && ch <= 'Z' ||
                            ch == '$' ||
                            ch == '_' ||
                            ch.charCodeAt(0) > 127) {
                        allowNumber = true;
                        allowSep = true;
                    } else if ('0' <= ch && ch <= '9'
                            || ch == '-') {
                        if (!allowNumber)
                            return false;
                    } else if (ch == '/' || ch == '.') {
                        if (!allowSep)
                            return false;
                        allowNumber = false;
                        allowSep = false;
                        if (ch == '.')
                            seenDot = true;
                        if (ch == '/' && seenDot)
                            return false;
                    } else {
                        return false;
                    }
                }
                return true;
            }
            function loadFrames() {
                if (targetPage != "" && targetPage != "undefined")
                    top.classFrame.location = top.targetPage;
            }
        </script>
    </head>
    <frameset cols="20%,80%" title="Documentation frame" onload="top.loadFrames()">
        <frameset rows="30%,70%" title="Left frames" onload="top.loadFrames()">
            <frame src="overview-frame.html" name="packageListFrame" title="All Packages"/>
            <frame src="allclasses-frame.html" name="packageFrame" title="All classes and interfaces (except non-static nested types)"/>
        </frameset>
        <frame src="overview-summary.html" name="classFrame" title="Package, class and interface descriptions" scrolling="yes"/>
        <noframes>
            <h1>Frame Alert</h1>
            <p>
                You don't have frames. Go <a href="overview-summary.html">here</a>
            </p>
        </noframes>
    </frameset>
</html>
